ぐるっとぐりっど

日曜プログラマがいろいろ試してみたことを、後の自分のためにまとめておく場所

PaizaでSランクになったけど残念な気持ちになった

paizaという、プログラマ向けの転職サイトがある。はてブにもときどき開発ブログがホッテントリになってる*1から、見たことある人も多いと思う。そこで何ができるかというと、難易度別の問題があって、自分のコーディングスキルを測定し、それを元にスキルに見合った転職ができるよ!ということだ。今のところ転職する気はないけど、転職の気がない人も気軽に受けてみて、と書いてあったので、試してみた。

で、Sランクまで上がったけど、問題があまりにも簡単すぎてこれでSランクとは、これじゃあ全然差が出ないじゃん、と残念な感じだった。


以下蛇足です。

これ書いてる人の素性

google code jamにここ3年くらい参加して、予選は突破するけど、1回戦を勝ち抜けないヘボいプログラマ。贔屓目に見ても中の下ぐらいの実力だと思う(このブログの他のエントリを見ればお察し)。

paizaの問題について

一応、公称としては、下記のレベルになっている。

初級(Cランクまでの問題)
if,for,while,foreach,変数、配列、連想配列、文字列操作、ソートを使って指示通りのプログラムを書けるか。回答スピード、正確性が問われる。


中級(Bランクまでの問題)
指示通りにロジックを組むだけでなく、自分で効率的なロジックを考えだせるか。またツリー構造、探索等を使いアルゴリズムを組めるか。


上級(Sランクまでの問題)
O(n²)⇒O(n)の様な計算量、メモリの削減を意識した高度なアルゴリズムが組めるか。問題によっては数学的(確率計算)問題についても問う。

https://paiza.jp/guide/guide

これはすばらしい問題たちである!こんなん無料でスキルチェックできるなんて、なんてすばらしいサービスなんでしょう!!!

ちなみに、同ページに載っている情報では、Sランクが上位2%、Aランクで上位8%らしい。

実際やってみた

ということで、各ランクの問題をひとつずつやってみた。問題内容は書いちゃダメよと書いてあったので、それは律儀に守ることにする。

Dランクの問題 → for文が書ければOKだった

Cランクの問題 → if文とfor文が書ければOKだった


うんうん、確かに初級はこの辺が求められるらしい。B問題からはもっと難しくなるんだろう。


Bランクの問題 → if文とfor文が書ければOKだった

Aランクの問題 → if文とfor文が書ければOKだった

Sランクの問題 → if文とfor文が書ければOKだった

どういうこと!?


結果として、ifとforと配列しか書いてない。

一応単に解けるだけではだめで、効率性が求められることにはなっている(省メモリとか、計算時間とか)。
でも、そんなん一度たりとも引っかからず。。。(Google code jamとか、at coderとかだと、結構この辺の効率化がキモになってきて、よくそこでつまるのだけども。。)

問題文自体は、レベルが上がると何とかややこしくなってくるけど、それは日本語的にややこしいだけで、アルゴリズム的には、その辺の入門書よりよっぽど簡単なことしか求められてない。これで上位2%って言われてもむしろ困ってしまうね。これがSの問題です、と出されてもあまり、Aとの差を感じないというか。

一応実際paiza経由で面接する場合は、書いたソースコードが企業側に送られるので、解ければ良しの糞コードでは、その後の円満な展開には期待できないことにはなってるっぽい。

感想

コードを実際に書いて、それを元に転職活動できるって考えは面白いと思うけど、正直なところ現状の問題では、Sランクですって言うのって、TOEIC600点ですって言うのと変わらないのでは、って程度に感じる*2。CodeIQのように、コーディング以外の問題も出てくるなら良いけど、コーディング一本であれば、簡単な問題(というかレベル差が出ない問題)だけでは厳しいのでは。さすがに世間で求められる水準のマックスがこの程度、ということであれば寂しいことこの上無しだし。もっと正解率5%未満とかそういった問題をバンバンだしていって欲しい。ということで今後に期待してます。

蛇足に継ぐ蛇足

調べてみると、なんかBランクぐらいから難しくて解けないって言ってる人もいるにはいるっぽいんだよなぁ

*1:過剰なまでのSIerディスりだったり、突っ込み所満載だったり

*2:900点なら自慢できるし、積極的にアピールしていきたいけど、アピールにならないし、むしろ逆効果になる場合すら

Windowsでemacsを使う各手段とメリットデメリット

はじめに

