techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Python で配布用モジュールの作成

Python で配布用モジュールの作成

Python で、pip install でインストール可能なモジュールを作成する。

Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 

バージョンは3.6.3。
3.4 以降 setuptools が簡単に使えるようになっている。

準備

とりあえず書いたコードが PEP 8 準拠できているか確認する。

やらなくてもモジュール作成はできるので特にこのタイミングでやる意味はない。
(むしろコーディング中からマメに確認しておくべし)

PEP とは

PEP は Python Enhancement Protocol の略称。
コードフォーマットについてのベストプラクティス集がPEP 8。

ちなみに PEP 8 はStyle Guide for Python Codeで、PEP 257 は docstring のフォーマットについて触れている。どちらも一読すべし。

pytest/pep8

PEP 8 準拠できているかは pytest を使って確認できる。

pytest と pep8 プラグインのインストール

pip を使ってインストール可能。
これはグローバルに入れるべきか仮想環境に入れるかよくわからん。定石はあるのだろうか。
とりあえず仮想環境に入れる。

$ python3 -m venv .
$ source ./bin/activate
$ pip install pytest
$ pip install pytest-pep8

実行

上記インストールで py.test が使えるようになる。

$ pytest --pep8 ./panic.py 
============================= test session starts ==============================
platform darwin -- Python 3.6.3, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /Users/kazuhirofurue/work/hfpython, inifile:
plugins: pep8-1.0.6
collected 1 item                                                                

panic.py .

=========================== 1 passed in 0.02 seconds ===========================

違反がなければパスする。
違反箇所は丁寧に指摘してくれるので一つずつ修正していく。

ディストリビューションパッケージの作成

setuptools を使用する。
モジュール作成したいファイルと同じディレクトリに以下を用意する。

  • README.txt
  • setup.py
$ mkdir mymodules
$ cp panic.py mymodules
$ cd mymodules
$ touch README.txt
$ touch setup.py

setup.py

from setuptools import setup

setup(
    name='hoge',
    version='1.0',
    description='Hoge hoge tools',
    author='fuga',
    author_email='fuga@example.com',
    url='example.com',
    py_modules=['panic'],
)

最後にカンマあるのすごい違和感あったけど Python ではこれ許容だそうな。もちろん無くてもいい。

README.txt はひとまずファイルだけあればモジュール作成は可能。内容はまた今度。

setup.py を実行する。

$ python3 setup.py sdist
running sdist
running egg_info
writing panic.egg-info/PKG-INFO
writing dependency_links to panic.egg-info/dependency_links.txt
writing top-level names to panic.egg-info/top_level.txt
reading manifest file 'panic.egg-info/SOURCES.txt'
writing manifest file 'panic.egg-info/SOURCES.txt'
running check
creating panic-1.0
creating panic-1.0/panic.egg-info
copying files to panic-1.0...
copying README.txt -> panic-1.0
copying setup.py -> panic-1.0
copying panic.py -> panic-1.0
copying panic.egg-info/PKG-INFO -> panic-1.0/panic.egg-info
copying panic.egg-info/SOURCES.txt -> panic-1.0/panic.egg-info
copying panic.egg-info/dependency_links.txt -> panic-1.0/panic.egg-info
copying panic.egg-info/top_level.txt -> panic-1.0/panic.egg-info
Writing panic-1.0/setup.cfg
Creating tar archive
removing 'panic-1.0' (and everything under it)

これで tar.gz ファイルが出来上がる。
このファイルを配布すれば、以下のように pip でインストール可能。

$ pip install panic-1.0.tar.gz

その他

Download Python for Other Platforms にて紹介されている

Python for iOS
Pythonista is a complete development environment for writing Python scripts on your iPad or iPhone.

気になったので購入。

Pythonista 3 - omz:software

試しに Flask とか描いてみたら普通に iPad ローカル上で動いちゃってますな。
面白そうだけど多機能過ぎて使いこなせるかは怪しい。しかし面白い

Firebase Remote Configを使ってみる

Firebase Reote Configとは

アプリのアップデートを公開しなくても、アプリの動作と外観を変更することができます。

Firebase Remote Config は、アプリのアップデートをユーザーにダウンロードしてもらわなくても、アプリの動作と外観を変更できるクラウド サービスです。Remote Config を使用する場合は、アプリの動作や外観を制御するアプリ内デフォルト値を作成します。後から Firebase コンソールを使用して、すべてのアプリユーザーまたはユーザー層のセグメントに対してアプリ内デフォルト値をオーバーライドすることができます。アップデートを適用するタイミングはアプリ側で制御できます。アプリはアップデートの有無を頻繁にチェックし、パフォーマンスにほとんど影響をおよぼすことなくアップデートを適用することができます。

  • Firebase Reote Configとは
  • セットアップ
  • FirebaseRemoteConfigのインスタンスを取得する
  • デフォルト値を設定する
  • 値を取得する
  • RemoteConfigに値を設定する
  • RemoteConfigの値を取得する
  • まとめ
  • 参考
