Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

Python3エンジニア認定基礎試験に合格した話

Python3エンジニア認定基礎試験とは?

「一般社団法人Pythonエンジニア育成推進協会」が実施している民間試験。
通年を通して試験が行われており、全国のオデッセイコミュニケーションズCBTテストセンターで受験が可能です。なお、受験料は1万円(税抜き)。

一般社団法人Pythonエンジニア育成推進協会は、ビッグデータPython市場の隆盛に備えて設立された団体だそうです。

www.pythonic-exam.com

なぜ受験を考えたのか?

社内で以下記事の画像(取得したい資格)について話していた時である。

人気沸騰のIT資格、取得したい資格ランキング | 日経 xTECH(クロステック)

AWSGCP等のクラウド系の資格に人気があり、注目される中、真ん中にPythonという特定の言語の資格がえらい人気・・・
そこで、上司が・・・

上司「KodakAWSの資格(SAA)持ってるんだし、このPythonの資格受けてみれば?」

Kodak「うーん・・・(しばらく考える)」
(調べてみると合格率も高そうだし、今期は私自身プログラミング力を上げることを目標にしていたし、受けてみるか)

Kodak「受けてみます!」

と、あまり深く考えずに、とりあえず受けてみることにしました。

合格までの道のり

本試験の問題は、オライリー本の「Pythonチュートリアル」から出題されます。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

が・・・この「Pythonチュートリアル」は一般公開されているので、必ずしも購入する必要はありません。

docs.python.org

私も書籍は購入せずに、一般公開されている情報だけで、合格できました。

1. 決めること

こういった資格の勉強は、ダラダラやっても頭に入らないので「まず、2週間後に受験しよう」ということを決めました。

2. あとは時間の許す限り写経

勉強時間は個人差が出てくると思いますが、Pythonチュートリアルを2周(写経あり)しました。

3. 模擬試験に挑戦

以下で模擬試験を受けることができます。 7〜8割とれてれば大丈夫(自信に繋がる)でしょう。

DIVE INTO EXAM

個人的重要ポイント

1. try...except(catch)...else!?...finally

例外処理にelseを入れることができます。
elseは、tryでエラーがでなかった場合にのみ処理が実行されます。
他の言語を見ても、tryにelseを入れた処理を見たことがなかったので、重要ポイントに入れました。

>>> try:
...     num = 5 * 5
... except Error:
...     print('Error')
... else:
...     print(num)
... finally:
...     print('hoge')
...
25
hoge
>>>

2. for...else!?

今度は、forにelseを入れることができます。
forでbreakされなかった場合にのみ処理が実行されます。
こちらも他の言語ではなかなか見ないですよね。

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

3. インタプリタ、_

ここは重要です。忘れやすいし、知らない人が多いと思います。
インタプリタでのみの仕様ですが、'_'は、最後に実行された結果が格納されています。

>>> fuga = 10 * 10
>>> fuga
100
>>> _
100

感想

書籍を購入する必要がなかったので、かかったのは時間と受験料(1万)だけ。
これだけでプログラミングの勉強ができて、合格すれば資格が貰える・・・こんなにコスパの良い資格は他にないと思います。

Pythonを勉強したい方は、まずはこの資格獲得を目標にして勉強するのが良いかもしれません。
テストやお金が掛かる(受験料)と本気で勉強しようと思えるので、良いきっかけになると思います。

ポートフォリオサイトを作った話

年初に言っていた自身のポートフォリオサイトを作成する目標が、やっと達成できました。

www.tama-kodak.com

