GAミント至上主義

Web Monomaniacal Developer.

Python3でipaddressモジュールを使って、IPアドレス認証を行う

本番環境のWEBアプリケーションで、デバッグ情報を表示させる際、サーバー情報なども全部さらけだすので、最低限IP認証だけ行いたいと思った。

IPアドレスの文字列比較なら簡単だけど、できればネットワークアドレス(192.168.0.0/24等)で許可できると便利。

検索した所、python3からは標準でipaddressというモジュールがあるのを知った。Googleが作ったipaddrが元になってるらしい。

21.28. ipaddress — IPv4/IPv6 操作ライブラリ — Python 3.5.2 ドキュメント


下記のような感じで書いてみた。

許可するIPのリスト名はDjangoのsettings.pyから取った。

strでカンマ区切りで指定して後で分割する。

import ipaddress

INTERNAL_IPS_V4 = "192.168.0.0/16,127.1.1.1"


def is_internal_ip(client_ip_str) -> bool:
    internal_ip_list = INTERNAL_IPS_V4.split(",")
    client_ip = ipaddress.ip_address(client_ip_str)
    for internal_ip in internal_ip_list:
        ip_network = ipaddress.ip_network(internal_ip)
        if client_ip in ip_network:
            return True

    return False

ipaddress.ip_networkは、/なしで普通のIPアドレスを指定すると/32があるとして良しなにしてくれるので、IPアドレスとネットワークアドレスが一緒でも問題なく動いた。

>>> is_internal_ip("192.168.50.1")
True
>>> is_internal_ip("192.167.50.1")
False
>>> is_internal_ip("127.1.1.1")
True
>>> is_internal_ip("127.1.1.2")
False
>>> is_internal_ip("127.1.2.1")
False
>>> is_internal_ip("255.255.255.0")
False
>>> is_internal_ip("192.168.277.777")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/oceanus/app/common/utils.py", line 77, in is_internal_ip
    client_ip = ipaddress.ip_address(client_ip_str)
  File "/usr/local/lib/python3.6/ipaddress.py", line 54, in ip_address
    address)
ValueError: '192.168.277.777' does not appear to be an IPv4 or IPv6 address


そもそも与えられたclient_ip_strがIPアドレスとして正しいかは見ていないので、変なの入れるとエラーが出るけど、自分で設定するんだから大丈夫だよね。

入門 Python 3

入門 Python 3

データ解析インターンの予定を立ててみる

以前の記事でインターン募集をしていましたが、1件応募があり、採用の方向で進んでいるので、ざっくり今後のスケジュールを立ててみる


前提条件いろいろ

対象

大学2年生

マーケティングに興味があり、データ分析、プログラミングのインターンを探していた。

プログラミング未経験

期間

週2で6ヶ月以上

就活が本格化するまで。

目的

大学生

就職活動のため

自社側

会社の知名度アップ

社員(自分)の教育能力を付けるため

採用のため

前提条件以上。




まずゴールを設定。

ゴール

ざっくりだけど

仕事ができる人にする(なる)

bizocean自体も書式で仕事を効率よくできるようにするサービスだし、インターン生を仕事ができる人にできるのであれば、採用にも、教育スキル的にも良いと判断できそう。


求めること

自社社員との世代ギャップを活かした視点、発見。


評価軸

面談はよくやるけど、ただ「データ解析のインターンしてました」だけだと就活の時に弱い気がする。

実際にその過程と成果がネット上で見られるようになっていれば、履歴書にURL書くことでかなりアピールできそう。

そのため、成果物として3つを設定。

- bizoceanの技術ブログを執筆
- データ分析を行いグラフ、レポートの作成
- 企画、提案資料を作成

この3つをメンターが質的に、アクセス数などを量的に判断して評価する。

スケジュール

当たり前だけど途中のサポートや進捗確認はメンターがする。

入門 ~2、3ヶ月

bizoceanとは

まず、データはうちのbizoceanのアクセスデータ、行動データ、会員データなどを使うので、うちのビジネスはなにか、そのデータが何を意味しているのか、どうやって記録しているのかを知ってもらう。

www.bizocean.jp

社員にインタビューして、先入観などを知るのもいいかも。

途中成果として、「bizoceanとは○○○である」みたいなのを100個書くとかもいいかな。大学生の視点で出すと既存の社員には意外かもしれない。

データ分析とは

まだ簡単なところしか手を付けられてないけど、どういった手順でデータを可視化していくのかを見てもらう

Pythonと環境について

データ解析にはJupyterのGoogleカスタマイズである、Google Cloud Datalab上でPythonを書き、BigQueryからデータを取って使ってもらう。

アプリ開発よりはPythonで覚える必要がある範囲が狭いので(Pythonで使うライブラリが限られているという意味)、実際に動かしながら基本的な文法、エラー対処に慣れてもらう。

実践 ~2、3ヶ月

テーマを考える

bizoceanと、データについて理解してもらったら、自身の興味や、会社の課題に合わせて、データを使って何をするのかのテーマを決めてもらう。

一つだけだと視野が狭くなるので、2、3個以上とする。

できれば既存の社員の思い込みを打破し、新しい発見となるようなものがいい。


- bizocean会員は実は○○だった!
- bizocean会員が辞める本当の理由
- こういうコンテンツがあれば、会員は○○万人増やせる!

さっき拾った記事だけどこういうフレームワーク使うのもありかも
medium.com

資料作り

データを使って、テーマについて資料を作成する

発表

月一の全体会議にて発表


絶対内定2018 インターンシップ

絶対内定2018 インターンシップ

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

CeleryでWokerとbeatを同時起動する

タスクキューイングができるCeleryを使っているけど、一部認証が1時間で切れる箇所があり、期限切れの前に定期的に再認証を行う処理が必要になった。

そのため、Celeryでcron的なことができるbeat機能を使った。

Periodic Tasks
Periodic Tasks — Celery 4.0.2 documentation

ドキュメントから下記部分を参考に再認証処理を追加

from celery import Celery
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)
Setting these up from w


最初はworkerの他にbeatの起動が必要なのを知らずに、全然動かんと思ってしまった。

しかし、今回の再認証処理は、同一インスタンス内で再認証するので、別プロセス、別コンテナ(Docker)になってしまうと、全く意味がない。

なんとか一プロセスでworkerとbeatを起動できないかと思ってたら簡単にできるよう。

stackoverflow.com

python manage.py celery worker --beat

 ※--beatの代わりに-Bでも同じ


が、ドキュメントを見てみると
Periodic Tasks — Celery 4.0.2 documentation

this is convenient if you’ll never run more than one worker node, but it’s not commonly used and for that reason isn’t recommended for production use:

あまり一般的ではなく、本番環境ではおすすめしないとのこと。

Worker内で行う再認証などは、素直にWorker内で完結させたほうが良さそう。



Celery、リトライ、時間制限(1秒に1回だけとか)、cronのような定期実行までできて便利すぎてやばい。