フツーって言うなぁ!

フツーなサラリーマンのフツーな嘆き.

Pythonで単方向連結リストを実装した

特に更新するようなこともないので,前に書いたコードを晒しておきます.

Pythonで単方向連結リストを実装しました.

といっても,連結リストは挿入,削除,要素の取得ぐらいができれば任意の処理が可能なので,どちらかと言うとPythonicなコードを心がけました.

gistaf03c4e31fc763cffec4

特に,特殊メソッドについては,今まで適当に使っていた部分が多かったので勉強になりました.

また,このコードでは,doctestというモジュールを使っています.

doctestでは,コメントにREPLっぽくコードを書き,プログラム*1を実行すると,その部分がテストとして実行され,期待される出力と比較されるようになっています.
このコードは正しい(はず)なので実行しても何も起こりませんが,期待されない出力がなされた場合にはアラートが表示されます.

あと,全然関係ないですが,最近,オライリーの「入門自然言語処理」を読み始めています.

入門 自然言語処理

入門 自然言語処理

まだ2章までしか読めていませんが,nltkを用いてのテキスト分類,機械学習の具体的な手法について記載されているようです.
Pythonの解説もそこそこ丁寧なので,思い出しながら読んでいけるような気がします.

*1:ここだとSinglyLinkedList.py

「オブジェクト指向JavaScript」を読んだ

現在,研究用のプログラムでフロントエンドにJavaScriptを扱っています.

JavaScript自体(jQuery含む)は何度か書いたことがあるのですが,正直,「動けばいい」ぐらいの気持ちで書いたものばかりで,しっかりと設計をしたことはありませんでした.

実際,JavaScriptについて書かれた本は数多くありますが,Webデザイナ向けの平易な本がほとんどで,JSの言語仕様やベストプラクティスなどに踏み込んだ本はそう多くないような気がします.
この機会に一度勉強しておこうと思っていたところで,図書館に下記の本があったので,これを読むことにしました.

オブジェクト指向JavaScript

オブジェクト指向JavaScript

簡単なメモ

1章

「イントロダクション」として,JSとオブジェクト指向についての説明が記載されている.

2章

JSのデータ構造,制御構造について書かれている.

多くは他の言語にもある仕様で,すでに知っていたが,"=="と"==="の違いや,"undefined"の扱い,変数宣言時に"var"をつける/つけないによって変数がローカル/グローバルになる,など,JS独特の言語仕様に驚くところも多々あった.

3章

関数についての内容.

「JSの関数はオブジェクトである」というところから,無名関数,自己実行可能関数,クロージャなど,「Webページを読んでいると見かけるけどよくわからない」ようなJSの文法についての説明があった.
「JSではスコープが関数単位で設定されている」というのが個人的には驚きだった*1
クロージャについては,一度読んだだけでは必要性を感じることが出来なかったので,もう一度勉強し直そうと思う.

4章

実際にJSでオブジェクトを生成するにはどうすればいいかについての記載.

JSではプロパティにアクセスすることでオブジェクト固有の値やメソッドにアクセスできるといった話や,コンストラクタ関数とnewキーワードによってユーザ定義のオブジェクトを生成することができるといった話があった.

「JSはプロトタイプベースのオブジェクト指向言語」ということは知識として知っていたが,実際に言語仕様を見てみると,クラスベースの言語との違いに戸惑った.

5章

プロトタイプについての話.

JSの関数オブジェクトには,オブジェクト自身のプロパティとは別に,「prototype」と呼ばれるプロパティを持っており,オブジェクトからこの値をたどることができる.
プロトタイプはコンストラクタ関数を用いて新たなオブジェクトを生成した時にも用いることができる.
などといったことが書いてあった.

この辺からは難しくてなかなか読み進めることが出来なかった.

6章

継承についての話.

JSでは,プロトタイプチェーンと呼ばれる,オブジェクトのプロトタイプ間に定義されるリンク構造を用いて,子オブジェクトのプロトタイプを親オブジェクトのコンストラクタ関数から生成されるオブジェクトに置き換えることで継承を実装する.
子オブジェクトのあるプロパティを呼ぶと,処理系は,まず子オブジェクト自身のプロパティを探し,なければプロトタイプチェーンをたどって親オブジェクトのプロパティを探す,という動きになる.

最後のケーススタディはわりとわかりやすかった.

7章

