Python 3 エンジニア基礎認定試験RTA(96時間52分)

背景と目的

この記事は次のような目的で記述されている。

  • 目的:2019年2月時点のPython 3 エンジニア基礎認定試験に関する攻略情報提供
  • 対象:これから試験を受けようとしているが、Python 3 の実務経験がない人
  • 注意:以下は資格取得のための攻略情報であり、言語習得のためのものではない

試験の概要と利得

公式サイト見ようね。
基礎試験 | 一般社団法人Pythonエンジニア育成推進協会

資格としての個人的な評価は以下の通り。

  • 初学者のお尻に火をつけるためのたいまつとしてはある程度機能する。
  • python を勉強するお気持ちがあることもアピールできる(あくまで"お気持ち")。
  • python を実務で使えるかどうかを示すものでは無い。
  • 一般価格 10,800円(10,000円+消費税8%)は正直割高。

4択*40問という試験構成からある程度の雰囲気は察してほしい。
以下のような状況があるなら取得を検討する余地があると感じた。
全て当てはまらないなら正直あまりおすすめできない。

  • pythonに関してある程度の下地がある
  • pythonを業務で使うことが確定している
  • 他に同種の資格を持っていない/受けられない
  • 学割が使える or 石油王である

学習環境

自分の場合は次のものを利用させて頂いた。

  1. 攻略情報:「Python3エンジニア認定基礎試験の効率的な勉強方法!」(Webページ)
  2. 演習問題:Progate(プログラミング学習サービス)※有料(月額980円)
  3. テキスト:python 3 チュートリアル(紙の本)※有料
  4. テキスト:python 3 チュートリアル(Webページ)
  5. 実行環境:google colaboratory(pythonのオンライン実行環境)
  6. 演習問題:DiveIntoCode(模擬試験提供サイト)

特に有料の記述がないものは2019年2月時点では無料である。

基本的には1の攻略情報で計画を立てた後、2のアプリでざっくり勉強し、
その後4のテキストを読む→5の実行環境で触ってみるのが良いと思う。
アプリのPythonコースVが終わり、テキスト5章までの内容を実行環境で動かしたら、
6の模擬試験を触っていくのがよい。

その後は模擬試験で見つけた知識の欠損を
泥縄式にhelp()ったりぐぐったりして埋めつつ本番まで過ごすとよいだろう。

個別のパーツのレビューを以下に示す。

  • 攻略情報:「Python3エンジニア認定基礎試験の効率的な勉強方法!」(Webページ)

Python3エンジニア認定基礎試験の効率的な勉強方法!

「5.4 (重要)「Pythonチュートリアル 第3版」の出題範囲ごとに~」が素晴らしい。
おすすめのテキストに関しては自分は結局紙の本を使ってしまった。

  • 演習問題:Progate(プログラミング学習サービス)※有料(月額980円)

prog-8.com

最初に手を付けるコンテンツとしておすすめ。
PCサイトでも学習できるが、スマートフォンアプリになっている。
移動中や隙間時間に使えるのが素晴らしかった。
あとにんじゃわんこがめっちゃかわいい。すき。

なお、Progate内のPythonの教材はIからVまであり、
Vまでの内容がだいたいPythonチュートリアルの2~5章、9章をカバーしている。
冒頭の攻略記事にもある通り、この試験ではチュートリアル
2~5章、8~10章の内容が出題全体の8割(32/40)となっているため、
ProgateのPython講座は結果的にかなり効率のいい資格取得用教材になっている。

ただし、Progateではチュートリアル8、10章(エラーと例外、標準ライブラリ)の
内容はほぼノータッチであるため、この後でフォローが必要になる。

docs.python.jp

Webページの方が良かった。訳もこなれており、読みやすい。
紙の本はファングッズ的な扱い。

読むだけでは到底頭に入らないため、次項のcolaboratoryを別タブで開いて
コードをちょこちょこ書きながら進めるのがよい。

  • 実行環境:google colaboratory(pythonのオンライン実行環境)

colab.research.google.com

とにかく神。
googleアカウントさえ持っていれば何の準備もいらず、
ブラウザ上で動作する実行環境が手に入る。

Progateはじめ様々な学習サービスが「Web上で実行可能」を売りにしているが、
Pythonに関してはcolaboratoryが王の中の王であり、
全てを燃やし尽くす神の光である(ポエム)。

  • 演習問題:DiveIntoCode(模擬試験提供サイト)

diver.diveintocode.jp

アカウント登録は要るが、かなり良心的な模擬試験提供サイト。
範囲ごとに偏りはあるものの、おそらく60~70問程度のストックが裏にあり、
再受験するたびに問題の入れ替えが起こる仕組み。
よって、繰り返し受けてもそこまで陳腐化しない内容になっている。

