intellista

engineer's notes about application development, data analysis, and so on

TOEICで300点以上アップしたときにやった教材や勉強方法 4選!

こんにちは!

TOEICの点数、伸ばしたいですよね。
しかし、やみくもに聞いたり書いたり解いたりしても、効率がよくなかったり、点数に直結しないこともあります。
今回は、私が実際にやってみて点数が300点以上伸びた教材や学習方法について効果が大きかった方法4つをご説明いたします。

効果があった方法

実際に私がやってみて効果があったTOEICの教材と学習方法をご紹介します。

なお、効果を実感できるまで私は半年ほどかかりました。
それまではひたすら、自分の選択を信じて続けていたのですが、あるとき「あれ・・・?ちょっと聞き取れる」「あれ・・・?少し早く読める」となったのです。
はじめのうちは、わからないものが大半ですし、繰り返した際にも覚えていなかったりしてかなりヘコみますが、これは継続することで乗り越えられます!

(1) TOEICテスト 直前の技術

ロバート・ヒルキさんの「TOEICテスト 直前の技術」です。
TOEICの改定にあわせて本書も改訂版がだされ、タイトルも少しずつ変わっています。

この本で最も役に立ったのはズバリ「得点を上げやすい学習順序がある!」ということです。
本当に衝撃でした。
さらにその理由についてもしっかりと説明されていました。

私が購入したころは、Part2→5→6→1→7→3→4、の順でした。
この記事の時点では、Part2→5→6→3→4→7→1、の順のようです。
どちらにしろ、Part2→5→6、は今のところ不変のようですね。

Part2は、「3択」という選択肢の少なさに加えて、本書にある聞き方のコツやひっかけに関する知識をものにしたところ、かなり正解率が上がりました。
Part5は、読まずに解ける問題か見抜いて時短できるようになり、時間切れで塗り絵(マークシートをとにかく塗る)する度合いが激減しました。
Part6はPart5と同じような技術で解けるので、Part5が速くなるとPart6も速くなります。
この本を読むまでは何も考えずにPart1から順番に取り組んでいたのですが、明らかに非効率だったのです。

また、リスニング問題の超重要なコツとして、次のテクニックが常に役立っています。

  • Part1, 2はマークシートのAにペン先を向けて置き、不正解と思ったらBに移動する。
  • Part3, 4は設問を先に読む。そしてマークシートに軽くチェックするにとどめておき、リスニング終了時に一気に塗る。

本書を読まずに試験に臨んでいた私は、敵を知らずに戦っていたのだな、と思い知りました。
解けるようになったりスコアがアップすると、TOEICの勉強にも張り合いがでてきて、面白くなったことを記憶しています。

ひとつだけ気になったのは、付属のCDの発音です。
私が購入したころの付属のCDの吹込みは、かなりクセの強い方々の録音になっていて、特にオーストラリアの発音を担当されている方が何を言っているのかわからなかったです。(rightをライシュ、のように発音したり。いまは異なっているかもしれません。)

(2) 金のフレーズ

TOEIC単語本の超定番「金のフレーズ」。通称「金フレ」です。

この本の良いところは次の3つがわかる点です。

  • その単語が、どういうフレーズで出やすいのか
  • その単語が、どう言い換えされるのか
  • その単語が、どういう概念を表す単語なのか

上記の3点がわかると、次のようなメリットがあります。

  • ビジネスでもよく使う(と想定される)フレーズで覚えられる
  • 似たような単語を連想できるようになる
  • 和訳せず、英語的な考え方のまま理解できる

試験でも実務でも有効だと思います。
(実際、実務で使う単語の幅がかなり広がりました。)

私は半年で1周、もう半年で1周、といったペースで取り組みました。

  • 通勤中は耳に集中する。(とにかく聞く。可能なら本を見ながら聞く。)
  • 別途時間をとって、本をじっくり読む。(単語ひとつひとつ、解説までマーカを弾きながら理解する。)

Part1の対策のところは少し自分なりに工夫しました。

  • 最初、リエゾン(単語と単語がつながって発音される)しすぎでほとんど聞き取れませんでした。
    そこで、1文1文注意深く聞いて、単語間でつながっているところに楽譜のスラーのようなマークをつけ、上に聞こえた通りのカナを振りました。
    例えば、「~ is pointing at a screen.」の「~g at a」が「ガタ」に聞こえるので、「~g at a」の上部に橋が架かるような孤線を引いて、上に「ガタ」と書きました。
    (カナはよくないと言われるのですが、聞けるようになることが目的なので、発音記号を調べる時間をとるよりも効率的に、安易な手段を取りました。)
    ちなみに、最も衝撃的だったのは「propped up against the wall」で、「プロパタゲインスタウォー」のように聞こえたものです(改訂版ではちょっと違う発音になっています・・・さみしい)。
  • なんども聞いているうちに、英語に独特のリズムがあることに気が付きました。
    YO、YO、YO、のような音楽的なリズムです。
    どの文も単純なSVOやSVCです。
    そのS、V、O/Cの1文を、一息で、大(S)、中(V)、小(O/C)、の山があるリズムで読んでいることに気が付きました。
    別の本で知りましたが、英語は日本語と異なり、音の強弱を使う言語なのだそうです。

リエゾンとリズムがつかめてくると、急に聞き取れる(&しゃべりやすく)なりました。