windowsemacsを使おうとすると、これまでは、MeadowNTEmacsか、と思っていたけれども、最近gnupackのことも知って、そちらを使っている。そして、最近、Windows10のanniversary updateにより、Windows上でUbuntuが動作するようになり、そちらも候補として挙がってきた。そこで、今Windows上でemacsを使う手段と、それぞれのメリデリについてまとめてみた。

Meadow

昔はWindowsemacsとなると、MinGWとかCygwinとかでunixバイナリ動かすのを除けば、meadowxyzzyか、という気がするけど、公式ページも消滅しているので、もはや俎上に載ることはないでしょう。私もWindowsではじめて使ったのは、meadowなので思い入れとしては強い。

NTEmacs

http://ftp.gnu.org/pub/gnu/emacs/windows/

いわゆるWindowsEmacsMeadowから卒業した後使い出した。

メリット

  • Windowsバイナリなので、ダウンロードすればすぐ使える。
  • 本家が出しているので、リリースは早いはず
  • emacsに閉じた範囲では、困ったことはない

デメリット

  • IMEとの親和性が良くないらしい(ddskk使っていたので、あまり意識したことはない)。対応するにはパッチが必要だけど、適用済みのものもあるのかな。
  • c/migemoとか、他のアプリと組合せて便利にしようと考えると、Windowsのことも意識する必要がでてきて嵌まる場合がある。

↓嵌まった例
grugrut.hatenablog.jp

gnupack

https://osdn.jp/projects/gnupack/

cygwinとセットで展開されている。スクリプト等も用意されているので、ダウンロードして展開するだけですぐに使える。今はこちらに乗り換えている。

メリット

  • 展開するだけでemacsだけでなくcygwinも使える(gvimとかいう異教徒向けのものすら含まれている)
  • migemo等の設定もすんでいたり、IMEパッチも適用されているので、そのあたりで苦労することはない

デメリット

  • Cygwin上で動かしているのでcygwinの問題に引きずられてしまう(Doing Vfork: resource temporarily unavailable)。検索するといろいろ出るには出るけれども、解決には至っていない(すぐ再発する)。
  • ひとりの手で開発されているので、プロジェクト存続が気力しだいなのでは?

bash On Ubuntu On Windows

Windows10から、bashWindows上で使えるようになり、Xserverさえどうにかしてしまえば、ubuntu用のemacsを動かすこともできるらしい。デメリットの自分でビルドしないといけない問題を対処していないため、コマンドプロンプト上で、emacs -nwして動くところまでしか確認していない。

メリット

  • Cygwinよりは、nativeよりというか、Windowsが責任もってプロセスをforkしてくれると信じているので、NTEmacscygwinのいいとこどりができるのでは。
    • NTEmacsよりも外部プロセスとの連携がしやすく、gnupackのようなプロセス起動エラーがおきないというような

デメリット

まとめ

bashOnUbuntuOnWindowsに今後期待するとして、しばらくは、gnupackを使いつづけるのがよいのかな

Windowsのgnupackのemacsで、package.elを使って大きなelispをバージョンアップするとプロセスがダウンする問題

はじめに

gnupackでemacsを使っているんだけど、org-modeとか、helm-coreとか、yasnippetとか、比較的大きなパッケージを、package.elでバージョンアップ(package-list-packagesで、u→x)すると、なんか知らないけど、emacsがダウンしてしまう。どうせ既知の問題だろうと思って調べてみても何も出てこない。

現時点で解決してないけど、ひとまずmemo

環境

M-x emacs-versionした結果は以下の通り

GNU Emacs 24.5.1 (i686-pc-cygwin) of 2015-11-08 on gnupack

gnupackで独自ビルドしたと聞いているやつ

ためしたこと

直接起動すると、何もわからないままダウンしてしまうので、cygwinのターミナルから開いて再現させてみる。
→ Segmentation Fault 11と出る


core dumpを吐くように設定し、再現させてみる
gdbで開いてみるも、特に情報はなにも出ない


WinDbgで、emacsプロセスにアタッチして、再現させてみる
→ 以下のログが出た。が、よくわからない。。。

Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Module load completed but symbols could not be loaded for path\to\app\cygwin\emacs\bin\emacs.exe
emacs+0x72dda:
00472dda 8903            mov     dword ptr [ebx],eax  ds:002b:ffffffff=????????
0:000:x86> kbnL
 # ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
00 01d19c08 004f51d3 22dbccfc 01d19cc8 00000000 emacs+0x72dda
01 00000000 00000000 00000000 00000000 00000000 emacs+0xf51d3

