MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

入門記事:Pythonエンジニアとして仕事をする上で知っておく必要があるもの

入門 Python 3

入門 Python 3

メモ

今まで自分用メモとかとしてこのブログを使っていたため、脈絡がないプログラミング記事が多かったのですが、Pythonメインにエンジニアリングを仕事にして数年経過し、ふとPython入門したいなと思っている人がいる気がしたので、書いてみます。今後ちょくちょく増やそうかなって思ってます。

この記事の主な想定読者

  • プログラミングに興味がある方
  • プログラミングを勉強してみたい方
  • Pythonを仕事で使ってみたい方
  • ソフトウェアエンジニアになりたいかも、興味あるかもという方
  • プログラミングを仕事にしたい方

と、言う感じかな・・・なるべく色々な方がコードを書く楽しさを見出せるように頑張ってみます^^

Pythonを使ってエンジニアとして仕事する」とは

Pythonを使ってソフトウェアエンジニアとして、仕事するということは、色々なケースがあると思いますが、多くの場合もう少し厳密に定義すると見通しが良くなるかと思います。

すなわち、Pythonでプログラムを何か書いて動くようにする、その成果物のプログラムを誰かが特定の目的を達成するために使える状態にする」と書くと何をすべきかもう少し明確になるかなと思います。

今回はPythonで書いてますが、勘の良い方はすでにお気づきかと思いますが、実はこれはPythonに限りません、PythonPHP,JavaScriptRuby・・・と色々言語を変えても成り立つわけです、例えばRubyでプログラムを何か書いて動くようにする、その成果物のプログラムを誰かが特定の目的を達成するために使える状態にする」というのがRubyで仕事をする場合の定義のひとつになりえるわけですね。

このPythonでプログラムを何か書いて動くようにする、その成果物のプログラムを誰かが特定の目的を達成するために使える状態にする」ことを仕事としている人をこの記事ではとりあえず"Pythonエンジニア"と定義しておきます。

Pythonエンジニアとして仕事するときのよくあるサイクル

一例ですが、こんな感じです。

お客から「こんなアプリを作って欲しい」と依頼が来る
↓
コードをPythonで書く
↓
目的の動きをするアプリが完成
↓
お客が使えるようにする

という感じです。

Pythonエンジニアとして仕事するときに必要な諸々

ざっとこれくらいできれば仕事するには不足はないでしょう。

  • Linux/Unixのコマンドが扱えること
  • Git/Githubが使えること
  • Pythonの基本文法が理解できていること
  • Djangoがつかえること
  • Webサーバーについて基礎的な理解があること
  • SQLとデータベースの基礎的な理解があること
  • HTMLが多少いじれること
  • herokuかAWSがある程度使えること

これでPythonでプログラムを何か書いて動くようにする、その成果物のプログラムを誰かが特定の目的を達成するために使える状態にする」という仕事の多くの依頼はこなすことができるはずです。

Pythonエンジニアとして仕事するときに必要な諸々とそれぞれの必要な理由

先程定義した"Pythonエンジニア"として仕事を進めるためには、何を結局できるようになったらいいんでしょうか?そこをざっくり書きます。(類似ツールもたくさんある箇所がありますがそうすると逆にわかりにくくなるので一例として紹介しています。)

  • Linux/Unixのコマンドが扱えること

理由:今から下記に述べるツールや概念を動かすにはLinux/Unixのコマンドが使えることが前提になります。これは魔法の呪文のようなものでPythonで書いたプログラム○○動け!」 と唱えるとプログラム○○が動くというイメージで、パソコンの中でpython ○○.pyとある場所に書くとPythonで書いたプログラム○○動け!」 と唱えるのと同じ効果でプログラム○○が動くという仕組みです。このコマンドは英語を略した2文字とか3文字で動くことが多いので、最初は戸惑うかもしれませんが、パソコンと英会話をしているようなノリですぐに身につきますのでご安心あれ^^

  • Git/Githubが使えること

理由:書いたコードを保存したり、チームで共有できるから。実際Github以外にも似たサービスはいっぱいあるのですが、一番メジャーなのは最近だとGithubなので紹介しました。Gitは無料のツールでパソコン内部でコードの保管とか履歴が残せるものです。Githubは同じ機能をWebのマイページに保管できるものです。無料でも使えますし、有料と言っても1000円くらいで色々便利に使えます。 これは、Linux/Unixのコマンド基礎が身についていればすぐ習得できます。

  • Pythonの基本文法が理解できていること