実際の試験で「あ~、これ金フレで聞いた」「金フレで見たフレーズだ!」という状況に何度か遭遇しているので、いまは改訂版を愛用しています。

(3) 1000本ノック

文法問題でる1000問、通称「1000本ノック」です。

問題数は、1,019問(トーイック)。
Part5専門の取り組みやすい特訓本です。

問題集ではありますが、非常に解説が充実しています。
高校レベルの文法をひととおり学習し終えていれば、スムーズに理解できると思います。

Part5の中でも割合の多い品詞問題の解説では、文型のどこが欠けているからこの品詞、といったスッと頭に入る説明が丁寧にされています。
ほか、文型の分類、前置詞のイメージ、よく似た前置詞や副詞など、試験でも実務でも役立つエキスが詰まっています。

また、冒頭にPart5の出題パターン、解答ペースなど、基本的な向き合い方が丁寧に解説されています。
具体的でわかりやすい説明で、これを理解してひととおりの問題をこなしたところ、Part5・6で目標の20分に大きく近づけました。
(ほかの本でも言われていますが、Part5が解けるようになればPart6も解けるようになります。)

なお、1,019問(小冊子)を切り離して使えます。
薄い小冊子を持ち運んで、移動中やスキマ時間にいつでも1000本ノックできます!

(4) 特急シリーズ

超定番の人気シリーズ「特急」シリーズです。


Amazon.co.jp: Toeic 特急


1問あたり、通勤時の1~2駅分のサイズ(5~10分程度)に収まるよう工夫されています。
そのため、通勤や日々の細切れ時間での集中して解いて解説まで理解できます!

価格もサイズも重さもお手頃なところもうれしいです。
親書サイズで持ち運びにストレスがありません。
通勤でもレジャーでも、数冊バッグに入れても苦になりません。

私は「文法特急」から始めました。
得点の上がりやすいPart5や6向けの対策本です。
音声もダウンロードでき、リスニングの得点アップにも貢献しました。

次に「Part1・2特急」に取り組みました。
こちらも実際の試験につかわれる写真の特徴や解き方のコツなど、「敵を知る」解説が丁寧で重宝しました。

1冊で1か月もかからなかったと思います。

そしてやはり特筆すべき点は、そのサイズと軽さ。
隙あれば移動中でもお買い物中でもバッグからサッと取り出して学習できるこの手軽さ。
「特急」シリーズ、ぜひオススメです!

効果がなかった方法

聞き流し

よく「聞き流すだけで聞けるようになる!」という話をCMなどで聞きます。
試しに、イギリスのBBCや、アメリカのニュース番組など聞き流してみました。
また、これまで紹介した参考書についても、書籍を見ずに聞き流すことも試してみました。

結果、私にとっては何も残らなかったです。
原因としては、聞いた結果の答え合わせができないのが致命的だと思います。
いま聞いたのがなんなのかわからないまま、どんどん流れ去るだけです。
時間の無駄です。

いくつかの書籍でも言われていますが、大人の言語学習は幼児とは異なり、音だけでは厳しいのだそうです。
幼児は音と視覚から時間をかけて意味を紐づけるようです。
しかし大人の場合はその時間をかける余裕がありません。
大人の場合に効率がよいのは、音と意味を紐づけることです。
音と意味を紐づける手っ取り早い方法は、音と文字を合致させることです。
私の場合、音を聞くのと同時にその単語や文章を見る、という方法で、非常に効率よく音と意味を吸収できました。
(前述の「特急シリーズ」は親書サイズとコンパクトなので、うってつけです。)

なお、知人でBBCを定期的に聞き流す方もいたのですが、その方はすでに英語がわかる方でした。
英語がわかるかたであれば、聞き流しでスキル維持やアップが可能なのだと推測します。

補足

社会人になったあるとき、やはり英語はビジネスの土台として重要だと実感して、きちんと学習しなおすことにしました。
実際に実務でつかえる英会話などにも興味はあったのですが、それ以前に全く聞き取れないし読んでも単語がわからない、といった自分がいました。

あるTOEIC本に書いてあったのですが、TOEICはビジネスでよくつかう単語や言い回しに特化している試験なので、とても効率よくビジネス英語を学習できるのだそうです。
実際にやってみて、TOEICで学んだ単語や言い回しは、業務で見かけたり使ったりすることを実感しています。

いくつかの定番の著者、有名な書籍を実際に手に取りました。
往復2時間ちかくの通勤時間を利用して、半年で100点ほどアップ、もう半年でさらに100点ほどアップ、さらに半年でもう100点ほどアップしました。

TOEICの点数が高得点だからと言って話せるわけではないとは言われているものの、英語力の証明としては効果があります。
特に、企業の昇進条件などにもなっており、ある意味「免許」のような位置づけに近いと思います。

まとめ

今回は、私が実際にやってみて点数が300点以上伸びた教材や学習方法についてご説明いたしました。

TOEICは、ビジネスシーンで利用されやすい単語や表現から優先的に効率よく、英語を習熟できると思います。
また、自身の英語レベルの証明にも使えます。(そして企業からも求められます。)

なお、TOEICに関連するトピックとして、資格試験があります。
資格試験も自身のスキルの証明にも使えますし、体系的に学習できたりキャリアアップに役立つというメリットもあります。
次の記事では、TOEIC対策のほかに、IT系の資格試験に合格した勉強方法のコツをご紹介する記事をまとめています。
是非、チェックしてみてください!
intellista.hatenablog.com