自分はprogateのVを終えた後、チュートリアルを1~5、8章まで
colabで動かしてみた状態(開始72時間)で初受験し625/1000(不合格)だった。
その後、落とした問題についてチュートリアルを引きつつ復習し、
数回模擬試験を受けていたが結局850点を越えることはなかった。

なお、模擬試験はあまり温存せず、わりと早い段階で触るのがよいと思う。
というのも、この試験には模試抜きでは準備しにくい部分がそこそこあるからだ。

具体的には、プログラミングの知識を択一問題にする過程で、
出題形式がそれなりに癖のある形式に落とし込まれていること、
公式の出題範囲にこっそり付記されている
「また、一般的な知識からも出題されます。」の中身が
若干マニアックであることが主な理由である。

タイムと得点

自分のタイムは96時間52分、得点は850/1000で合格だった。
なお、計測開始は思いつきで試験を受けようと決めたタイミング、
計測終了は試験終了後に会場から出たタイミングとした。
そのため睡眠時間や飲み会の時間(期間中2回あった)、
なんかだらだらした時間、仕事の時間もタイムに含まれている。

  • 計測開始地点 2019-02-07 15:23

 

  • 計測終了地点 2019-02-11 16:15


以上、あんまり褒められた内容ではないが1万円が無駄にならなくてよかった。
今月はこれをベースにAtCoderとかいうネトゲをやろうと思っているので楽しみ。

ITパスポートを受けたりFEを受けたりしたの巻

無能をさらす

 いつもお世話になっております。
 情報システム部のmatsuzakidでございます。

 前回の更新からはや4ヶ月が過ぎましたので、とりあえずその間にやったことをもろもろ書こうと思います。

ITパスポート試験を受けました

 情報システム部のくせにシステムを知らないというクソザコカメムシだったため受験。
 勉強のために準備したのは以下のテキストとアプリ。

  • テキスト

amzn.asia

  • アプリ

play.google.com


 結論から言うとアプリでしか勉強できなかった。
 テキストはMONEYを消費することで自分を焚きつける役にしかたってない。
 なおドリルも買い、そちらもほとんど使ってない。

 ただ、基本的に経営系・マーケ系の問題は初見でほぼ回答できたので、
 この勉強法が他人に進められるかは分からない。

 最終的にスコアはこうなった。

基本情報処理技術者試験を受けました

 一昨日である。
 こちらも引き続きテキストとアプリを準備した。
 おいコイツなんも学んでねえぞ。

  • テキスト

Amazon CAPTCHA

  • アプリ

play.google.com


 やはり結論から言うとアプリでしか勉強できなかった。
 が、ITパスポートに比べると、テスト全体の対策&長文に慣れるという意味でテキストは必要だった。
 とりあえずこれから自己採点してきます。

  • 結果

 やったぜ。

今年も残すところあと3時間ちょっととなったがPython 3環境を作る

12月の土日は常に風邪でぶっ倒れていたので、その埋め合わせをしておきたい。
いや、本当に土日だけ寝込んでいたんです。最終週は力尽きて月曜病欠したけど。

別にデータサイエンティストを目指しているわけではないが参考はこれだった

qiita.com

つまりAnaconda is godということらしい。
そしてインストール自体はSQL server 2014 expressにドハマリした時に息抜き的に終わっていた。

f:id:Matsuzakid:20161231204518p:plain

おいこの記事書く前からもう半分終わってるじゃねえか。

しかしPythonというかコードの書き方全般を忘れている

もともと覚えていたかどうかもあやしい。
そもそも僕がPythonを触ったのは、半年前の就活でプログラミングの成果物を求められた際、

→実験はHSPで試作してからSuperLabで本番を作る
→が、SuperLabはプログラミング言語ではなくただのGUI実験メイカー。しかもRunOnlyEditionがないと提出先で動かない。
→実験はHSPで書き直してもいいレベルの単純なものだが、刺激自体を表に出すには出身研究室に確認を取るのが筋。
 だが出身研究室に連絡をとるのは避けたい(死ぬほど迷惑をかけ通しだったので顔をあわせづらい)
→せっかくだからPythonでも触ってみるか
→3日で突貫工事

というクソクソアンドクソな経緯で触ったものだった。
しかもそのとき触ったのはPython 2だった。

……これはもう、貯金は0と考えた方がいいな。
ていうかAnacondaのどこから触ればいいかも分からない。

ほんでこのJupyterとかいうのもわからない

分からないことはぐぐりましょうね。

qiita.com

qiita.com

……うーんぐぐっても分からない。
とりあえずPython3はドットインストールに有料コースがあるからそれからかな。

