GAミント至上主義

Web Monomaniacal Developer.

東銀座でビズオーシャン勉強会参加者募集 Dockerとかビッグデータとか

ビズオーシャンで技術力向上と伝える力の強化のために社外の人も交えた勉強会をやりたいと思っています。

希望者はコメントください。

日時

希望者が3人ぐらい集まったら随時開催。平日夕方、夜がやりやすそう。

とりあえず今期中、2018年3月まで

料金

無料

GCP代は各自で。

お題

bizocean本体よりも、新規サービス開発から得た情報が多いです。

1. Docker入門

なぜDockerを使うのかから基本的なコマンドまで。

現在社内の新規開発は、開発環境から本番まで、ほぼすべてDockerを使っています。

2. 予算の少ないビッグデータ基盤oceanusの動かし方

Container Engine(Kubernetes)、BigQuery、HTTP LoadBalancer等GCPを活用して、月3万以下のインフラコストでbizoceanのデータ収集、解析を行っているoceanusを自分の会社で使いたい向け。

ソースコードは下記
GitHub - uyamazak/oceanus: Save all data to Google BigQuery. Fast and row cost using Docker and Kubernetes on GCP

3. MastodonをフルGCPで運用する方法

もはや私用インスタンスと化している下記の建て方を説明します。

mstdn.bizocean.co.jp

4. Google Cloud Datalabを使って機械学習

DatalabというかJupyterの基本的な使い方から、BigQueryのデータから、Pandasのデータフレーム化、skleanのロジスティック回帰などを行う流れとか

現在インターンの大学生に、ブログを書いてもらっています
bizocean-nakayama.hatenablog.com

Django&Python3で一時ディレクトリだけで複数ファイルのZIP圧縮を済ませる

Djangoでフォームで受け取った複数のファイルを、パスワード付きZIPで固めてmodelに保存したかった。

Pythonの標準モジュールzipfileではpass付きを展開はできても、作成はできないのでpyminizipを使う。

ファイル名と、中身を別々に渡せれば一時ファイルでもいいんだけど、pyminizipにはファイルパスのリストを渡す必要がある。


その際、一時ファイルを使ってしまうと、ファイル名がランダム文字列になってしまうので、フォームから送られてきたファイル名を維持するために一時ディレクトリを使い、その中にアップロードされた名前でファイルを作成する。

with文を使ってるので、closeとかの処理が省けるし、ブロックを抜けた時にすぐ消えてくれるので気持ちがいい。


コードは実コードをサンプル用に手を入れてるので動かなさそう。


views.py

import os
import pyminizip
from tempfile import TemporaryDirectory
from .models import ZipFile


def index(request):
    if request.method == 'POST':
        form = MailForm(request.POST, request.FILES)
        if form.is_valid():
            # djangoのフォームからファイル取り出す
            received_files = request.FILES.getlist('file_field')
            password = "pass"
            temp_file_list = []
            with TemporaryDirectory() as temp_dir:
                # ZIPファイルの名前には最初のファイルの名前を拡張子zipにしてつかう
                zip_path = os.path.join(temp_dir, os.path.splitext(received_files[0].name)[0] + '.zip')
                for f in received_files:
                    # pyminizipに渡す時に一時ファイルのままだと、名前がランダムな感じで良くないので
                    # request.FILESから取り出すして使う
                    temp_path = os.path.join(temp_dir, f.name)
                    with open(temp_path, "wb") as tmp_f:
                        tmp_f.write(f.read())
                    temp_file_list.append(temp_path)
                pyminizip.compress_multiple(temp_file_list,
                                            zip_path,
                                            password, 2)
                temp_zip = File(open(zip_path, "rb"))

        # djangoのmodel
        zipfile = ZipFile()
        # zip_pathのままにしてしまうと、/tmp/xxxの階層つきでZIPに入ってしまうのでファイル名だけ渡す
        zipfile.file_field.save(os.path.basename(zip_path), temp_zip)
        zipfile.save()

Django1.10 QUICKSTART-BOOK with Python3: 作りながら学ぶDjangoアプリケーション開発

Django1.10 QUICKSTART-BOOK with Python3: 作りながら学ぶDjangoアプリケーション開発

Django×Python (LLフレームワークBOOKS)

Django×Python (LLフレームワークBOOKS)

1日で理解するDjango超基礎入門

1日で理解するDjango超基礎入門

mastodonのアップデート時にrails assets:precompileが、Compiling webpacker assets で止まる

フルGCPで運用している社内用インスタンス( http://mstdn.bizocean.co.jp )でオリジナルイラストができたのでアップデートしようとしたら、

Binary found at /mastodon/node_modules/node-sass/vendor/linux_musl-x64-48/binding.node
Testing binary
Binary is fine
node-sass@4.5.2 /mastodon/node_modules/node-sass
Done in 37.82s.
Webpacker is installed 🎉 
Using /mastodon/config/webpack/paths.yml file for setting up webpack paths
Compiling webpacker assets 

で止まってしまった。

検索したらどうやらメモリ不足らしい

Rebalance Allocation fails when compiling assets · Issue #2883 · tootsuite/mastodon · GitHub


そういえば先週サーバー代をケチるために、n1-standardからsmallにしたのを思い出した。その時は問題なく終わっていた。

たかが静的ファイルの準備ごときでサーバーをスケールアップさせる必要があることに苛立つ。smallといえども1.7GBあるのに。RailsのせいなのかRubyのせいなのか。

せっかくDockerのコンテナを使って、少ないリソースでたくさんの仮想マシンを動かすことができたのに、中身がメモリを喰うのでは話にならない。

oceanusで使っているコンテナとくらべて、GKE上でのコンテナの立ち上がりも遅いので、デプロイや開発スピードにも影響がでる。

PythonDjangoでは管理系コマンドで待たされたり、メモリ不足になったことはないので、個人的にRubyRailsはやっぱり重い、という印象をmastodonの運用で上書きすることとなった。