【即戦力】Python、Pandas、データ分析の記事 10選!

こんにちは!
今回は、Pythonに関連する記事をまとめます!
具体的には次のような記事です。

  • Python」の言語仕様に関する記事
  • Pythonのなかでも有名・定番のライブラリ「Pandas」に関する記事
  • 「データ分析」業務に関わった際に感じたことや試したこと

Pythonを実務で使い倒していたときの情報なので、即戦力になれる情報もあると思います。
是非、読んでみてください!

Python

Pythonに関する記事になります。

Pythonのスレッドで発生した例外は親スレッドでキャッチできない

intellista.hatenablog.com

Pythonでスレッドの実装が必要になったときに得た知見です。
子スレッドで発生した例外は親スレッドでキャッチできないんですよね。。。
子スレッドで発生した例外は子スレッドのルートまで上がっていくのですが、親スレッドには伝わらないのです。
親スレッドですべてキャッチすればシンプル・・・と想定して実装していたときにハマって、当時あれこれ調査して得られた知見をまとめました。

Pythonでシングルトン (Singleton) を実装する方法と注意点!

intellista.hatenablog.com

Pythonバッチ処理を実装していたときに、あちこちから呼ばれる共通処理が重複処理をすることがわかって、「よし、シングルトンにしよう!」となったときに得た知見をまとめました。
解決策はシングルトンだけではないかもしれませんが・・・Pythonでも(ちょっとクセはありますが)シングルトンができることがわかり、整理してまとめた記事になります。

Pythonの内包表記やmap関数で、低速で冗長なfor文から解放されよう!

intellista.hatenablog.com

Pythonでfor文を見たら怪しいと思え

これは当時、一緒にお仕事をさせていただいていた知見者の個人的な名言です。
わたしもちょうど同じ思いをいだき始めていましたので、すごく好きな言葉です。
Pythonシンプルで強力な内包表記をはじめ、map関数も理解することで、簡潔かつ高速に実装できます。
はじめはとっつきにくいかもしれませんが、そこまで大きな壁ではなく、ちゃんと乗り越えられますので、もしまだでしたら、ぜひとも使いこなせるように目指してみてはいかがでしょうか?
使えるようになると、とても気持ちがよく、楽しくなります!

なお、余談ですが、上述の格言「Pythonでfor文を見たら怪しいと思え」は、Pandasにも当てはまります!

Pandas

Pythonのなかでも、Pandasに関する記事になります。

Pandasのデータフレームの値を2つのインデックス参照で変更するときは、真偽値の条件を後にする!

intellista.hatenablog.com


ちょっとピンポイントな情報ですが、わりとハマるPandasでの実装上のクセをまとめました。
なかなかひとことでは言い表すのが難しいので、もしよろしければぜひ、記事をのぞいてみてください!

PythonでPandasを使ってCSVをサクッと整形する方法とは?

intellista.hatenablog.com


簡易的なバッチ処理の言語をPythonにする理由のひとつして、PandasではCSVファイルをとても簡単に扱える、ということがあります。
実務の中で、CSVの中身を成形するシーンが何度も登場しました。
そのときに得た知見をまとめた記事になります。

Pandasで複数のカラムが一致する行/一致しない行を抽出したい

intellista.hatenablog.com

Pandasでは一致/不一致の条件をシンプルかつ直感的に記述できる利点があります。
ただし、複数カラムの一致/不一致となると、SQLのようにはいかず、ちょっと工夫が必要でした。
そのあたりをまとめた記事になります。

Pandasで次のレコードとの差を計算する方法とは?

intellista.hatenablog.com

実務でIoTセンサなどの情報をあつかっていたときに得られた知見をもとにした記事になります。
時刻単位のレコードで時系列に蓄積されたデータを扱うとき、あるレコードと次のレコードの時刻の差を「時間」として計算したくなるケースはよくあります。
この「あるレコードと次のレコードの時刻の差を「時間」として計算」する方法についてまとめた記事になります。

データ分析

データ分析に関する実務に携わっていたころの所感や試みなどを記事にしたものです。

データ分析の初心者が実務で苦労した4つのポイント!

intellista.hatenablog.com

実務ではじめて、データ分析のチームに参画したときにいろいろと四苦八苦したポイントをまとめた記事になります。
こういうポイントで苦労して、こういう風に考えた、ということが、ご参考になればうれしいです。

Kerasの学習済モデルでミニマムコードによる画像分類を試す!

intellista.hatenablog.com

PythonKerasによる機械学習をお試ししてみたときの記事になります。
意外と簡単に超基礎のコードは実装できることがわかり、感動しました。

Pythonでk-meansによるクラスタリング

intellista.hatenablog.com

Pythonk-meansの実装をお試ししたときの記事になります。
Python機械学習のライブラリがとても充実していることを実感できました。

まとめ

今回は、Pythonに関する記事をまとめました。
Pythonを実務で使い倒していたときの情報なので、活きた情報ではないかと思います。
みなさまのお役に立てば幸いです!

【合格者談】IT系の資格試験に一発合格した勉強方法 5選!(情報処理技術者、G検定、AWS、DX推進アドバイザー、DX検定)