実際にJSをブラウザで使う際の注意点についての記述.

この辺は何度か開発をしたことがあるので知っていることも多かった*2

8章

JS固有のコーディングテクニックと,デザインパターンの実装についての話.

グローバル変数の数を減らすために,大きなオブジェクトを作ってその中に名前空間を定義するという手法は面白かった.
実際に飲み込むまでには時間がかかりそう.


全体的に,コード例が充実しており,実際に試すまでもなくわかるような作りになっていました.
オブジェクト指向」と題してあるので,もう少しオブジェクト指向を用いてどのような実装をすればいいのかの例について記載されているとよかったのかなと思います.

*1:これが諸悪の根源な気がする

*2:日本語版は2012年発行だったので,わりと新しい本なのかと思っていたが,この辺の記述を読む当たり,原著は若干古い本かもしれないと思った

ネットワークスペシャリスト試験を受けてきた

10/19に行われた情報処理技術者試験の1つ,ネットワークスペシャリスト試験(NW試験)を受験してきました.

記憶があるうちに,試験前に何をやってたかと,当日の感想をまとめておきたいと思います.

2014年8月上旬

春のデータベーススペシャリスト試験(DB試験)に合格した時に,秋はNW試験を受けると決めていた.
申し込み開始したのを見つけた時点でさっさと申し込む.

この時点ではそのまま放置.

8月下旬~9月上旬

DB試験の時に,短時間で詰め込むつらさを痛いほど学んだので,今回は書いていた論文の投稿が終了した時点ですぐに取り掛かるようにした.
この時点で残り1ヶ月と2週間程度.

情報処理技術者試験自体は5回目の受験になるので,さすがにどんな感じはつかめている(と思う)が,ネットワークについてマジメに勉強したことはなかった.
DBとは違って専門外であり,大学院生の自分には実務知識もないので,最初に教本を読んで知識の詰め込みを行い,そこから広げていくという,いつものスタイルを踏襲した.

とりあえず買った本を晒しておく.

この時はまだ,ヒマがある時にパラパラとめくる程度だった.
情報セキュリティスペシャリスト試験(SC試験)で触れた内容もあったが,それでもわりと覚えることが多いなと感じた(特にレイヤ2以下の知識).

今までの経験から,早いうちに過去問を何問か解いて,合格点との間にどの程度の乖離があるかを測っておくと,勉強のモチベーションになっていいと考え,実際にやってみた.

感想としては,「知らないことが多くて答えようがない」.
パケットの動きやルーティングなど,具体的なイメージを持てないと解けないと感じた.

SC試験のように頭をひねれば解ける問題が多いわけでもなく,DB分野ほど自分の知識があるわけでもない.
この時点で「少し厳しいかも」と思うようになった.

もちろん,わからなかった問題については解説を読むようにし,ついでにその辺の知識を補うようにした.

解説目当てで買った問題集*1

9月下旬

修士論文の中間試問対策で少し勉強から遠ざかっていた.

復帰した後は,問題演習を繰り返しつつ,知識を拾っていった.

特に,研究室にあったので読んだマスタリングTCP/IP入門編は本当にいい本だった.

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

OSI参照モデルがなぜこのようになったのか,各層において実際にどのようにパケットを処理しているかなど,明確に理由を示して(必要ならばそうなるに至った歴史も含めて)書くように心がけられているので,説明が腑に落ちるし,問題を解く際にもイメージが持ちやすい*2

読み終わる頃には,TCP/IPについての問題なら午後1合格点レベルぐらいに到達すると思う.

10月上旬

この時点で試験2週間前.
だいぶ余裕がなくなってきた*3

この頃には過去問4年分に(問題選択含めて)1回触れることができた.

ここまでやってみての感想として,

  • PCやスイッチ,サーバがネットワーク構成図に現れ,パケットの流れを追っていくタイプの問題は解答しやすい.

    • この手の問題では,LB,STP,VLANなどの技術は頻出で,これらに加えて,VRRPなど比較的新しい技術が用いられる.
  • 逆に,スイッチの物理配線やIP電話など,IP以外の知識が必要となるタイプの問題は解答しにくい.

といった感じ.

過去問ではIP電話についての出題も多かったが,たぶん午後2では解かずに済むんじゃないかなという希望的観測のもと,今回は上のタイプの問題に集中することにした.

ネット上でわりと評判の良かったネスペの剣25を買う.

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