続きを読む

Firebase Cloud Messagingを使ってみる 前編

Firebase Cloud Messaging(FCM)は、メッセージを無料で確実に配信するためのクロスプラットフォーム メッセージング ソリューションです。

FCM を使用すると、同期可能な新しいメールやその他のデータがあることをクライアント アプリに通知することができます。通知メッセージを送信することで、ユーザーにアプリを再度アピールし、定着率の向上へとつなげられます。インスタント メッセージなどの用途では、メッセージで最大 4 KB のペイロードをクライアント アプリに転送することも可能です。

  • Firebaseプロジェクトの設定
  • コンソールからメッセージを送信する。
  • 参考サイト
続きを読む

RxSwift のドキュメントを読む

RxSwift のドキュメントを読む

RxSwift のリポジトリを眺めてたら丁寧に解説されてるっぽい Playground 発見。

RxSwift/Rx.playground at master · ReactiveX/RxSwift

「あ、こんなのあるのね」(知らんかった

なので読んでみた。

Playground によるインタラクティブなドキュメント、素晴らしい。

Setup

RxSwift/Contents.swift at master · ReactiveX/RxSwift

てな感じで、本 Playground の使い方も丁寧に書いてある。

  1. とりあえず RxSwift のリポジトリを clone
  2. RxSwift/Rx.xcworkspace を Xcode で開く
  3. Scheme から RxSwift-macOS を選択して Command + b
  4. Xcode の Command + 1Project navigator から Rx を開く
  5. Command + Shift + y で Debug Area を開く

これで準備完了

以下、読みながらメモしていく。

紹介

なぜ RxSwift を使うのか

  • イベントドリブンなコードを簡潔に書く
  • 以下のような処理を一貫して行うシステムが Rx
    • @IBAction ハンドラの記述
    • キーボードの位置変化を検出する監視
    • URLセッションの完了時の処理をクロージャーで渡す
    • キー値監視
  • RxSwiftは Reactive Extensions の公式実装

コンセプト

  • Observableの各インスタンスは単なるシーケンス
    • Observable シーケンス の、Swift Sequence に対する主な利点は、要素を非同期的に受け取ることができること
    • これがRxSwiftの本質
    • 他のすべてはこの延長
  • Observable(ObservableType)はSequenceと同等
  • ObservableType.subscribe(_ :)メソッドはSequence.makeIterator()と同等
  • ObservableType.subscribe(_ :)は、observer(ObserverType)パラメータをとる
    • このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
      • 返されたジェネレータでnext()を手動で呼び出す必要がない
  • Observableが next event(Event.next(Element)) を発行する場合、Observableはイベントを引き続き発行できる
  • Observableがエラーイベント(Event.error(ErrorType)) または完了イベント(Event.completed) を発行すると、Observableシーケンスはサブスクライバに追加イベントを発行できない
  • Sequence grammar を使ってこのことを簡潔に表現できる
    • next* (error | completed)?
  • marble diagrams を使ってより視覚的に表現することもできる
--1--2--3--4--5--6--|----> // "|" = Terminates normally

--a--b--c--d--e--f--X----> // "X" = Terminates with an error

--tap--tap----------tap--> // "|" = Continues indefinitely, such as a sequence of button taps

Observables and observers (aka subscribers)

  • Observablesは、サブスクライバが存在しない限り、サブスクリプションクロージャーを実行しない
  • 次の例では、Observableのクロージャは実行されない
example("Observable with no subscribers") {
    _ = Observable<String>.create { observerOfString -> Disposable in
        print("This will never be printed")
        observerOfString.on(.next("😬"))
        observerOfString.on(.completed)
        return Disposables.create()
    }
}
  • 次の例では、subscribe(_ :)が呼び出されたときにクロージャが実行される
example("Observable with subscriber") {
  _ = Observable<String>.create { observerOfString in
            print("Observable created")
            observerOfString.on(.next("😉"))
            observerOfString.on(.completed)
            return Disposables.create()
        }
        .subscribe { event in
            print(event)
    }
}
  • Observables をどう作成したかについては次章で紹介
  • subscribe(_ :) は、サブスクリプションなどの使い捨てリソースを表すDisposableインスタンスを返す
    • 通常は DisposeBagインスタンスに追加するなどして適切に処理する
      • Disposing の章で詳しく説明する

こんな感じか。

英語も平易だし読みやすい。

その他

Mac リプレースして Git の tab 補完を設定。

$ find / -name git-completion.bash
・
・
・
/Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
・
・
・

ということで ~/.bash_profile に以下を追記。

source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash

以上。