yoraba build

備忘録を兼ねた技術ブログ

PythonでExcelマクロを作成する

概要

 Excelの作業を自動化したいけど、VBはあまり書きたくないなぁ、という場合はxlwingsを使いましょう。 アドインも用意されていて、main関数を実行する、VBマクロを経由して任意の関数をコールする、数式内で使えるカスタム関数を定義するといったことができます。 今回はExcelの入ったWindowsPCでxlwingsを使用する方法について紹介します。

condaにインストール

 Windowsだと、Anacondaで環境を作ることが多いと思います。Anaconda Navigatorで簡単にインストールできます。 f:id:yoraba:20200628151558p:plain

アドインインストール

 コマンドプロンプトでインストール可能です。

xlwings addin install

 しかし、バージョンの指定が出来ません。最新のバージョンを入れたい場合は Releases · xlwings/xlwings · GitHubで最新版をダウンロードして、

xlwings addin status

で出力されるPATHのファイルを置き換えて下さい。

使い方

f:id:yoraba:20200628152824p:plain

Conda PathとConda Envを設定することで任意の環境で実行出来ます。

Run mainを押下し、現在開いているExcelと同名のpyファイルに定義したmain関数を実行

import xlwings as xw

def main():
    wb = xw.Book.caller()
    wb.sheets[0].range('A1').value = 'Foo'

VBマクロから任意のpython関数を実行

Sub SampleCall()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython ("import " & mymodule & ";" & mymodule & ".hello_xlwings()")
End Sub

数式で実行できるpython関数を定義

@xw.func
def hello(name):
    return "hello {0}".format(name)

f:id:yoraba:20200628154301p:plain 関数をインポートすると、 f:id:yoraba:20200628154445p:plain 数式バーから呼べる状態になります。

AWSのEC2インスタンスでnginx+uwsgiサーバーを立てる

EC2インスタンスの作成

f:id:yoraba:20200620191553p:plain  AMIとしてAmazon Linux 2を選びました。

Elastic IP

 EC2インスタンスは再起動の度に動的にパブリックIPが変動するとのことで、 Elastic IPというサービスで固定IPを作成し、EC2インスタンスに関連付けます。 インスタンスを複製して冗長性を持たせる構成でも、複数インスタンスに対して同一のIPを関連付けることが出来ます。

EC2のセキュリティグループ設定

f:id:yoraba:20200620191812p:plain  まずは、http通信が出来るように構成します。セキュリティグループ設定で、インバウンドルールにhttpを追加します。

サーバーへのファイル配置

色々と方法はあると思いますが、シェルスクリプトrsyncコマンドでアップロードとダウンロードが出来るようにしました。

  • アップロード
rsync -auz --delete -e "sudo ssh -i {秘密鍵PATH}" {ローカルディレクトリ} {EC2ユーザー}@{パブリック DNS }:~/
  • ダウンロード
rsync -auz --delete -e "sudo ssh -i {秘密鍵PATH}" {EC2ユーザー}@{パブリック DNS }:~/ {ローカルディレクトリ} 

サーバーセットアップスクリプト

  • nginxインストール
sudo yum install gcc git
sudo amazon-linux-extras install nginx1
  • python仮想環境の構築とuwsgiのインストール
sudo yum install python3
sudo yum -y install python3-devel
python3 -m venv python_venv
source ./python_venv/bin/activate
pip3 install uwsgi

サーバー設定

 今回は、/var/www/uwsgiをWEBサイトのルートディレクトリとします。 動作確認の為に以下のファイルを配置します。

  • /var/www/uwsgi/index.py
def application(env, start_response):
    main()
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World!"]

 以下、サーバーを動作させるための設定を行います。

  • /etc/nginx/nginx.conf  以下の部分の設定を変更します。
        root         /var/www/uwsgi;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass unix:/var/www/uwsgi/socket.sock;
        }

 rootにルートディレクトリを入力し、トップlocationのincludeにuwsgi_params、uwsgi_passにsockファイル出力PATHを設定します。 sockファイルは自動的に作成されるため予め用意する必要はありません。

  • /var/www/uwsgi/uwsgi.ini
[uwsgi]
master = True
socket = /var/www/uwsgi/socket.sock
chmod-socket = 666
wsgi-file = /var/www/uwsgi/index.py
stats = 127.0.0.1:9191
logto = /var/www/uwsgi/uwsgi.log
pidfile = /var/www/uwsgi/uwsgi.pid

 socketをnginx.confのuwsgi_passで指定したファイルPATHと一致させて下さい。

サーバー起動

 nginxとuwsgiを起動します。

sudo systemctl -l enable nginx
sudo systemctl -l start nginx
uwsgi --ini /var/www/uwsgi/uwsgi.ini

動作確認

 http://{パブリックDNS}でWebサイトにアクセス出来ます。 f:id:yoraba:20200620200300p:plain