f:id:Matsuzakid:20161231210607p:plain

IPythonでHelloWorldは打てたからとりあえずこれくらいで。
来年もよろしくお願いいたします。

……あ、これ↓に参加することにしました。
自分にはわりと大きな負担だけど、独学だとなかなか身につかないしね。

connpass.com

SQL serverで擬似乱数生成を含むビューとプロシージャを作る

 せっかくのクリスマスイヴなので、乱数生成を含むビュー&ストアドを作ってみる。
 いや、クリスマスイヴは関係ない。申し訳ない。

1からnまでの乱数を生成する

 大変ありがたいことに、T-SQLには擬似乱数を返すRAND()が存在する。
 返り値は浮動小数点数(float)だそうだ。……浮動小数点数ってなんだ?

 ぐぐった。

kaya-soft.com

  • decimal(p,s)
    • 固定小数点型の数値。numericも同じ。
    • 桁数指定ができる。pは値全体の桁数。整数部(p-s)桁、小数点以下s桁となる。
    • 小数点以下は指定した桁数で丸められる。
    • 整数部は指定した桁数を超えた場合は算術エラーになる。
  • float
    • 浮動小数点型の数値。
    • 整数部と小数部を合わせて、realは4桁、floatは8桁まで。値によって小数点の位置を変える。
    • 桁数制限に引っかかり次第、小数点以下を丸める。

 固定小数点型の精度は一定だが容量を食う、
 浮動小数点型の精度は不定だが容量をとらない、といった感じだろうか。

 普段はデータ削減の要がなければ固定小数点型を使った方がよさそう。
 でもRAND()が返す値は基本的に整数部が一桁(0.~ か 1.000 のどちらか)。
 よって、今回はあまり関係なさそう。

 とりあえずSQLでクエリを走らせてみる。

SELECT RAND(), RAND()

f:id:Matsuzakid:20161224165824p:plain

 元気に乱数っぽいものを出してくれる。
 「擬似」乱数とわざわざ名乗るからには色々込み入った問題があるんだろうなー。
 そこには深入りしない。

 これを材料に、1からnの整数を作る。

select
    -- 1から2のランダムな整数を出力
    CONVERT(int,RAND() * 2)+1
    -- 1から12のランダムな整数を出力
    ,CONVERT(int,RAND() * 12)+1 

 できた。
 次はこれをストアドにする。

1からnまでの乱数を生成するはずだった

 今度はこのへんを参考にした。
 途中までMySQLの記事を読んでいた。つらい。

www.atmarkit.co.jp

outofmem.tumblr.com

 とりあえず書いてみる。
 返り値が全然わかってない。

USE AW4me
go

ALTER PROCEDURE [dbo].[KBS_FUNC](
        --プロシージャ名のかっこの中に引数や返り値を指定する
        --引き数はこんな感じ 今回はデフォルトで3を入れる
        @KBS_i_1 int = 3
        --返り値はこんな感じ
        ,@KBS_o_1 varchar(max) = '' OUTPUT
    )
    --引き数と返り値の設定が終わったらAS
    AS
    --BEGIN~ENDでブロックを作る
    BEGIN
        --変数の宣言
        --繰り返しの変数を入れる
        DECLARE @i int;
        --乱数のための変数も入れる
        DECLARE @r int;
        --結果出力のための文字列入れを作る
        DECLARE @vartmp varchar(256);
        DECLARE @varOUT varchar(256) = '';

        --繰り返しの数を1に設定
        SELECT @i = 0;
        
        --繰り返し処理を開始
        WHILE @i < @KBS_i_1
            BEGIN
                --1から3の乱数を作ってrに入れる
                SET @r = CONVERT(int,RAND() * 3)+1;
                --@rが1なら金
                IF @r = 1
                    BEGIN
                        SET @vartmp = '金';                
                        --次の単語があるようならカンマを入れ、ないようなら!を入れる
                        IF @i = @KBS_i_1 - 1
                        --次の単語なしなら'!'
                        SET @vartmp = @vartmp + '!';
                        ELSE 
                        SET @vartmp = @vartmp + '、';
                    END
                ELSE
                    BEGIN
                        --@rが2なら暴力
                        IF @r = 2
                            BEGIN
                                SET @vartmp = '暴力';                
                                --次の単語があるようならカンマを入れ、ないようなら!を入れる
                                IF @i = @KBS_i_1 - 1
                                --次の単語なしなら'!'
                                SET @vartmp = @vartmp + '!';
                                ELSE 
                                SET @vartmp = @vartmp + '、';
                            END
                        ELSE
                            BEGIN
                                --@rが3ならSEX
                                IF @r = 3
                                    BEGIN
                                        SET @vartmp = 'SEX';                
                                        --次の単語があるようならカンマを入れ、ないようなら!を入れる
                                        IF @i = @KBS_i_1 - 1
                                        --次の単語なしなら'!'
                                        SET @vartmp = @vartmp + '!';
                                        ELSE 
                                        SET @vartmp = @vartmp + '、';
                                    END
                                ELSE
                                     SET @vartmp = @vartmp + '';
                            END
                       END
                --vartmpをvaroutにくっつける
                SET @varout = @varout + @vartmp
                -- カウンタを++する
                SET @i = @i + 1
            END
        SET @KBS_o_1 = @varout
        print @KBS_o_1
    END