この本は,2013年(去年)の過去問のみの解説書となっているが,設問に関係する部分以外についても,「出題者はなぜここでこの記述をしたのか」について細かな説明が施されており,過去問を骨の髄まで吸い尽くしている.
また,設問部分については,「なぜその解答になるのか」だけでなく,「なぜその解答以外の解答にならないのか」についてまで記載されており,理解の深まる構成になっている.

たった1年分の過去問解説に2500円出すのはちょっと…と思って敬遠していたが,結果的には「もっと早く買っておけばよかった」と思う参考書だった.

10月中旬

試験まで1週間を切った.
ここからは研究室の用事はほぼすべてほっぽりかして勉強していた.

基本的には午後試験を1日1問,午後1→午後2→午後1→…の順でローテしていく.

NW試験に限らず,情報処理技術者試験の午後問題は,設問箇所以外にも,問題文の所々に設問のための布石を打つ書き方になっているので,1度問題を解いて解説を見た後にもう1度問題文を読むと,全体構成を理解できるようになり,見えなかった部分が見えてくるようになっている*4
したがって,1度解いた問題についても,しばらく経ってから解き直すようにした.

当日

朝起きたら若干喉が痛かったが,熱はなさそうだったので会場に向かう.

午前1

免除.

午前2

過去問覚えゲー
5年分しっかり覚えれば6割は固い.

午後1

ここからが本番.

問3がセキュリティの話で,穴埋め問題ができそうだったので取ることにした.
問1はOSPFの話が面倒そうだったので却下.
結果として問3,問2を取ることに.

問3:
DNSキャッシュポイズニングやセキュリティインシデントに対する対策など,完全にSC試験の問題だった.
勉強したのが1年前なので記憶が飛んでいるところもあったが,そこそこ埋められたように思う.

問2:
障害対応についての問題.
こちらも手順さえわかれば何とかなったように思う.
でも設問3はよくわからなかった.

解答速報などは見ていないが,手応え的には6割弱ぐらい.

午後2

最初にパラパラ見て,VoIP-GW,IP-PBXという文字を見た時点で問2を読むのをやめた.
それに対して,問1はなんかいけそうなので取った.

問1:
SPFも出てきて,いよいよSC試験になってきた*5
と言っても,SPFについてそこまで勉強したわけでもないので,問題文の誘導にしたがって解いたつもり.
パケットフィルタリングのルール設定はNWっぽいかなという感じだったが,SSL,ログ取得のメリットなどの問題を解いていると,完全に自分が1年前に戻ったような錯覚を受けた.

6割は取れる解答を書けたと思う.
でも,Twitterとか2chとか見てる限りあまり難しかったという話を聞かないし,採点厳しくなりそう.

全体的に

院生生活の1/6(1ヶ月*4回(AP,SC,DB,NW)/24ヶ月)を費やした私の情報処理技術者試験が終わった.

最初は,「情報系の学部出るけど情報のこと何も知らないな…」という危機感から受験した試験だったけど,個人的に少しは成長できたのではないかと思う.

情報処理技術者試験では,OSやベンダ依存の知識は全く扱わないので,こんなものは役に立たないという意見もあるが,基本的な仕組みと,それを応用するための方法を学べば,後はツールの使い方を知るだけで,そこまで学習コストの大きいものではないのではないかと思う*6

また,「高難度の資格試験合格」という,そこそこ高い目標を持って勉強することで,ただ漫然と本を読むより格段に効率のいい学習ができると感じた.
あと,これは実務的にいいのかわからないが,試験日までの短期間に集中して勉強することも,効率面では重要だと思う*7

知識だけあっても,使わなければただの持ち腐れになる.
試験を足がかりにして,最終的には実際の機器も触れるようになりたい.

最後に,これが合格体験記になればいいな,と.

続き

lethe2211.hatenablog.com

*1:問題も解答もWeb上に上がっているんだから,もう少し解説に力を入れてもいいんじゃないかな…

*2:断片的な知識であればWebページに書かれているものでも十分だと思う時があるが,体系的に情報を表現できることに関しては本に勝るものはないと感じた

*3:書いた論文は無事採択されたが,カメラレディに向けての修正にはほとんど時間をかけられなかった

*4:「あ,ここの1文ちょっと不自然だったけど,この設問のためだったのか」みたいな

