pythonでiPhoneアプリを作るまで

Shizuoka.pyでpythonでiPhoneアプリを作る紹介をしたけど、さらっと流しただけで環境構築には触れなかったのでメモっておく。

iPhoneアプリ開発者登録をする

Titanium MobileでもObj-Cでもそうですが実機転送するためには開発者ライセンスがいるのでよろしく設定しておいてください。お金かかります。

Kivyのインストール

プラットフォームに応じたバイナリをダウンロードしてきてインストール。OSXの場合はアプリケーションフォルダにドラッグドロップして、make-symlinksをクリックしてシンボリックリンクを張る。

Kivy

これでkivyコマンドが使えるようになってmac上でアプリ開発ができる。

iOS用の設定

注) 1.6.0では安定版ではないのでそのつもりで。

KIvy for iOSに書いてある手順で。

  1. brewで必要なライブラリを入れる
  2. build_all.shでビルド
  3. create-xcode-project.shでテンプレートを用意して開発
  4. xcodeで開いてrunすると実機転送

という仕組み

pythonでpptxを作ればGit管理下におけて素敵

Shizuoka.pyお疲れ様でした、想定以上のヒトに参加していただいて感謝しております。特に今までお会いしたことのなかった静岡のPythonistaにお会いできて満足です。

それからpygamessユーザーとお話できたのも嬉しかったです(あまり製薬業界以外で使われているとは思わなかったので)。

また、懇親会で良い感じの場所を提供していただいたphotoにも感謝!

python-pptxでつくったスライドのソースを張っておきます。水着ループはたった 4 行のコードでひたすらアイドル水着画像をあつめる(Python だよ)を参考にしました。

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

from pptx import Presentation
from pptx.util import Inches, Px
import re
import requests

prs = Presentation()
title_slidelayout = prs.slidelayouts[0]
bullet_slidelayout = prs.slidelayouts[1]

shapes = prs.slides.add_slide(title_slidelayout).shapes
shapes.title.text = 'Pythonでpptx'
shapes.placeholders[0].text = 'Pythonでpptx'
shapes.placeholders[1].text = '@kzfm'

shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = 'GUIに頼らずpptxを作れると素敵'
tf = shapes.placeholders[1].textframe
tf.text = 'パターンの再利用'
tf.add_paragraph().text = '作業の自動化'
tf.add_paragraph().text = 'Sphinxに慣れすぎた'
tf.add_paragraph().text = 'powepointたまに死ぬ(->発狂する)'

shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = 'python-pptx'
tf = shapes.placeholders[1].textframe
tf.text = 'https://github.com/scanny/python-pptx'
tf.add_paragraph().text = 'pip install python-pptx'
tf.add_paragraph().text = '開発はじまったばかり'
tf.add_paragraph().text = '超期待!'

shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = 'アイドル水着画像をあつめてpptxに貼る'
top = Inches(2)
left = Inches(0.5)
width  = Px(280)
height = int(width * 1.427)
txBox = shapes.add_textbox(left, top, width, height)
txBox.textframe.text = """c = requests.get('http://matome.naver.jp/odai/2135350364969742801').content
urls = [x.group(1) for x in re.finditer(r'<img src="(.+)".*?class="MTMItemThumb".*?/>', c)]

for i, url in enumerate(urls[:10], 1):
    img_path = "{}.jpg".format(i)
    r = requests.get(url)
    if r.status_code == 200:
        img = r.content
        with open(img_path, 'w') as f:
            f.write(img)
        shapes = prs.slides.add_slide(bullet_slidelayout).shapes
        shapes.placeholders[0].text = '水着アイドル ({})'.format(i)
        top = Inches(1.5)
        left = Inches(3)
        width  = Px(280)
        height = int(width * 1.427)
        pic = shapes.add_picture(img_path, left, top, width, height)
"""

c = requests.get('http://matome.naver.jp/odai/2135350364969742801').content
urls = [x.group(1) for x in re.finditer(r'<img src="(.+)".*?class="MTMItemThumb".*?/>', c)]

for i, url in enumerate(urls[:10], 1):
    img_path = "{}.jpg".format(i)
    r = requests.get(url)
    if r.status_code == 200:
        img = r.content
        with open(img_path, 'w') as f:
            f.write(img)
        shapes = prs.slides.add_slide(bullet_slidelayout).shapes
        shapes.placeholders[0].text = '水着アイドル ({})'.format(i)
        top = Inches(1.5)
        left = Inches(3)
        width  = Px(280)
        height = int(width * 1.427)
        pic = shapes.add_picture(img_path, left, top, width, height)

shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = 'このスライドはpython-pptx製'
tf = shapes.placeholders[1].textframe
tf.text = 'スクリプトっぽい(DSLっぽくはない)'
tf.add_paragraph().text = '再利用性は高められそう'
tf.add_paragraph().text = 'Gitで管理できる(重要!)'
tf.add_paragraph().text = 'Sphinxの拡張にするのは面白そう'
tf.add_paragraph().text = 'livereloadで更新時にリロードしないかなぁ?'

shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = 'まとめ (真のアイドルは焼津)'.format(i)
top = Inches(1.5)
left = Inches(3)
width  = Px(280)
height = int(width * 1.427)
pic = shapes.add_picture("yaidumoe.jpg", left, top, width, height)

prs.save('test.pptx')

雰囲気写真の撮り方

もっと沢山撮らないとなぁ。

ProductName 雰囲気写真の撮り方 ナチュラルな光を活かすデジカメ撮影術
木村 文平
エムディエヌコーポレーション(MdN) / ?円 ( 2013-03-08 )


  • 空を撮る場合にはモニターで確認しながら
  • 技術と同じくらい気持ちも大事
  • 犬の鼻にピントを合わせる
  • 料理の写真を撮る時には、美味しそうなツヤがでるような光の角度をみつける

PythonでAndroidアプリ

Kivyで作られたParticle Pandaをいじってみたけど滑らかに動いてる。

1365679146

なかなか面白そうだ。

レンズが欲しい

Canon EFレンズ EF-S60mm F2.8マクロ

ボーナスはよこないかなー

Flask-Classy

blueprintと何が違うのかなと。

クラス名とメソッド名からURLが自動的に決められるのが、brueprintよりも便利かなぁ。

今度使ってみる。

進撃の巨人を10巻まで読んでみた

この二日でbookoffとkindleの組み合わせで1巻から最新刊まで読んでみた。まぁ面白い。

ProductName 進撃の巨人【特典つき】(10)
諫山創
講談社 / ?円 ( 2013-04-09 )


電子書籍版を5巻買ってしまうとオライリー本くらいいってしまうのがなんというか損した気分になるなぁ。読み返すようなもんでもないし。

それにしても電子コミックは高すぎるよなぁ。

書店に配慮しているのか、電子書籍の値段のアンカリング効果をねらってんのかなぁ。後者だったら失敗だよな。ブックオフとのバランスが取れてないのでブックオフ最低価格にサヤ寄せすると思うんだけど。

最初から新刊も250くらいだったらまぁ買って所有する気になるけど、そうじゃないのでブックオフの100円コーナー漁ってみて歯抜けがあったらkindleで買うみたいな使い方が消費者的には費用対効果が高くなってる。

電子書籍は一日レンタルで100円とか一日何冊でも読み放題で500円とかのほうが需要ありそうな。ネットカフェとバッティングすんのかな。

Parallel R

Rで並行、並列プログラミングやHadoopを使うためのライブラリの紹介とか使い方の本

  • Snow: works well in a traditional cluster environment
  • Multicore: popular for multiprocessor and multicore computers
  • Parallel: part of the upcoming R 2.14.0 release
  • R+Hadoop: provides low-level access to a popular form of cluster computing
  • RHIPE: uses Hadoop’s power with R’s language and interactive shell
  • Segue: lets you use Elastic MapReduce as a backend for lapply-style operations

ProductName Parallel R
Q. Ethan McCallum
Oreilly & Associates Inc / 2254円 ( 2011-11-04 )


最近pandasのほうに移ってしまったので途中までしか読んでない。Rでなんとかしないといけない状況になるまで使わないだろうなぁ。

pythonのsubprocessを使おうと思った

pythonで外部コマンドを叩くときにos.systemにするかcommands使うか迷ったりするんだけどpopenもあるしsubprocessもあって何使えばいいのかさっぱりわからん。

という状態だったんだけど、subprocessを使うのが正解らしい。

subprocess モジュールは新しくプロセスを生成して、そのプロセスを扱う一貫したインタフェースを提供します。それは従来からある他のモジュールよりも高レベルなインタフェースを提供します。そして os.system(), os.spawn(), os.popen(), popen2.() や commands.() のような従来の関数の置き換えを目的としています。

そんなわけでsubprocessを使っていこうと思った。

今日のドラムンベース

BPM170-172

Right Here / Ulterior Motiveのドラムパターンがたまらん。

Lost Disciple / SpectraSoul
Overfiend / Makai
Violet / Sunchase
Turbulence / Moving Fusion
Aria / Rockwell
Noir (Ulterior Motive Remix) / Rockwell
Poison The Well / June Miller
Strontium Jazz (Dillinja Remix) / Future Forces
Justified / Goldie vs. Commix
T.Power Vs MK Ultra / Mutant Jazz
Espionage / Future Signal
The Test (VIP) / Royalston
Paint My Wings (feat. Grimm) (Fractures Astrophonica Remix) / Unquote
Hide Your Tears Because We Are In Heaven / Unquote
Signalz / Mefjus
Whatever (Mefjus Remix) / Optiv & BTK
Elevate This Sound / Calyx & TeeBee
Driftwood (Feat. Noisia) / Icicle
Iceberg / Mortem
Right Here / Ulterior Motive
Stresstest / Phace
Roadtrip / Frederic Robinson
Contrast / Spinline
New Drums / Teddy Killerz
Dustup / Noisia & The Upbeats
Forged Reality / Jade
Lubov Moya (Blu Mar Ten Remix) / Unquote & Molecular Structures