こんにちは!
IT業界にいると、資格試験を利用して知識の習得やキャリアアップを実現したり、スキルの証明に活用するシーンがよくあります。
今回は、私がIT系の資格試験で実際に一発合格した際の勉強方法のコツ、参考書、問題集などご紹介している記事についてまとめます。

一発合格体験記

実際に私が一発で資格試験に合格したときの勉強法のコツ、参考書、問題集などをご紹介する記事です。

情報処理安全確保支援士

intellista.hatenablog.com

情報処理安全確保支援士は、IPAが主催するIT系の国家試験である「情報処理技術者試験」で初の「士業」である「情報処理安全確保支援士」の前提となる重要な資格です。
近年、社会全体でのサイバーセキュリティへの関心が急速に高まるなか、日本が国家を上げてプロフェッショナルを急増させようとしている背景を踏まえ、実際に受験した際に役立った勉強方法、参考書、問題集をまとめました。
また、受験日の当日の様子もレポートしています。
こちらの情報がお役に立てば幸いです!

G検定

intellista.hatenablog.com

G検定は、JDLA(日本ディープラーニング協会)が主催する資格で、ディープラーニングに関する広い理解を証明する人気の資格になります。
ブームを経て、いまや社会を支える「汎用技術」となりつつある人工知能(AI)の技術と、それを支えるディープラーニングの技術。
日本も国家レベルで人材育成を進めており、様々な企業も注目している分野です。

初回の受験で一発合格した際に役立った勉強方法、参考書、問題集を中心に、やっておけばよかったこと、やらなくてもよかったことなど、合格を目指すにあたって参考になると自負する情報をまとめました。
こちらの情報がお役に立てば幸いです!

AWS(Cloud Practitioner、Solutions Architect - Associate、の2つ)

intellista.hatenablog.com

クラウドコンピューティングのひとつAWSの認定資格です。
認定資格の中でも基礎となる「Cloud Practitioner」と、その上位にあたる「Solutions Architect - Associate」をターゲットにご説明しています。
クラウドコンピューティングとしてシェアNo.1のAWSは業務でも関わりがあったため、資格取得にチャレンジしました。
具体的な学習コンテンツや私のスケジュールも説明していますので、是非読んでみてください!

DX推進アドバイザー認定試験

intellista.hatenablog.com

DX系の認定試験のひとつであるDX推進アドバイザー認定試験です。
DXに関する幅広い考え方を超高効率で把握できます。
学習時間、学習方法や教材、受験当日のレポートなど説明していますので、是非読んでみてください!

DX検定(プロフェッショナルレベル)

intellista.hatenablog.com

DX系の認定試験のひとつであるDX検定です。
最上位レベルである「プロフェッショナルレベル」を取得した際の勉強方法をご紹介しています。
こちらもDXに関する幅広い考え方を超高効率で把握できます。
学習時間、学習方法や教材、受験当日の様子など説明していますので、是非読んでみてください!

ご参考

IT系に関連する勉強に関する記事をご紹介します。

TOEIC

intellista.hatenablog.com

IT業界ならずビジネスには必須となってきている英語。
その実力を測るツールとして、TOEICを導入している日本の企業は多いです。
このTOEICで、私が300点以上の点数をアップさせた勉強方法をご紹介しています。

ネットワークスペシャリスト試験向けの参考書

intellista.hatenablog.com

前述の2つの資格を取得した後に、IPAが主催するIT系の国家試験である「情報処理技術者試験」のひとつである「ネットワークスペシャリスト試験」の対策を始めた際の記事になります。
実際に購入した参考書の所感と、いくつかの有用と考えている参考書に関する情報をまとめています。
※もし幸いにも合格し、かつ執筆の時間が確保できましたら、記事をアップデートするかもしれません。
こちらの情報がお役に立てば幸いです!

資格試験のメリット

資格試験のメリットは「体系的かつ効率的に該当分野の基礎知識を習得できる」「一定の知識があることを公的に証明できる」という点にあると考えています。
つまり、費用対効果や時間対効果が高く、信頼を得られやすいというメリットがあります。
副次的な効果として、自分に対する自信もつくと思います。
ぜひ、有用な資格試験を通じて効率的にスキルアップを果たし、社会に貢献できる英知を身に着け、より楽しく快適な社会を一緒に創りだしていきましょう!

資格試験のメリットについては、下記の記事でもまとめています。
intellista.hatenablog.com

まとめ

今回は、私がIT系の資格試験で実際に一発合格した際の勉強方法のコツ、参考書、問題集などご紹介している記事についてまとめました。

ところで、資格を合格すると、認定証が発行されますよね。
最近は、この認定証として「デジタルバッジ」というデジタルな認定証が発行される認定資格も増えてきています。
「デジタルバッジ」を発行したり管理するサービスを提供するサイトが世界中にいくつかあります。
これらのいくつかについて、発行された「デジタルバッジ」の登録方法などご紹介する記事も下記にありますので、是非読んでみてください!
intellista.hatenablog.com

PythonでPandasを使ってCSVをサクッと整形する方法とは?

こんにちは!

Pythonを使ったデータ分析やアプリケーション開発において、CSVファイルを扱う機会はよくあります。
CSVの読み書き、整形をPythonで行うなら、Pandasを使うのがとても簡単です。
コード量も少なく可読性もいいので、メンテナンス性も確保できます。