本当なら3,4ヵ月くらいで作るつもりでしたが、私自身の知識不足と病気(胃腸炎腸炎・風邪など)でなかなか前に進まず・・・苦労しました(涙
コンテンツは少ないですが、見てあげてください。m(_ _)m

使用技術について

SPAです。フロント側はVue.jsで作って、AWSのS3にホスティングさせています。

工夫した箇所

1. ダークモードを取り入れた。
macOS Mojaveから導入されたダークモード(時間帯によって画面の表示スタイルが変わるモードのこと)。 これをWebサイトでも実現できたらおもしろいんじゃないかなぁと思い、自身のポートフォリオサイトに取り入れてみることにしました。

f:id:special-moucom:20190525230140p:plain

このホワイトモードとダークモードの切り替えは、AWSのLambdaで行っています。
S3にモードを切り替え用のJSONファイルを置いておいて、そのモードの切り替えをLambdaでしています。

2. デザイン力の無さはライブラリでカバー!
最初は地道にデザインを考えていたのですが、自身のデザイン力の無さに挫折。
結局、BootstrapVueやSnowfといったライブラリを取り入れることにしました。しかし、ただライブラリを使うのでは面白みがないと感じたので、アニメーションを入れてみました。

f:id:special-moucom:20190525230146p:plain

3. デプロイの自動化
毎回、S3にビルドしたファイルを置くのが面倒に感じたので自動化しました。CodePipelineを使ってGitHubと連携させて、Pushしたら自動でビルド、デプロイさせるようにしました。

AWS全体図

全体としては、以下のような作りになりました。

f:id:special-moucom:20190525225934p:plain

API用のJSONファイルのホスティング先をどうするか悩みましたが、CloudFrontのマルチオリジンBehavior機能を使いました。

学んだこと

  • 自分はCSSが苦手だった。デザイン力もなかった。
    実際に作ってみて、自分はCSSが苦手であること。デザイン力がない事を実感しました。
    とくにアニメーションやトランジションの使い方がわからず、すごく悩みました。(色々な方に聞いたと思いますが、改めて「ありがとうございました。」)
    次回作に向けて、CSSに対する苦手意識をなくすこと。ライブラリの使用を最初から検討すること。など、新たな目標や考え方が身についたので、活かしたいと思います。

  • Vue.jsがまだまだ 実際に物を作ってみると、自分のVue.jsに対する知識がまだまだであることを実感させられました。
    使えると便利なので、もっと学んでいきたいと思います。

  • 永遠のLv2
    ポートフォリオサイト作成時に自身のスキルの棚卸しをしたのですが、改めて自分の中途半端さに気が付きました。(得意分野が無い・・・)
    この永遠のLv2から脱出するのも1つの目標となりそうですorz

f:id:special-moucom:20190525230719p:plain

最後に

今回、自身のポートフォリオサイトを作ってみて、色々と勉強になりました。(自身のスキルの中途半端さにも気づけましたorz)
技術的なことは、なにかあればQiitaの方にも書いてみたいと思います。

GW中に「リーダブルコード」を読み直した話

GW・・・終わってしまいましたね。
今回は10日間の長い連休でしたが、私自身は子供の相手をしたり、腸炎になったり・・・と、なかなかゆっくりできなかった連休でした(涙
そんな中、「リーダブルコード」を読み直したので、その感想を書いていきます。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコードとは?

「良いプログラムコードとは、他人が読みやすいコードである。」という事を前提に置いて「では、他人が読みやすいコードを書くにはどうすれば良いのか?」という疑問に応えてくれる本です。
この前提は正しく、読みやすいコードはプログラムの品質(バグの早期発見)に繋がります。
変数の名前から処理の方法まで、どうすれば分かりやすく、見やすいコードを書けるようになるのかを1つずつ例を出しながら説明してくれています。本書の内容についても、オライリー本では珍しく読みやすくなっています。

なぜ読み直そうと考えたのか?

  • その1. 転職後(コードを書くようになってから)読み返してみたかった
    以前「リーダブルコード」読んだのは転職前(コードを書いていない時代)でした。なので、転職後(コードを書くようになってから)に読み返すと、また違った見方で読めるのではないかと思いました。

  • その2. 自分のコードに自身が持てない
    名前が大事だ!コメントは完結に!等、以前読んだ時の内容は少し覚えていました。しかし、曖昧に記憶している部分が多く、すでに自分のコードに自身が持てなくなっていたので、自身のコードと見返しながら読みたいと思った。

読み直して感じたこと

  • 「リーダブルコード」の内容こそが、リファクタリングの観点だと気づいた
    以前「テスト駆動開発」の本を読みました。(残念ながら、いまだにTDDの実践投入ができていない状態ですが・・・) kodak.hatenablog.com TDDにおける「リファクタリング」という部分が、まさに「リーダブルコード」に該当するところでした。
    本書でもテストコードの部分に触れており、テストコードの読みやすさについて書かれている部分がありました。TDDを知ってから読み返したことで、本書を「リファクタリング」という見方で読むことができました。

  • 本書を活かすところが全然ないと感じる =「気づいていない」だけでは?
    この記述は、付録にありました。私自身、これはすごく感じます・・・が、きっと本書の通り「気づいていない」だけなんでしょうね。
    本書を読んだ後で、自分の書いたコードが直ぐに本書の通りになるか?といえば、それは「NO」です。付録にも書かれていますが、「継続すること」が大事だそうです。と、読み返す事で、色々と気づいていない事に気づけました。

最後に

「リーダブルコード」は、やはり良い本だと改めて再認識しました。
読み直しを行う事で、改めて色々と再認識した部分があり、非常に勉強になりました。また、本書は薄い本なので、さらっと読み返すには丁度いいです。 また定期的に読み返したいと思います。

【strapi】HeadlessCMSのstrapiを触ってみた

前回の記事では、HeadlessCMSの概要について書きました。

kodak.hatenablog.com

今回はHeadlessCMSのstrapiを触ってみた記事を書いていきます。

strapiとは?

APIを簡単に作成できるオープンソースのHeadlessCMSです。
まだアルファ版ようですが、完成度が非常に高く、GUIAPIを簡単に作ることができます。
ちなみにstrapiは、Node.jsで作られています。

strapi.io

私が動作確認した時のバージョンは以下の通りです。

  • Strapi 3.0.0-alpha.24.1
  • Node 10.3.0
  • npm 6.4.1

インストール

まずは、以下手順にそってStrapiのインストールとプロジェクトの作成を行います。

Quick Start Guide | Strapi Documentation

npm install strapi@alpha -g
strapi new cms --quickstart

quickstartオプションをつけると、データベースはSQLite3が自動で選択されます。
quickstartオプションをつけずにコマンドを実行して、Customを選ぶとデータベースはSQLite3、MongoDB、MySQL、Postgresから選択できます。
ちなみに、strapiはMongoDBを押しているようです。

APIを作る

ユーザー登録をして、管理画面に入るとAPIを直接作ることができます。
コンテンツタイプ作成からコンテンツタイプの名前を決めて、フィールドを選びます。
注)コンテンツタイプの名前は必ず単数形にしてください。(コンテンツタイプの名前はAPIの名前にもなります。APIは自動で複数形になります。)

f:id:special-moucom:20190503235759p:plain

APIの公開範囲を設定

上記でAPIの作成は完了しています。自動で以下APIが作成されています。

  • count ・・・ コンテンツタイプのデータをカウント
  • create ・・・ コンテンツタイプにデータ追加
  • destroy ・・・ コンテンツタイプからデータを削除
  • find ・・・ コンテンツタイプ内のデータ検索
  • findone ・・・ コンテンツタイプ内のデータ検索(id検索)
  • update ・・・ コンテンツタイプ内のデータ更新

しかし、APIはデフォルトでは未公開の状態になっています。
ロールと権限から(とりあえず)Publicを選択して、自動で作られたAPIの公開範囲を設定します。

f:id:special-moucom:20190503235905p:plain

APIを実行してみる

APIcurlコマンドや、ブラウザから直接URLを叩いてみます。
こんなに簡単にAPIが作られるなんて、衝撃ですよね!!

f:id:special-moucom:20190503235925p:plain

どのような仕組みでAPIが実装しているのか?

では、この自動生成されたAPIはどのようにして実装されているのか、少し深掘りしてみます。strapiのプロジェクト内では以下のようなディレクトリ構成でAPIが作られていることがわかります。(MVCモデルを採用しているようです。)また、strapiのマニュアルを読むと改良時にコードを書くべき場所も指定されていました。

f:id:special-moucom:20190503235942p:plain

少し改良を加えてみる

お題:

コンテンツタイプGoogleuserコンテンツタイプのuidには、重複可能なデータを入力することができてしまう。これを重複できないようにしたい。

回答:

■controllers(変更)

  create: async (ctx) => {
    // 自動生成されたコードはコメントアウト
    // return strapi.services.googleuser.add(ctx.request.body);
    // 登録するuidをカウントしてデータがあるかを確認する。カウント結果が0以外は400エラーを発生させる 。
    if ( await strapi.services.googleuser.uidcount(ctx.request.body) !== 0 ) {
      return ctx.response.badRequest('invalid query');
    }
    return strapi.services.googleuser.add(ctx.request.body);
  },

■services(追加)

  uidcount: async (values) => {
    // query関数を呼び、where句を指定してcount関数を呼び出す
    return Googleuser.query(function(qb){
      qb.where('uid', '=', values.uid );
    }).count();
  },

実行結果:

uid : test-uidのデータを追加するとエラーコード400を返す

$ curl -X POST -H "Content-Type: application/json" -d '{"uid":"test-uid"}' localhost:1337/googleusers
{"statusCode":400,"error":"Bad Request","message":"invalid query"}$

uid : test3(未登録)のデータを追加する登録したコンテンツタイプのデータを返す

$ curl -X POST -H "Content-Type: application/json" -d '{"uid":"test3"}' localhost:1337/googleusers
{"id":23,"uid":"test3","created_at":1556893121297,"updated_at":1556893121297}$

こんな感じでcontrollersとservicesに改良を加えていけば、APIに改良を加えたり、新しいAPIも作ることができそうです。

感想

strapiの完成度の高さに驚きました。なによりGUIで簡単にAPIが作れるのに凄く驚きました。Node.jsで作られているので相性が良いFirebaseと組み合わせて作ると面白そうです。
他にも説明しきれていない機能もたくさんあるので、ちょいちょい見つけたらまた記事にしたいと思います。

ヘッドレスCMSとは?ヘッドレスCMSの概要について調べてみた

私は、CMSWordPress等)を使って仕事をすることがあるのですが、社内であまり聞き慣れない「ヘッドレスCMS」という言葉を耳にしたので、少し調べてみることにしました。