エラーメッセージから、まずいとこおさわりしてしまっておまわりさんこいつです状態なように見える。
ただ、スタックバックトレース見ても、何もわからんちん状態。そもそもWinDbgやらgdbやらを使ったデバッグには慣れてないので、よくわからない。というか、そもそも解析には、pdbファイルのようなビルド時の情報が必要になるのではあるまいか?

想像と今後の方向

やはりバッファオーバーフローとか、そのへんで変なメモリ触っちゃって落とされた可能性が高いのではないかと想像している。
gnupackを使うまえは、nativeなw32バイナリ版のemacsを使ってたけど、そのときも結構yasnippetをバージョンアップしようとすると、too many open filesとか出てたし、ファイル数開きすぎとか、スタックオーバーフローとか、その辺が臭いような気がしているので、その辺をもっと調べてみよう。

もし、どなたか情報お持ちのかたは教えていただけると幸いです。

念願のHHKB Professional JPを手に入れたぞ!

久しぶりに高い買い物をしてしまった。それがこれ!

f:id:grugrut:20160417141313j:plain

言わずと知れたHappyHackingKeyboard Professional JPです。(すでにタイトルに書いているけど)。

HHKBはいくつか種類があるけど、大きくわければ、英語配列日本語配列か、メンブレンか静電容量か、その2×2の4パターンから選ぶことができる。僕は最初はHHKB初学者だし、ちょっと慣れてからProにしようと思って近くのビックカメラに向かったのだけど、LiteとProは打った感覚が全然違うね。好みは分かれると思うけど、やっぱりProのほうがいい感じ。ざっくりProが2万円、Liteが5千円という、およそ4倍の差がある中迷ったのだけど、きっと4倍出した価値はあるはず。あると信じたい。私信じてる。

見よ、このコンパクト感(HHKBならやっぱ白かなという思い込みの元、白を購入)。

f:id:grugrut:20160417141540j:plain


一般的にキーボード業界だと、東の横綱RealForce、西の横綱HHKBという構図が少なからずあると思う(相撲はよく知らないんで東と西に違いがあるのかどうかはわからないけど)。
そんな中HHKBの有する大きな特徴としては、コンパクトであることとCtrlはAの横、である(相撲の下りからすべて思い込み)。

このエントリが初HHKBでの入力している文章になるけども、やっぱり、慣れないところとしては、Delキーが存在しないことと、全角/半角キーが場所が違うということがあげられる。この辺は慣れの問題とはいえ、特に全角半角キーの位置は、癖で手を伸ばすとEscキーが待っているので、慣れるまでは難しそう。

ただ全角半角を切り替えずに文字をタッタカタッタカ入力している分には非常に打ちやすく、またタイピング速度も上がったような気がする(当社比)。

慣れすぎてほかのキーボードが使えなくなるのはちょっと怖いけど、これから使い込んでいこう。

yumでwordpressをインストールしたら嵌まった(nginx)

はじめに

はてなブログで、wordpressの話をしたってしょうがないんだけど、借りてるvpswordpressを入れてみた。CMSはほとんど使ったことがないので、勉強のためと、くだらないことを残していくように。

構成としては、nginx + mariadb + php = wordpress

mariadbじゃなくて、mysqlでよかったんだけど、yumで入るのがmariadbしかなかったので、どうせ一緒だろうということでmariadbにした。


現象

mariadb(mysql)の設定をして、ユーザを作って、nginxのバーチャルホストの設定をして、いざ突撃!!!ということで、URLにアクセスすると、MySQLへの接続設定画面がでてくる。↓の手順通り。

WordPress のインストール - WordPress Codex 日本語版

鼻歌交じりにmariadbに設定しておいたユーザ情報、パスワード等を入力して次の画面にいくと、

「インストール実行」

というボタンがでてくる。これをポチっとなと押すと、本来であれば今度はサイトの設定(タイトルや管理ユーザの設定)に移るはずなんだけど、なぜかDBの設定画面に戻ってしまう。何度やっても同じ。これエンドレスエイトなんじゃ、、、というところで、しょうがないので切り分けに乗り出す。

切り分け

DB接続設定は、実は設定ファイルを直接編集することもできる。

WordPress のインストール - WordPress Codex 日本語版

でもこれを直接設定してもどう見ても反映されているようには見えない。ここではたと気づく。

これ、nginxユーザで読めてないのでは

しらべてみると、yumで導入した場合は、wp-config.phpが、/etc/wordpress/wp-config.phpへのシンボリックリンクになっている。