f:id:Matsuzakid:20161224180744p:plain

 気づいたらKBSトリオの発言をランダムに出力するストアドを作っていた。
 僕は何をやっているんだ。

 トリオなら引き数に3を、カルテットなら引き数に4を指定すればランダムにKBS発言を行う。
 BEGIN~ENDの仕様が本当にどうしようもないのだが、もうちょっとなんとかならないのだろうか。

 結果を眺めていたが、KBS発言の成立はなかなか難しいようだ。
 もしかすると乱数に偏りがあるのかもしれない。

 本当は関数にしたかったが、FUNCTIONだとRAND()が書けなかった。
 うーん。

 以下、とりあえず当初作ろうと思っていた処理も作っておいた。
 殴り書きだ。

CREATE PROCEDURE [dbo].[RANDINT](
        --プロシージャ名のかっこの中に引数や返り値を指定する
        --引き数はこんな感じ
        @start int
        ,@end int
        ,@return int OUTPUT
    )
    --引き数と返り値の設定が終わったらAS
    AS
    --BEGIN~ENDでブロックを作る
    BEGIN
       SET @return = CONVERT(int,RAND() * ( @end - @start + 1 ) ) + @start ;
       RETURN ;
    END

 呼び出して結果を確認したい場合はこのように書く。

DECLARE @out int;
EXECUTE RANDINT 20,30,@out OUTPUT;
PRINT @out;

 ビューもついでに書いてみる。

--ビューの作成練習

--DBを指定
use AW4me
go

--クエリを書き出す
--新しく作るときはCREATE, 変えるときはALTER
CREATE VIEW V_RandomMonth_Order
as
--今回はSELECT文
SELECT
     Soh.[OrderDate] --オーダーの日付
    ,COUNT(DISTINCT Cu.[CustomerID]) as CustomerCount  --顧客の数
    ,COUNT(DISTINCT Cu.[PersonID]) as PersonCount   --Personの数
FROM Customer Cu --カスタマーテーブルが基盤
LEFT OUTER JOIN Person pe ON Cu.[PersonID] = Pe.[BusinessEntityID]  --パーソンテーブルを結合
INNER JOIN SalesOrderHeader Soh ON Soh.[CustomerID] = Cu.[CustomerID]  --オーダー概要テーブルを結合
INNER JOIN SalesOrderDetail Sod ON Sod.[SalesOrderID] = Soh.[SalesOrderID] --オーダー詳細テーブルを結合

where
--今日と同じ日付
 SUBSTRING(CONVERT(varchar(100),Soh.[OrderDate]),1,2) --オーダーの月
 = 
 CONVERT(int,RAND() * 12)+1 -- 1から12のランダムな整数を出力
GROUP BY Soh.[OrderDate] --日ごとに集計

 仕事で使う場合は、どうもカーソルとやらを使いこなさなければいけないらしい。
 できるかな~。

SQLのサンプルデータベースを材料にViewを作ってみる

システム日付の月と同じ月の発注延べ人数のVIEWを作る
create view tekito as

SELECT
     Soh.[OrderDate]
    ,COUNT(DISTINCT Cu.[CustomerID]) as CustomerCount
    ,COUNT(DISTINCT Cu.[PersonID]) as PersonCount
FROM Customer Cu
LEFT OUTER JOIN Person pe ON Cu.[PersonID] = Pe.[BusinessEntityID]
INNER JOIN SalesOrderHeader Soh ON Soh.[CustomerID] = Cu.[CustomerID]
INNER JOIN SalesOrderDetail Sod ON Sod.[SalesOrderID] = Soh.[SalesOrderID]
where  SUBSTRING(CONVERT(varchar(100),Soh.[OrderDate]),1,2) = SUBSTRING(CONVERT(varchar(100),SYSDATETIME()),6,2)
GROUP BY Soh.[OrderDate]

このVIEWを元に帳票系をしこしこ出力するバッチとか
ストアドを使って日次更新したテーブルをやっぱりVIEWにしてしこしこ出力するバッチとか
出力したcsvをあれこれするpythonをかいたりしたいです(どれもまだできない)