今回は、PythonでPandasを使ってCSVをサクッと整形する方法をご紹介します。

基本構造

PythonでPandasを使ってCSVをサクッと整形する処理の基本構造は、次のとおりです。

import pandas as pd

def main():

    df = pd.read_csv(  # 読み込み
        "./input.csv",  # 入力ファイル
        dtype=str  # 値が化けないように
    ) 

    df = edit(df)  # データ加工

    df.to_csv(  # 書き出し
        "./output.csv",  # 出力ファイル
        index=False  # read_csv()で付加されたindexを除去
    )

def edit(df):  # データ加工
    # df を加工する処理を記述する
    return df

if __name__ == "__main__":
    main()


Pandasは本当に便利ですね。

なお、Pandasによって「値が変わってしまう事象」が発生しないように、dtype=strをしていして、すべての値を文字列として読み込みます。

dtypeを指定しないと、Pandasがうまいこと型を推測しようとしてくれます。(型推測、とよばれます。)
しかし、数値が一律floatになって小数点が付いてしまうといった「値が変わってしまう事象」が発生します。

「値が変わってしまう事象」が発生すると、何が問題なのでしょうか?

例えば、DBから取得したCSVを加工してから、同じテーブルに入れようとすると、エラーが発生する可能性があります。
整数型のカラム値「1」について、CSV出力した時点では「1」のままですが、Pandasによりfloatで読み込まれて「1.0」に変換され、そのままCSVに「1.0」で出力されたとき、それをDBにINSERTしようとすると「1.0」は整数ではないのでDBへのINSERTでエラーとなります。

なので、Pandasで読み込む前のCSVと書き出したあとのCSVの型を同じにする工夫が必要となります。
この工夫として、文字列として扱うのが手っ取り早いです。

いくつかの加工処理の例

加工処理について、いくつかの例を挙げます。

最終列を除去する

最終列を除去するには、次のようにします。

import pandas as pd

def main():
    df = pd.read_csv(  # 読み込み
        "./input.csv",  # 入力ファイル
        dtype=str  # 値が化けないように
    ) 

    df = edit(df)  # データ加工

    df.to_csv(  # 書き出し
        "./output.csv",  # 出力ファイル
        index=False  # read_csv()で付加されたindexを除去
    )

def edit(df):  # データ加工
    df = df.iloc[:, :-1]  # 最終列を除去
    return df

if __name__ == "__main__":
    main()

ヘッダを除去する

ヘッダを除去するには、次のようにします。

import pandas as pd

def main():
    df = pd.read_csv(  # 読み込み
        "./input.csv",  # 入力ファイル
        dtype=str  # 値が化けないように
    ) 

    df = edit(df)  # データ加工

    df.to_csv(  # 書き出し
        "./output.csv",  # 出力ファイル
        index=False,  # read_csv()で付加されたindexを除去
        header=False  # ヘッダを出力しない
    )

def edit(df):  # データ加工
    # df を加工する処理を記述する
    return df

if __name__ == "__main__":
    main()

文字コードを変換する

文字コードを変換するには、次のようにします。

import pandas as pd

def main():
    df = pd.read_csv(  # 読み込み
        "./input.csv",  # 入力ファイル
        dtype=str,  # 値が化けないように
        encoding = "shift-jis"  # SJISで読み込み。CP932相当。
    ) 

    df = edit(df)  # データ加工

    df.to_csv(  # 書き出し
        "./output.csv",  # 出力ファイル
        index=False,  # read_csv()で付加されたindexを除去
        encoding = "utf-8"  # UTF-8で書き出し。
    )

def edit(df):  # データ加工
    # df を加工する処理を記述する
    return df

if __name__ == "__main__":
    main()

なお、

  • BOMなし: encoding = "utf-8"
  • BOMつき: encoding = "utf-8_sig"

となります。

カラムの前後の空白を除去する

カラムの前後の空白を除去するには、次のようにします。

import pandas as pd

def main():
    df = pd.read_csv(  # 読み込み
        "./input.csv",  # 入力ファイル
        dtype=str  # 値が化けないように
    ) 

    df = edit(df)  # データ加工

    df.to_csv(  # 書き出し
        "./output.csv",  # 出力ファイル
        index=False  # read_csv()で付加されたindexを除去
    )

def edit(df):  # データ加工
    # df を加工する処理を記述する
    df.iloc[:, 0] = df.iloc[:, 0].str.strip()
    return df

if __name__ == "__main__":
    main()

補足

巨大なCSVファイルの場合

巨大なファイルの場合はPandasのread_csv()のchunksizeオプションを使えば読み込める可能性があります。
本記事では本論でないため、申し訳ありませんが割愛します。

文字コードだけなら標準関数でOK

単に文字コードを変換するだけなら、Python組み込みの標準関数open()、write()で十分です。
例えば、Shift_JISからUTF-8に変換するには、下記のようにします。

with open('./input.csv', encoding="cp932") as fin:
    with open('./output.csv', 'w', encoding="utf8") as fout:
        fout.write(fin.read())

ただし、こちらも巨大なファイルの場合は、一度に読み込むとメモリエラーとなる可能性があります。
これを防ぐため、例えば、BufferedReader、BufferedWriterなどのioパッケージのストリームを使って少しずつ読み込むのもいいと思います。