*5:試験教室を間違えたのかと思って問題用紙の表紙を確認したレベル

*6:もちろん,ベンダ依存の仕組みがあるならそれは勉強しないといけないけど

*7:個人的には,これに加えて,受験料やら参考書やらに金をかけることで後戻りできなくすると,より勉強のモチベーション(プレッシャー?)になっていいと思う

Microsoft Academic APIを利用してみた

Microsoft Academic APIは,Microsoftの文献検索用の検索エンジンであるMicrosoft Academic Searchのデータを外部プログラムから利用するための,いわゆるWeb APIです.

以前は登録制で,使用目的などをメールでMS社に伝えると,IDが送られる形式だったそうですが,現在はMicrosoft Azure Marketplace上でWebサービスとして提供されているようです.*1

このAPIについてはあまり情報が多くないため,できることについてまとめておこうと思います.

Microsoft Academic APIでできること

とりあえず
https://api.datamarket.azure.com/MRC/MicrosoftAcademic/v2/Paper?$filter=ID%20eq%20224857
このURLを実行してみるとよい.

これは,Paperというスキーマから,idが224857となる論文の情報を取り出すリクエストである.

こんな感じで,文献,著者,論文誌,引用についての情報をMASのデータベース(RDB)から抽出できる.

一応,リファレンスは存在して,詳細については
MicrosoftAcademicSchemaRef.docx - Microsoft Word Online
に記載されている.
しかし,Paper_Refのスキーマ情報がなかったり,完全なものではない様子.

APIを試してみる

最も手っ取り早くこのAPIを試してみる方法として,Webインタフェースを用いる方法がある.
Microsoft Academic APIは,Webインタフェースを持っており,クエリに対する結果をテーブルの形で確認することができる.

今回は,わかりやすさのため,この方法を紹介することとする.
※外部プログラムからAPIを利用するだけなら,(適切なクエリがわかっていれば)以下の手順は必要なく,上のようなリクエストを送信するだけでよいことに注意.

  • Microsoft Azure Marketplaceへサインインする.

Microsoftアカウントがあれば,そのアカウントでログインできる.
ない人は取得を.

f:id:lethe2211:20141004195107p:plain

  • 「marketplaceの検索」と書かれた検索ボックスに,"Microsoft Academic"と入力し,「Microsoft Academic」データセットを検索する.

f:id:lethe2211:20141004195440p:plain

  • 「サインアップ」をクリックして次の画面に移動し,利用規約を読んだ上で,「サインアップ」をクリックする.

f:id:lethe2211:20141004211433p:plain

f:id:lethe2211:20141004195904p:plain

  • 「マイアカウント」 -> 「マイデータ」 -> 「Microsoft Academic」から,「使用」をクリックする.

f:id:lethe2211:20141004201311p:plain

f:id:lethe2211:20141004201318p:plain

f:id:lethe2211:20141004201325p:plain

  • 下のような画面が表示されたらOK.

f:id:lethe2211:20141004201431p:plain

この画面では,GUIのインタフェースで,文献情報の検索結果と,同じ検索を行いたい時のクエリとなるリクエストURLを表示している.
例えば,文献引用数が200以上の論文誌を検索したい場合には,「PaperJournalCount」スキーマのタブをクリックし,「paperCount」カラムにフィルターをかければよい.

f:id:lethe2211:20141004202310p:plain

f:id:lethe2211:20141004202318p:plain

このページ上部に表示されているURLにGETリクエストを送信すると,検索結果に対応するデータがXML形式(かJSON形式)で返される.

f:id:lethe2211:20141004202712p:plain

このXMLスクレイピングツールなどでいじって,欲しい情報を取り出せばよい.

使用する上での注意点

f:id:lethe2211:20141004203508p:plain

f:id:lethe2211:20141004203541p:plain

  • このAPIは,一般的な文献検索(例えば,"pagerank"のようなクエリを入力して対応する検索結果を得る)に対応していない.
    個人的にはこれが一番必要な機能なのだが…

参考

Microsoft Academic Search API dataset in Windows Azure Marketplace

*1:なぜこんなことを知っているかというと,Web上には新APIの情報が少なく,旧APIの情報を見てMS社にメールを送ってしまったから.赤っ恥をかいた

*2:Microsoft独特の記法っぽい

*3:この記事を書く際に調べて,初めてJSON形式をサポートしていることを知った.全体的にドキュメントが不足している感は強い