ためしに、

sudo -u nginx less wp-config.php

としてみると、権限がなくて読めないと出てくる。そこで、/etc/wordpress/のパーミッションを確認してみると、、、

[root@localhost]# ls -ld wordpress/
drwxr-x--- 2 root apache 26  3月 20 16:08 wordpress/

お、おう。。。。勝手に依存でapache入ったうえに、設定がapacheを利用すること前提になってしまっている。これをnginxグループにchownして無事終了。

というわけでできたサイト

ぐるっとくりっぷ – Just another WordPress site

単に入れただけなので、今後整備していこう。

org-modeで割り込みにも対応した時間記録をとる方法

はじめに

みんな大好きorg-modeは、単なるアウトラインエディタとしての機能にとどまらず、メモ書き、表計算、タスク管理、その他もろもろに使えるすごいツールだけれども、僕はその中でも、時間管理もできることに魅力を感じていた。ただ、時間管理について簡単な説明はゴロゴロ転がっている中で、急な割り込み(電話がかかってきた、とか、誰かから相談を受けた、とか)に対するイケてる操作方法の紹介がなく、できないものとあきらめていた。

だがしかし

マニュアルだったり、チュートリアルをまじめに読んでいたら、イケてる感じの方法を見つけてしまったので、まとめておこうと思う。

org-mode界隈では(たぶん)有名な以下のドキュメントをもとに、さらっと流してるけどこれイケてんじゃんと思ったところを調査した結果をまとめたものなので、org-modeについて興味がある人は、以下のURLのドキュメントも一読してみることをお勧めします。

http://doc.norang.ca/org-mode.html

時間管理のおさらい

まずは、割り込みを考慮しない時間管理の方法をおさらいしておくと、基本的には、clock-inclock-outの二つのファンクションを使う。

使い方は簡単で、org-modeの開始するタスク(TODOキーワードをつけておく必要は無い)を示すノード上で、C-c C-x C-iと入力 (clock-in)。
すると、ノードに開始時間が自動で挿入され、モードライン(画面下の行)にも、clock-inしたタスク名と今までの計測時間が表示される。

f:id:grugrut:20160313082650p:plain

そして、終了するときや、いったん中断するときは、C-c C-x C-o (clock-out)。これは別にノード上で行う必要はなく、どこでもできる(はず)。
すると、ノードに終了時間と、その作業時間が自動で挿入される。超便利。

f:id:grugrut:20160313083551p:plain

clock-inは何度でもでき、やるたびに作業時間の行が増えていく。ほかにも、集計する機能とかいろいろとあるけど、今回は省略。

割り込みがあったら

で、ここからが本題。

予定調和で進んでいくタスクであれば、例えば、AA業務を開始したらclock-inして、ずっと集中してAA業務に取り組んで、終わったら、clock-outでまったく問題ない。

でも、実際そんなとんとん拍子に行くわけもなく、途中で電話がかかってくる、とか、チームメンバから「ちょっと相談が。。。」とくる、とか、そんなこんなで突発的に時間がつぶれることっていうのは多々ある。そんなこんなもできる限り記録に残しておいて、自分の作業時間や効率なんかを振り返れるようにしておきたい。

これに対応しようとすると、真面目に考えるとめんどくさい。

  1. 今やってるタスクをclock-outする
  2. 割り込まれる内容をタスク管理用のorgファイルに記載する
  3. 割り込まれた内容をclock-inする
  4. 割り込まれた内容に取り組む
  5. 割り込まれた内容が終わったらclock-outする
  6. もとのタスクをclock-inしなおして作業に戻る

このフローには、実はもう少し作業短縮できるところがあるけど、真面目にやるとこんな感じになってしまう。こんなん急な割り込みには対応できないよ。

賢い割り込みの記録方法

org-captureを使うと、このめんどくさいフローが簡単に解決する。まずは準備として、org-capture用のテンプレートに以下を加えておく。

(require 'org-capture)
(setq org-capture-templates
      '(
        ("i" "interrupted task" entry
         (file "~/org/diary.org")
         "* %?\n" :clock-in t :clock-resume t)
       ))