ヘッドレスCMSとは?

ただのCMSとは異なるアーキテクチャで作られたCMSのこと。 CMSWordPress等)は、Webページ(フロントエンド)と管理(バックエンド)が1つに統合されています。

しかし、ヘッドレスCMSはそのWebページ(フロントエンド)と管理(バックエンド)を分けようという構造(アーキテクチャ)から産まれたCMSです。そのため、バックエンドとフロントエンドは各々の開発に集中することができ、CMSもページを管理しないことで、CMS本来の目的であるコンテンツ管理に重点を置くことができます。

このフロントエンドとバックエンドの分けようという構造(アーキテクチャ)を「デカップルド・アーキテクチャ」と呼ぶそうです。

カップルド・アーキテクチャの名前の由来

これがなかなかユニークでおもしろいです。
「2つの〜、結びつける〜」の意味を持つ"couple"(カップル)に否定の"de"をつけて「デカップル」(decouple)という言葉からこの名前が産まれたそうです。 この"couple"(カップル)を指すのは、フロントエンドとバックエンドの事ですね。

詳しくはここを読ませていただきました。
「ヘッドレス」とは?Drupalにおけるデカップルド・アーキテクチャについてご紹介。 | さくらのナレッジ

フロントエンドとバックエンドを分けて考えるとは?