なお、encoding="cp932"のところが encoding="shift jis"でないのは、cp932のほうがカバーできる文字コードが多いためです。
encoding="cp932"にしておくのが無難です。

まとめ

今回は、PythonでPandasを使ってCSVをサクッと整形する方法をご紹介しました。
これで、Python(Pandas)を使ってCSVをの読み書きや整形を簡単に行えるようになるはずです!

なお、Pandasを含め、Pythonには様々なコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com

Pythonのスレッドで発生した例外は親スレッドでキャッチできない


こんにちは!

Pythonのスレッドで発生した例外を親スレッドでキャッチできないことを知ったので、記事に致します。

何を言っているのでしょうか?

プログラムで「例外」といえば、何もしないか、ちゃんとthrowすれば、発生した例外が上位の処理に伝搬していきます。
イメージを書くと、次のように、呼び出し先で発生した例外を呼び出し元に伝搬でき、呼び出し元でキャッチできます。

親モジュール: 「例外A」をcatchする ←「例外A」をキャッチできる
↑「例外A」が伝搬する
  子モジュール: 「例外A」をcatch & throwする
    ↑「例外A」が伝搬する
    孫モジュール: 「例外A」をcatch & throwする
      ↑「例外A」が伝搬する
      ひ孫モジュール: 「例外A」が発生する


しかし、少なくともPythonでは、子スレッドの例外は親スレッドに伝わらないことがわかりました。
次のようなイメージです。

親スレッド: catch 例外  ←「例外A」をキャッチできない
  <ここで例外の伝搬が途切れる>
  子スレッド: catch & throw 例外 ←「例外A」をキャッチできる
    ↑「例外A」が伝搬する
    子スレッドの子モジュール: 「例外A」をcatch & throwする
      ↑「例外A」が伝搬する
      子スレッドの孫モジュール: 「例外A」が発生する

そこで今回は、Pythonのスレッドで発生した例外は親スレッドでキャッチできない点についてご説明いたします。

※もしかするとプログラム言語の仕様に依存するかもしれません。本記事ではPython言語についてご説明します。

説明のための処理の構造

Pythonのスレッドで発生した例外は親スレッドでキャッチできないことを説明するための例とする処理の内容は、次のとおりです。

import threading

def func():
  a = 1/0  # raise ZeroDivisionError

def main():
  thread = threading.Thread(target=func)
  thread.start()

main()
  • func()は子スレッドの処理内容です
  • main()は子スレッドを生成して起動しています
  • 最上位のスコープ(mainスレッド)でmain()を呼び出しています

実行結果

Exception in thread Thread-74:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "", line 4, in func
    a = 1/0
ZeroDivisionError: division by zero

実験

Pythonのスレッドで発生した例外が親スレッドでキャッチできないことを確認します。

親スレッドでスレッドの例外をキャッチできない

子スレッドの例外を、親スレッド(mainスレッド)でキャッチしてみます。

import threading

def func():
  try:
    print("1")
    a = 1/0
  except Exception as e:
    print("2")
    print("e:", e)
    raise

def main():
  thread = threading.Thread(target=func)
  thread.start()
  print("3")

try:
  main()
except Exception as e:
  print("4")
  print("e:", e)
  raise

実行結果

1
2
e: division by zero
3
Exception in thread Thread-77:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "", line 6, in func
    a = 1/0
ZeroDivisionError: division by zero

残念ながら、親スレッド(mainスレッド)でキャッチできたら「4」が表示されるはずですが、表示されません。
つまり、親スレッド(mainスレッド)では、子スレッドの例外をキャッチできないことがわかりました。

子スレッドの終了を待ってもキャッチできない

子スレッドの終了を待ったらキャッチできるのでしょうか?

import threading

def func():
  try:
    print("1")
    a = 1/0
  except Exception as e:
    print("2")
    print("e:", e)
    raise

def main():
  thread = threading.Thread(target=func)
  thread.start()
  thread.join()  # 子スレッドの終了を待つ
  print("3")

try:
  main()
except Exception as e:
  print("4")
  print("e:", e)
  raise

実行結果

1
2
e: division by zero
3
Exception in thread Thread-78:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "", line 6, in func
    a = 1/0
ZeroDivisionError: division by zero


残念ながら、親スレッド(mainスレッド)でキャッチできたら「4」が表示されるはずですが、表示されません。
つまり、子スレッドの終了を待っても、親スレッド(mainスレッド)では、子スレッドの例外をキャッチできないことがわかりました。

子スレッド内の例外は子スレッドでキャッチできる

もちろん、 子スレッド内で発生した例外は、子スレッドの最上位ではキャッチできます(通常の例外の伝搬のため)。

import threading

def func():
  try:
    print("1")
    func2()
  except Exception as e:
    print("2")
    print("e:", e)
    raise

def func2():
  print("1-1")
  a = 1/0

def main():
  thread = threading.Thread(target=func)
  thread.start()
  print("3")

try:
  main()
except Exception as e:
  print("4")
  print("e:", e)
  raise

実行結果

1
1-1
2
e: division by zero
3
Exception in thread Thread-17:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "", line 6, in func
    func2()
  File "", line 14, in func2
    a = 1/0
ZeroDivisionError: division by zero

ではどうするか?

子スレッドの例外は、次のように「子スレッドで処理する」ほかありません。

import threading

def func():
  try:
    a = 1/0
  except Exception as e:
    do_something() # 処理する!