AWSのサービスと設計の諸元

5Gの普及に伴い、高速な通信を活かしたシステムが増えていき、
仕事でもプライベートでもクラウドサービスに触れる機会が増えていくと考えております。
中でも知名度が高いAWSについて学習していく方針を立てました。

サービス

AWSは数十種類のサービスを提供しています。
利用者はシステム要件に応じて選択的に利用します。

コンピューティングサービス

  • EC2
  • EC2 Container Service
    • Docker運用サービス
  • EC2 Container Registry
    • Dockerイメージの保存と共有
  • AWS Elastic Beanstalk
    • Elastic Beanstalk
      • PaaS
    • 様々な言語で開発したアプリを自動デプロイ出来る
  • AWS Lambda
    • リクエストに応じて任意のプログラムを実行する
    • 常時稼働ではないのでコストが安価
  • Auto Scaling
  • Elastic Load Balancing

ストレージ&配信サービス

  • S3
    • データストレージサービス
  • CloudFront
    • コンテンツ配信サービス
  • EBS
    • EC2のストレージサービス
  • ElasticFileSystem
    • EC2の共有ファイルストレージサービス
    • 自動で容量を拡張、縮小する
  • Glacier
    • 使用頻度が低く長期保存するデータに適したストレージ
  • Import / Export Snowball
    • 大容量データ転送サービス
  • Storage Gateway

DBサービス

  • RDS
    • リレーショナルデータベース(RDBMS)の構築と運用
  • Database Migration Service
    • データベース移行サービス
  • DynamoDB
    • NoSQLデータベースの構築と運用
  • Amazon ElastiCache
  • Redshift

ネットワークサービス

  • VPC
    • プライベートネットワークを構築する
  • Direct Connect
    • オンプレミスネットワークとVPCネットワークを接続するコネクタ
  • Route
    • DNSシステムを構築する

その他のサービス

  • 開発ツール
    • CodeCommit
      • Git運用
    • CodeDeploy
      • 実行環境への自動配置
    • CodePipeline
      • 継続的デリバリーを使用したリリース
  • 管理ツール
    • CloudWatch
      • リソース監視
    • CloudFormation
      • テンプレートを使ったリソース作成と管理
    • CloudTrail
      • アクティビティと使用状況の追跡
    • Config
      • インベントリと変更の追跡
    • OpsWorks
      • Chefを使った自動化
    • Service Catalog
      • 製品の作成と使用
    • Trusted Advisor
      • パフォーマンスとセキュリティの最適化
  • セキュリティ
    • Identity and Access Management
    • Directory Service
    • Inspector
      • セキュリティの分析
    • CloudHSM
      • 暗号鍵管理
    • Key Management Service
      • 暗号鍵作成と管理
    • WAF
      • ファイアーウォール
  • 分析サービス
  • IoTサービス
    • IoTデバイスとの接続
    • ネットワーク管理、セキュリティ、データベース連携
  • モバイルサービス
    • Mobile Hub
      • アプリ構築、テスト、管理
    • API Gateway
      • RESTful API構築、管理
    • Cognito
      • ユーザーID、アプリケーションデータ同期
    • Device Farm
      • テスト
    • Mobile Analytics
      • アプリ分析
    • MobileSDK
      • 開発キット
  • アプリケーションサービス
    • AppStream
      • ストリーミング
    • CloudSearch
      • 検索
    • Elastic Transcoder
      • メディア変換
    • SES
      • Eメール送受信
    • SNS
      • プッシュ通知
    • SQS
      • メッセージキュー
    • SWF
      • アプリ間連携
  • エンタープライズアプリケーションサービス
    • WorkSpaces
      • 仮想デスクトップ
    • WorkMail
      • Eメールとカレンダー
    • WorkDocs
      • ファイル共有

デザインパターン

システム構成には一定のデザインパターンがあります。
設計者はデザインパターンを参考にインフラを設計します。
  • Multi Serverパターン
    • 複数のサーバーを立てて、ロードバランサで処理を振り分ける
  • Scale Upパターン
    • サーバーのスペックを動的に拡張、縮小する
  • DB Replicationパターン
    • 障害に備えてデータベースを複製する
  • Functional Firewallパターン
    • サーバーの論理的なグループを単位として、アクセス制限をかける

リージョンとアベイラビリティゾーン

リージョンは国家や地域的なデータセンター群のグループ、
アベイラビリティゾーンはリージョン内のグループです。
アベイラビリティゾーンは物理的に独立しているため、ゾーン間の通信に費用がかかります。

データ解析のための統計モデリング入門(緑本)

統計モデルを学ぶ教材として有名な緑本に登場する数式やグラフをPythonで書いていきます。n番煎じですが、同じ本でも人によって読み解き方が違ってくるので、無価値ではないと思っています。