理由:これは言わずもがなですが、念のため載せました。Python教則本は書店にわかりやすいものがいっぱいあるので、好きなものを読めば身につくと思います。文法についてはそんなに時間かからないと思います。賞味2週間〜1ヶ月あれば身につく方多いと思います。

理由:Djnagoはジャンゴと読みます。Pythonの基本文法だけでは、Pythonエンジニアとして仕事をするには、仕事がかなり限定的になります。そこでDjangoを使うエンジニアが多いです。Djangoは、Python業界では世界的シェアがある、信頼性の高い、Webアプリやモバイルアプリの裏側(専門的に言うとサーバーサイド)を作れるツールです。例えば有名所ですと、インスタグラムはDjangoユースケースとして有名です。Djangoがとりあえず安心感のあるツールとして紹介しておきますが、別途同じような機能があるツールとしてはFlaskなどあります。このDjangoが一番挫折しやすい難関の一つだと思います。賞味3ヶ月〜を学習コスト見積もっておいたほうが良いです。

  • Webサーバーについて基礎的な理解があること

理由:前段の定義_「Pythonでプログラムを何か書いて動くようにする、その成果物のプログラムを誰かが特定の目的を達成するために使える状態にする」__の、成果物のプログラムを誰かが特定の目的を達成するために使える状態について、最近では主にスマホで使えるモバイルアプリ、ブラウザで使えるWebアプリという形式になることが多いです。この両方のアプリ開発において、どこかの企業の仕事の効率化のアプリを運用には、大抵顧客情報や、取引情報といった大量のデータをどこかに保管する必要があります。モバイルアプリであれ、Webアプリであれ、現在、大量の情報はWebサイトにページ情報が表示される仕組みと同じ仕組みでスマホやブラウザに特定のコンピュータ(サーバーと呼びます)から引っ張ってくるのがほとんどです(小規模なアプリであればスマホ自身に保存などもありますが、情報が消えないようにするリスク管理を考えると業務用は外部サーバーを使います)。しかし、これについては最近では便利なツールがありますから、概念の基礎理解があればOKですので習得時間は少なめで大丈夫ですからご安心を・・・^^ 具体的なソフト名としてApache(アパッチ)とnginx(エンジンエックス)は覚えておきましょう。どちらかを使うことが多いです。 なおソフトは無料です。

  • SQLとデータベースの基礎的な理解があること

前段のWebサーバーについて基礎的な理解があることで述べました「顧客情報や、取引情報といった大量のデータをどこかに保管」ですが、実態は、エクセルの巨大なものに情報が保管されていることが多いです、この巨大エクセルをデータベースと呼び、例えばMySQL(マイエスキューエル)、PostgreSQL(ポストグレエスキューエル)という名称のデータベースソフトを利用します。こちらも無料です。このデータベースに命令をするのは、実はPython言語ではなく、SQLという言語になります。しかし、ご安心を。最低限モードならSQLは直接書かなくても大丈夫なことが多いです。直接SQLを触らなくても前述のDjnagoが使えればPythonで命令を書くことができるのです。という観点からもDjangoの活用ができることは重要です。

  • HTMLが多少いじれること

Django(Webアプリフレームワーク)〜 画面出力に関して、最終的にはHTMLでの表示になることが多々あり、HTMLを直接使わなくとも、HTMLの情報のやりとりの通信規格について理解しておかないと修理(デバッグ)などができないため、HTMLの知識は必要です。これは直感的にわかりやすいのですぐに楽しく学べると思います。

  • herokuかAWSがある程度使えること

自分のパソコンでPythonコードを書いても納品時は自分のパソコンで動くことは想定していません。(例えばお客さんが遠隔操作するときに、自分のパソコンを常に立ち上げておく・・・なんてしませんよね。お客の取引情報がすべて自分のパソコンで動いていて、電源が落ちるなどのハプニングでもあれば、即座にクレームというのは想像しやすいかなと思います。)この外部のPCに自分の書いたコードを引っ越しさせて、遠隔で動くようにする作業のことは業界でデプロイと呼ばれています。このデプロイをするためのツールで有名なものがheroku(へろく)とAWS(エーダブリューエス(そのまんまですが・・・)、Amazon Web Service。アマゾンが世界中で利用してきた通販の仕組み、システムを間貸ししてくれるサービスというイメージでとりあえず。最近ではAWS事業も相当アマゾンの核心事業になっています)です。herokuは無料で使え、AWSは最初の1年は無料枠がありますので色々試しやすいです。なお、グーグルも同じようなサービス(GCP,Google Cloud Platform)あり、これも人気上昇中です。他にも色々類似サービスありすぎますが、割愛します。Djangoの習得の次にそびえる最後の難関です、賞味2ヶ月以上〜くらいで基礎は身につくと思います。ここまで習得できれば自信がついてくると思います!