一番オーソドックスな考え方は、バックエンドでAPIを実装して、そのAPI経由でフロントエンドにデータを渡す方法です。
RESTful APIやGraphQL APIを使う方法ですね。
そのため、CMSでよく利用されるテンプレートの用意は必要無く、フロントエンドは自由にWebページを作ることができます。
バックエンドもフロントエンドを意識する必要が無く、開発できます。

上記までの内容を纏めてイメージ図で書いてみると、こんなイメージ。

f:id:special-moucom:20190423230030p:plain

ヘッドレスCMSのメリット・デメリットを考えてみる

個人的に色々と考えてみたのですが、以下メリット・デメリットがあるように思えました。

メリット

  • フロントエンドとバックエンドが並行して作業が可能。
  • 上記にも書きましたが、バックエンドとフロントエンドが各々の開発に集中することができる。
  • テンプレートを意識した設計をしなくて良い(SPA等のフロントエンドモダンな設計も可能)

デメリット

  • テンプレートを使用しないため、開発難易度・コストは高い。
  • APIに対する知識、とくにセキュリティ周りには気を配る必要がある。

ヘッドレスCMSの種類

「ヘッドレスCMS」の種類はこちらで紹介されています。

headlesscms.org

Contentfulなどは、名前だけは聞いたことがあるのではないでしょうか。
あと、CMSの代表であるWordPressにもREST APIの機能を備えているので、ヘッドレスCMSとしても使うことが可能です。

というわけでヘッドレスCMSを使ってみよう!

こちらは次回に書きたいと思います。使ってみるのは「Strapi」です。