def main():
  thread = threading.Thread(target=func)
  thread.start()

main()

補足(発見した背景)

親スレッドでまとめて例外を処理できる(すべての処理を止める、ログに出力する、など)と想定していたのですが、親スレッドでは子スレッドの例外を検知できないので、子スレッドの最上位で例外を処理する必要があることがわかりました。

スレッドを使わなければ、例外を再スローしたら上位に伝搬できます。
しかしスレッドを使うとスレッドの最上位で伝搬が終わります。
知らないとハマるポイントかと体感しました。

まとめ

今回は、Pythonのスレッドで発生した例外は親スレッドでキャッチできない点についてご説明いたしました。

なお、スレッドも非常に重要ですが、それ以外でもPythonにはコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com

【感想追記】ネットワークスペシャリストの教科書を購入しました!


こんにちは!

IPA情報処理技術者試験ネットワークスペシャリスト」に興味があり、まずは参考書を購入しました。
今回はネットワークスペシャリスト試験に向けて購入した参考書についてまとめます。

購入した参考書

ネットワークスペシャリスト教科書(令和4年度版)を購入しました。

各所での評判がとても良く、こちらが網羅的(ただし基礎的)のようでした。
Web上の試し読みで一部をチェックしましたが、図表や文章になじめそうでした。
AIで過去問などを分析した結果を反映しているところも面白いですね。

Amazonで2021年12月31日の20時ころに注文し、翌日2022年1月1日の午前中には到着しました。
都内ではなく近県にいるのですが、それでもAmazonは早くて驚きました。
早速、マーカーを引きながら読み進めています。

2022年1月4日 追記(感想):

100ページほど読み進めました。個人的には読みやすいと思います。
冒頭やコラムに、合格者に期待されるスキルや、試験に向けておさえるべき具体的なトピックや進め方が丁寧に解説されており、目標に向かって効率よく進めそうで心強いです。

細かいところで少し気になる点(※後述)はありますが、今のところ支障はありません。
余白も適度にあるので、書き込みもしやすいです。
初版を使っていますが、現時点では正誤情報はありませんでした。
https://book.impress.co.jp/books/1121101026
購入特典のひとつとして、書籍の全文をPDFでダウンロードできる点もうれしいですね。外出時などのスキマ時間用に早速スマートフォンに入れました。

引き続き取り組もうと思います。

※少し気になる点は以下です。
  • 本文中での列挙が箇条書きになっていたらもっと明快なのに、という箇所が目立ちます。説明はわかりやすいので今のところ支障はありません。
  • 「AとBがあります。Bは~、Aは~」とねじれている箇所が散見されますが、許容範囲です。
  • 例えば、PPPoEフレームでカプセル化されているPPPフレームがどこを指すのか、など一部の説明が省略されているように感じますが、インターネット調べて補記すれば今のところ十分です。
  • IEEE 802.11acの最大速度は6.9Gbps(第2世代)のはずですが「1.3Gbps(第1世代)」のみの記載でした。試験ではそう出るのでしょうか。

その他の候補の参考書

ほかの候補としては、マスタリングTCP/IPの最新版(第6版)もありました。
こちらも、各所で評判がいいです。
私は、第5版の図や文章に少しなじめなかったのと、多少オーバースペックなので、いったん見送りました。

また各所で評判のいい「ネスペ」シリーズも候補としましたが、網羅的というよりは実践向けの印象でした。
こちらは、中盤以降の午後対策用に追って購入しようと思います。

動機

情報処理技術者試験について、昨年の秋の試験で情報処理安全確保支援士に合格したので、午前Iの免除があります。
そこで、ほかの試験区分について興味がわきました。

ネットワークスペシャリストは、情報処理安全確保支援士と知識の範囲に重複があるので取り組みやすそうです。

本当はデータベーススペシャリストにも興味がある(かつ実務にも関連する)のですが、令和4年度は秋の試験のようでした。
ネットワークスペシャリストは令和4年度では春に行われるので、先にチャレンジすることにしました。
(年度によって春・秋が入れ替わることがあります。情報処理安産確保支援士は、春・秋の両方とも試験が開催されています。)

なお、情報処理安全確保支援士に合格するまでの勉強法、参考書、問題集については、次の記事にまとめています。
intellista.hatenablog.com

まとめ

今回は、ネットワークスペシャリストの参考書について、購入したものと候補についてまとめました。
令和4年4月17日(日)の試験まで約4か月。計画的に進められればと思います。

令和4年度 情報処理技術者試験
https://www.jitec.ipa.go.jp/1_00topic/topic_20211220.html


なお、資格試験は、体系的に学習できたりキャリアアップに役立つというメリットや、自身のスキルの証明にも使えます。
次の記事では、IT系の資格試験に合格した勉強方法のコツをご紹介する記事をまとめています。
是非、チェックしてみてください!
intellista.hatenablog.com

Pythonでシングルトン (Singleton) を実装する方法と注意点!

こんにちは!

今回はPythonでシングルトン(Singleton) を実装する方法と注意点をご紹介します。

仕事で必要になったのですが、インターネットで調査するといろいろな方法が紹介されています。
Javaのような方法からPythonらしい方法、独自で作りこむ方法など・・・
私はシンプルなのが好みなので、その中でも一番シンプルな方法をご紹介します。

実装する方法