あとがき

今日は気合をいれて長文書きました〜 誰かのヒントやモチベーションのきっかけになったらいいな^^


お気軽に押していただければ励みになります^^


Python(Django)でAWS boto3を使う際のエラー```Unable to locate credentials```対応法

Django

Django

どんなにときにエラーが出るか

今までエラーが出なかったんです。それでついいつもどおり使っているとエラーが出てしまったので調べたところ・・・対応策がわかりました。まずは通例を提示します。

よくある例

import boto3

s3 = boto3.client('s3')

s3.upload_file(....続く

AWS Lambdaの場合はこれで動きました。 多分AWS内部で動くコードだから(クレデンシャル情報省いて大丈夫だったのか?!)

動かない場合

herokuのサーバーに上げると、直接AWSじゃないからか、Unable to locate credentialsエラーがでて、動きませんでした。

解決策

次のようにクレデンシャルキー情報を引数に入れると無事エラーなく動きました^^ ちなみにこれはDjangoのコード(くわしくはmodels.py)で動作確認済みです。

import boto3

s3 = boto3.client('s3',
        aws_access_key_id=***key***, #Djangoならsettingsから引っ張ってきたり、環境変数登録で隠せます
        aws_secret_access_key=***key***, #Djangoならsettingsから引っ張ってきたり、環境変数登録で隠せます
        region_name='****region***' #東京リージョンならap-northeast-1
        )

s3.upload_file(....続く

参考

inokara.hateblo.jp

vue.js開発過程記録vol.x:各コードの分析メモそのx:Djangoとの比較イメージメモ

f:id:k_mawa:20180617021558p:plain

経緯など

ちょっと既存のWebアプリ(Django/Python)に非同期処理をアプリにかけたいのでvue.jsを特訓することになったので、メモを残していきます。目標はWebAPIを叩けるようにするアプリです。

Djangoとの比較

今回はVue.jsとPythonフレームワークDjangoとの比較をしてみました。

自分がDjangoを日常的に使うので、理解を深めるためです。Webアプリのフレームワークの側面がともにあるため類似部分も見つかったのでDjangoユーザーの方にはもしかしたら役立つ資料になるかもしれないです。

比較イメージなので、完全に1対1対応してないのであいまいです。ざっくりイメージをつかむためなので厳密ではないです。

番号 Vue.js Django 備考
1 src/router/index.js projルート(settings.pyがある場所)/urls.py + settings.pyのINSTALLED_APP部分 URLまわりとアプリ適用設定
2 src/components/ app
3 src/components/hoge.vueの<script>部分 app/views.py
4 src/components/hoge.vueの<template>部分 template.html
5 src/components/hoge.vueの<style> template.html+staticファイルディレクトリからのインポート
6 src/assets staticファイルディレクト
7 src/main.js projルート(settings.pyがある場所)/settings.py(予想。検証中)
8 src/App.vue projルート(settings.pyがある場所)/settings.py(予想。検証中)
9 (用語)データバインディング render関数とテンプレートタグ HTMLへの出力

引用・参考書籍

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

この書籍のVue.jsの実装例を引用して仕組みを理解していきたいと思います。

Djangoでフォームを介さずにインスタンスを複製する方法

Django

Django

どんなにときにつかえるか

例えばブログ機能アプリで、以前つくった記事を複製して再利用するときに利用できます。

フォームインスタンスをつくって、そこに生成したインスタンスを入れ込むForm(~~~, instance=instance)、そしてセーブすると、単に呼び出したインスタンスがアップデートされるだけ。

これで本文などのフィールドの値が同じで新しいPKのインスタンスが複製されるのです。便利^^v

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1

blog.pk = None
blog.save() # blog.pk == 2

↑下記公式ドキュメントより引用↑

.pk = Noneとするだけ^^

参考

stackoverflow.com

Making queries | Django documentation | Django

技術日誌:業界専用のメールの一斉送信アプリをつくった

最近つくっていたものがリリースできた

こういのものを仕事で作りました。とりあえずベータ版リリース完了ということで・・・ f:id:k_mawa:20180819001914p:plain

自分は不動産業界向けのツールを作ることが多いのですが、今回もその一環で、不動産業界に特化したマーケティング用のメール一括送信というかなりのスタンダードなツールで、とりあえず無料から格安で使えるように設定している。

こちらが現物。
www.notifymail.tech

システム構成

基盤が、 Django(2.0)+heroku+AWS S3

という自分の最近のおきまりのパターンに加え、

タスク管理が Cerely+Redis

月額制の課金APIが Stripe

と、システム的にはわりとホットなところを押さえたつもり・・・

ということで、今回はCerelyとStripeの実装の勉強になったのが嬉しい^^

jumbotronのサイズがモバイルでも、PCブラウザでもなんとなく画像の意図が伝わるように配置しなおすのが11回もかかって苦労した・・・苦笑 あとはチュートリアルブログも苦労した・・・ と、いうわけでお盆明けから頑張った!

決済APIならStripeがおすすめです。概要メモ。

Stripeの紹介と概要メモ

メモ

仕事でStripeをよく使いますが、便利なので紹介記事を書きます。情報量が多いので段々更新していきますので、最初ちょっとメモの走り書きみたいな部分も多いと思います、すみませんm( )m

概要

  • 普及している決済API(らしい)

  • APIが比較的わかりやすい(という印象)なので実装負担が少ない。

  • Djangoでも使えるのでPythonユーザーにはプラス(Django1.9、Django2.0で動作確認済。PHPでもRubyでもOKで、かなりカバー範囲広い。)

  • 決済会社がなくなるケースもあるが、Stripeは世界的に大きい会社みたいなので、API消滅リスク相対的に低め。(例WebPayは日本だけで展開してたが、サービス終了してしまった。ドキュメントが日本語でいいなと思って使おうかとした矢先のニュースでビビった。自分は使ってないけど、別の決済APIをつかうコード変更は想像しただけですごくすごーく面倒・・・)

  • ドキュメントが英語しかない(2018年8月8日現在。)ので日本語ドキュメントがほしい場合はGoogle翻訳などを活用する必要あり

基本的な仕組み

  • 基本的な仕組みは都度決済、定期購読、カード情報の変更など色々な処理を実装するのに、常に2つに分けられる。シンプルだと思う。①checkout.js(stripe.js)をフロントエンドのHTMLに設置(HTMLの<form>。サーバーサイドのコードにカード情報を秘密のトークンにして送信できる。これにより生の情報は常にstripe側が保管し、開発者はカード情報漏洩リスクを取らなくてよくなるという優れもの) ②サーバーサイドにトークンを送って、そのトークンを元にカード所有者別にStripeのAPIで決済処理ができる。

最低限おさえるべきオブジェクト

  • できるオブジェクト①顧客オブジェクト(親)-紐付き-②カードオブジェクト(子) ③商品オブジェクト(親。単発取引なら③でおわり)-紐付き-④プランオブジェクト(子。定期購読の場合。定期購読商品の内容)

顧客オブジェクト生成時の基本事項

  • 顧客オブジェクト(親)-カードオブジェクト(子)(一番最初の登録時には顧客オブジェクトとカードオブジェクトは同時に生成される(Checkout.jsから生成されるトークンにより。)。

定額課金の場合のAPIの仕組み

  • 定期購読オブジェクト <= 顧客オブジェクト(親)と商品オブジェクト(親)-プランオブジェクト(子)を引数に生成

Celery複数タスクをスケジュールする方法

コメント

Django+Celeryで非同期処理でスケジューラー登録しているタスクは現在ひとつですが、この度複数にする必要があり、複数タスクをスケジュールに組み込む方法を探しました。

参考資料

公式ドキュメントに例そのままは見つけられなかったのですが、StackOverflowにはありました。これを試します

stackoverflow.com

これで無事動きました!

#settings.py

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    'add-every-300-seconds': {
        'task': '<app名>.tasks.test_def',
        'schedule': timedelta(seconds=300),
        'args': (16, 16)
    },
    'add-every-60-seconds': {
        'task': '<app名>.tasks.test_def_two',
        'schedule': crontab(minute='*/1'), #1分毎に実行
        'args': (16, 16)
    },
    'abc': {
        'task': '<app名>.tasks.test_def_three',
        'schedule': crontab(minute='10', hour='0', day_of_month='1'), #月初の0時10分に実行
        'args': (16, 16)
    },
    'defgh': {
        'task': '<app名>.tasks.test_def_three',
        'schedule': crontab(minute='10', hour='0', day_of_month='1-30'), #毎月1〜30日までの期間は毎日0時10分に実行
        'args': (16, 16)
    },
}

CELERY_TIMEZONE = 'Asia/Tokyo'