ショートカットキー「"i"の部分」や説明、保存するファイルとノード構成なんかは好みのものに変えてもらって、ポイントは:clock-in:clock-resume。これを設定しておくと、org-captureすると同時に割り込まれたタスクの計時が始まり、C-c C-cで保存すると同時に割り込まれたタスクのclock-outともとのタスクのclock-inが行われる。そのため、さっきのめんどくさいフローが以下で済む。

  1. 割り込みが入ったら、ひとまず、C-c cして、先ほど設定したキャプチャテンプレートを呼び出す(僕の例では、iを使うので、C-c c iとなる)
  2. 割り込まれた内容に取り組む
  3. 割り込まれた内容が終わったら、C-c C-cでorg-captureを保存する
  4. もとのタスクにそのまま戻る

たったこれだけ。org-captureしている間だけ、元のタスクの計時が止まるイメージととらえてもらえればよいのではないかと。

大きなポイントとしては、割り込まれた時に、org-capture(C-c c)までしておけばOkということ。割り込まれたタスクのメモは済んでから残せばよい。

デモ

よりイメージしやすくするため、実際の画面も出すとこんな感じになる。

AA業務をclock-inして(上の行の8:31のほうね)、タスクに取り組んでたら、「ちょっと教えてください」と相談を受ける。そこですかさずorg-capture(C-c c)。

f:id:grugrut:20160313083613p:plain

org-captureのテンプレートの中から、割り込み用のテンプレート「i」を選択する。
すると、画面が分割されて、org-captureの画面が出てくる。上側の画面を見てもらうと、先の画面では計時中だったAA業務がいったんclock-outされていることがわかる。

f:id:grugrut:20160313083725p:plain

そして相談が終わったら、必要に応じてメモを残して、保存(C-c C-c)。すると割り込まれたタスクがclock-outされ、時間の計算が行われ、もとのAA業務が再度clock-inされている。

f:id:grugrut:20160313085226p:plain

まとめ

org-captureのオプションを使うと、簡単に割り込まれたタスクの記録を残せることがわかった。今後の改良点としては、テンプレートの文字列を工夫(いちいちタイトルをつけなくても、あらかじめ、 * [割込]とつけておくとか、タグを設定しておくとか)すると、もっと便利になりそう。

また、org-captureのテンプレートにはもっとほかのオプションもありそうなので、また便利になる機能を見つけたら整理してまとめていきたい。

ほかにも、こんな対処で簡単に処理できるよ!というのがあればぜひ教えてください!(C-u C-c C-x C-iを使う案も考えたんだけど、どうなんでしょ)

エンジニアのための時間管理術

エンジニアのための時間管理術

Bootstrap3を使ってワインのテイスティング用のWebサービスを作ってみた

はじめに

最近更新がご無沙汰だけれども、別ブログに時々残している感じで、ワインの勉強をしていて、飲んだワインのテイスティングメモをちまちま残しているんだけれど、何を残しておくべきなのかの網羅性が担保できず、ついついそのとき印象に残ったワードだけが残って、全体の記録が残せなくなってしまう。

mezase-wine-expert.hatenablog.jp

そこで、各種参考書等を参考に、ワインエキスパート二次試験で求められる項目ベースで、ポチポチ該当するものをクリックするだけで、テイスティングコメントを残せるWebサービスを作ってみた。ついでに、Bootstrapを使って、簡単にデザインおよびレスポンシブデザイン対応してみた。そのページがこちら

Wineテイスティングメモエディタ

使い方

清澄度や輝きなどそれぞれの項目のうち該当するものをポチポチクリックする。「香り」だけは複数選択が可能。一通り選択が終わったら、コメント作成ボタンを押下すると、テイスティングコメントが作成されるので、あとはコピーして思いのまま。

コメント例

アプリ経由で投稿したのでちょっと余計な文言も追加されてしまっているけれど、こんな感じで、列挙できる

Bootstrapを使ってみてよかったところ

Bootstrap自体はドキュメントもそこそこ充実しているし、いろいろな人が使っているおかげで、困ったことがあってもググるとすぐに答えが出て、数時間で作成することができた。
特に、デザインを考えなくても、bootstrapのドキュメントを見つつ、適当に各タグにclassを設定していくと、それなりのデザインが作れるのはいいね

Bootstrapを使ってみてつらかったところ

今回Emacsのtramp経由で、全部手打ちで入力したので、class等いちいち入力するのが大変で疲れた。特に日本語の説明を大量に書いたときに、久しぶりに左小指を酷使しすぎて疲れた(skk使いのため)。

今後の展望

それぞれの項目の説明(例えばスイカズラは甘い香りとか)を表示して、入力を補助できるようにしたい。
そのためにも、テイスティング自体をもっともっと学ばなくては。

ワインテイスティングの基礎知識

ワインテイスティングの基礎知識