Pythonでシングルトン (Singleton) を実装する方法をご説明します。

基本形

Pythonでのシングルトン(Singleton) の基本形は下記です。

class Singleton():
    def __new__(cls, *args, **kargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

メソッド__new__を実装します。
その中で、自身のインスタンスを保持する内部変数がなければインスタンスを格納します。
2回目以降は、すでにインスタンスが格納されているため、再格納はされません。
そして最後に、最初に格納した自身のインスタンスを返します。
つまり、何回クラスをnewしても、最初に格納し自身のインスタンスを常に返します。

ご参考

実はif not hasattr(cls, "_instance"):if cls._instance == None:と書く方法もあります。
ただ、こうすると、下記のようにクラス変数_instance = Noneが必要になってしまい、少しコードが冗長になります。
_instance = Noneがないと、初回のif cls._instance == None:cls._instanceが存在しないという実行時エラーとなります。)

class Singleton():
    _instance = None  # ← 冗長
    def __new__(cls, *args, **kargs):
        if cls._instance == None:  # ← ここが基本形と異なる
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

少し突っ込んだ注意点

PythonでのSingletonについての、少し突っ込んだ注意点をご説明します。

*args, **kargs はどこいった?

もう一度、基本形を見てみます。

class Singleton():
    def __new__(cls, *args, **kargs):  # ← *args, **kargs を受け取る
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)  # ← *args, **kargs を渡さない
        return cls._instance

__new__(*args, **kargs):の引数で*args, **kargsを受け取っています。
しかし、super(Singleton, cls).__new__(cls)では*args, **kargsを渡していません。
super(Singleton, cls).__new__(cls, *args, **kargs)のように渡すと、エラーになります。

*args, **kargsはクラスのコンストラクタ式の引数なので、このクラスに渡るはずです。
ですが、その実装が見当たりません。
いったいどこに渡されるのでしょうか?

実は*args, **kargsは、このクラスの__init__()メソッドに渡されます。
なので、自分でdef __init__(self, 引数)と書くことでコンストラクタ式の引数を受け取れたわけです。
実際、次のように書くと、コンストラクタ式の第1引数をprintできます。

class Singleton():
    def __new__(cls, *args, **kargs):  # ← *args, **kargs を受け取る
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, *args, **karg):  # ← *args, **kargs を受け取る
        print(args[0])

__init__()についての私の誤解

結論を先に申します。

__init__()の直下に初回のみ実行することを期待する処理を書いてはいけません。
シングルトンであっても、__init__()はクラスを生成するたびに毎回実行されるからです。

呼び出し元がクラスのコンストラクタ式を呼び出してからクラスのインスタンスを受け取るまでの流れは、次のようになります。

  1. 呼び出し元がクラスのコンストラクタ式を実行する。
  2. クラスの__new__()が呼ばれる。
  3. クラスの__init__()が呼ばれる。
  4. 呼び出し元にクラスのインスタンスが返される。

そのため、__new__()__init__()も、 呼び出し元がクラスのコンストラクタ式を実行するたびに毎回、呼ばれます!

これは、私にとっては、ちょっとした罠でした。
というのも__new__()__init__()も、その名前から、初回のみ呼ばれるものと思い込んでいたのです。

一般的には__init__()に初期化処理などの前処理を書くと思います。
そのため、私も__init__()に初回のみ必要な処理を書いていました。
ですが、実際には毎回、呼ばれていたわけです。
そのため、性能劣化を起こしていた実装もありました。

本当に初回のみとしたい処理の書き方として、次の2つの方法が考えられます。
ただし、Pythonのお作法的に、どちらがよいのか(または両方ともよくないのか)は、わかっていません(すみません)。

  • 方法1: __new__()if not hasattr(cls, "_instance"):のブロック内に初回のみの処理を記述する。
  • 方法2: __init__()if not hasattr(self, "_instance"):のブロックを追加して、その中に初回のみの処理を記述する。

■ 方法1: __new__()の中に書く

class Singleton():
    def __new__(cls, *args, **kargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)
            # ここに初回のみの処理を書く
        return cls._instance

■ 方法2: __init__()の中に書く

class Singleton():
    def __new__(cls, *args, **kargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, *args, **karg):
        if not hasattr(self, "_instance"):
            # ここに初回のみの処理を書く

いくつかの処理から呼ばれるときの不整合に注意!

いくつかの処理から呼ばれるときの変数の不整合に注意しましょう。

どういうことかというと、次のようなイメージです。

  • 処理AでシングルトンクラスZの変数Zに1を格納する
  • 処理BでシングルトンクラスZの変数Zに2を格納する
  • 処理AでシングルトンクラスZの変数Zから1を取得するつもりが2を取得する
  • 処理BでシングルトンクラスZの変数Zから2を取得する

1つの器をいろんな処理からいじれるので、状態を変えられてもいいものは問題ありません。

しかし、処理ごとに状態をもちたい値は適しません。
例えば、シングルトンの変数に「DBコネクション」を保持させたりすると、SQL発行の前に別の処理でコネクションがcloseされてしまってエラーになる、といったことも起こります。

まとめ

今回はPythonでシングルトン(Singleton) を実装する方法と注意点をご紹介しました。
もう少し突っ込んだ注意点として、引数や__init__()に関する内容もご紹介しました。

なお、シングルトン以外でもPythonにはコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com