水曜日, 8月 21, 2019

Jinja (Flask/SQLAlchemy) で日付をフォーマットする

Flask/SQLAlchemy 使ってる方、jinja で困ってませんか?

本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。

日付を出したい場合、フォーマットなら strftime() が使えます。

{% if blog.date_posted %}
{{ blog.date_posted.strftime('%b %d, %Y') }}
{% endif %}

わざわざ文字列を作って渡す必要はありません。



月曜日, 7月 22, 2019

PyMongo で内部結合

PyMongo を使った内部結合の実装です。classics テーブル、baroque テーブルの内部結合を キー composer_id で照らし合わせたものです。

外部結合なら $match の部分なしで結果がとれます。

_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。

{"_id":"5d355b602f3e9e3268f12a20","composer_id":"5d2b80272f3e9e25e0eadccf"}
view raw baroque hosted with ❤ by GitHub
from flask_pymongo import PyMongo
classics = list(mongo.db.classics.aggregate(
[
{ "$lookup" :
{
"from":"baroque",
"localField":"composer_id",
"foreignField":"composer_id",
"as":"baroqueid"
}
}
,
{ "$match" :
{
"baroqueid": {"$ne": []}
}
}
]
))
view raw baroque.py hosted with ❤ by GitHub
{
"_id":"5d2fdb532f3e9e25b046aed1",
"title":"01 Track 1.wma",
"path":"\\Music\\BACH.Johann.Sebastian\\Bach Brandenburg Concertos Nos. 1-4, 6\\01 Track 1.wma",
"composer":"BACH.Johann.Sebastian",
"work":"Bach Brandenburg Concertos Nos. 1-4, 6","composer_id":"5d2b80272f3e9e25e0eadccf"
}
view raw classics hosted with ❤ by GitHub

土曜日, 6月 29, 2019

Python: 指数分布のグラフを書く

Python の使いやすさはただごとじゃありません。

ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。

使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。

グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。

以下のスクリプトは指数分布を描きます。


import matplotlib.pyplot as plt
import math
import numpy as np
a=np.arange(0,4,.01)
x= np.linspace(0,10,100)
l=[]
for i in range(1,5):
y= i*np.exp(-i*a)
plt.plot(a,y)
l.append("n = "+str(i))
plt.legend(l)
plt.xlabel("x")
plt.ylabel("f(x)=n*e^(-n*x)")
plt.title("Exponential Distribution PDF")
plt.show()


import matplotlib.pyplot as plt
import math
import numpy as np
a=np.arange(0,6,.01)
x= np.linspace(0,10,100)
l=[]
for i in range(1,5):
z= 1-np.exp(-i*a)
plt.plot(a,z)
l.append("n = "+str(i))
plt.legend(tuple(l))
plt.xlabel("x")
plt.ylabel("F(x)=1-e^(-n*x)")
plt.title("Exponential Distribution CDF")
plt.show()

日曜日, 1月 27, 2019

Scala: BigInt で階乗を計算する

Java の BigInteger の扱いは面倒です。すべての演算が関数形式で引数を指定しなければならないのでとても不便です。オペレータ演算子を定義できない安全志向 Java の弱みでもあります。

Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。

Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。

def factorial(x:BigInt):BigInt={
if(x<=0){
0
}else{
var counter:BigInt=1
var res:BigInt=1
while(counter <= x){
res *= counter
counter+=1
}
res
}
}
view raw factorial.scala hosted with ❤ by GitHub


比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...