*4:他のIDにも一致しているものがあると思うが,確認していない

内定式に行ってきました

修士論文の中間発表も終え,いよいよ修了が近づいてきた感があります.

10/1に,内定先の企業の内定式に参加してきました.
いわゆる「大手Web系企業」で,新卒者は総合職・技術職含めて200人ぐらいいた気がします.

式自体はわりとすぐに終わり,そこから研修・懇親会・2次会という流れでした.

研修はビッグデータ関連のお話で,私の興味にかぶっていたので面白かったです.

懇親会の2次会は,銀座のクラブ(?)を貸し切っての大きなものでした.
ああいった所での飲み会は経験がなかったので,自分には刺激が強かったです…*1

f:id:lethe2211:20141001212911j:plain


最近,「これから何して生きていこう」ということばかり考えているような気がします.
年を食うに連れ,生き方の選択肢は増えていきますが,その指針を教えてくれる人は少なく,なんとなく視野が狭くなっているように感じるのです.*2

とりあえず,あと半年何ができるかを考えていきたいです.

*1:ビジネス系の人はウェーイ系の学生が多かったです.エンジニアは最終的に僕らだけになり,いたたまれなくなって皆で抜けてきました…

*2:内定ブルーという奴です

Qiitaに初投稿しました

前々からやりたかったぼっちバーに行ったり,コンサートホールで音楽鑑賞したり,地味ながら充実した日々を送っている気がします.

タイトルの通り,エンジニア向けの支援サービスであるQiitaに初めて投稿しました.

一応,Qiitaがサービスを始めてから追ってはいましたが,正直,できた当初はここまで流行るとは思っていませんでした.

このサービスの魅力は,ひとえに「ポストのしやすさ」だと思います.
Markdown記法を採用し,マークアップも非常にシンプルです.
これだけだと普通のサービスっぽいですが,Qiitaが開発しているMacアプリのKobito がすごい.

KobitoはMarkdown形式に対応したエディタです.
Markdownをリアルタイムでマークアップしてくれるだけでもありがたいのに,そのままQiitaに投稿することもできる!*1
技術関係以外でも,ちょっとしたメモに使っています.

今回投稿した記事がこちら.

MacからUbuntuにSSH接続し,tmux上でマウスによるコピーアンドペーストを行う

Qiitaに投稿するようになると,技術ブログとしてのこちらの価値が危ういのですが…
どうやって住み分けしていきましょうか?

*1:なんか回し者みたい

Pythonで,文字列を構成する各文字を入れ替える

こういう細々としたネタも,書いてる人が他に見つからなさそうなら書いていくようにしたいです.

やりたかったこと

文字列sが与えられた時,sを構成する文字を入れ替えたい(例えば,'abc'の2番目の文字と3番目の文字を入れ替えて,'acb'にしたい).

Rubyなどとは違い,Pythonは文字列の変更(各要素に対する再代入)が許されていないため,そのままでは入れ替えができない.

[1] pry(main)> s = 'abc'
=> "abc"
[2] pry(main)> s[1], s[2] = s[2], s[1]
=> ["c", "b"]
[3] pry(main)> s
=> "acb" # ちゃんと入れ替わる
In [1]: s = 'abc'

In [2]: s[1], s[2] = s[2], s[1] # 要素に対しての再代入不可
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-5da7d18dd305> in <module>()
----> 1 s[1], s[2] = s[2], s[1]

TypeError: 'str' object does not support item assignment

環境はPython 2.7.5.

解決策

文字列のままでは変更できないのであれば,リストに変換すればいい.

In [11]: s = 'abc'

In [13]: list_s = list(s)

In [14]: list_s[1], list_s[2] = list_s[2], list_s[1]

In [15]: s = ''.join(list_s)

In [16]: s
Out[16]: 'acb' # ちゃんと入れ替わる

別の方法として,文字列全体に再代入して,

In [17]: s = 'abc'

In [18]: s =  '{0}{1}{2}{3}'.format(s[0:1], s[2], s[1], s[2:2])

In [19]: s
Out[19]: 'acb' # ちゃんと入れ替わる

みたいにしてもよい(少しめんどくさい気もする).

参考

文字列(3) - バリケンのPython日記 - pythonグループ

Pythonでリストの要素を一括で変換(文字列などに) | rakkyooの備忘録