nachzulesen auf: http://blog.madflex.de/tensorflow-python3-docker-raspberry-pi/
Image: https://hub.docker.com/r/mfandreas/rpi-tensorflow-python3/
schon vorhanden in Django 1.9:
class MyModel(TimeStampedModel):
stakeholders = JSONField(default=dict, null=False, blank=False)
Beispieldaten:
MyModel.objects.bulk_create([
MyModel(stakeholders=stakeholders)
for stakeholders in (
{'weather': ['A', 'C', 'B'], 'other': ['C']},
{'weather': ['B']},
{'other': ['A', 'C']},
{'weather': ['A', 'C']},
{'weather': ['B']},
{'weather': ['B']},
)
])
Queries:
MyModel.objects.count()
6
MyModel.objects.filter(stakeholders__has_key='weather').count()
5
MyModel.objects.filter(stakeholders__weather__contains='B').count()
DataError
MyModel.objects.filter(stakeholders__weather__contains=['B']).count()
4
Wie bekomm ich eine Liste aller Werte unter dem Key 'weather'? Postgres hat dafür ja etwas: https://www.postgresql.org/docs/9.4/static/functions-json.html
from django.db.models.aggregates import Func
class ObjectAtKey(Func):
function = '#>'
template = "%(expressions)s%(function)s'{%(keyname)s}'"
arity = 1
def __init__(self, expression, keyname, **extra):
super().__init__(expression, keyname=keyname, **extra)
MyModel.objects \
.annotate(foo=ObjectAtKey('stakeholders', 'weather')) \
.order_by('foo') \
.distinct('foo') \
.values_list('foo', flat=True)
[['B'], ['A', 'C'], ['A', 'C', 'B'], None]
Jetzt hab ich eine Liste von Listen. Aber wie bekomme ich eine Liste von uniquen „Werten die in den Listen vorkommen“ direkt von Postgres?
class JsonbArrayElements(Func):
function = 'jsonb_array_elements'
template = '%(function)s(%(expressions)s)'
arity = 1
MyModel.objects \
.annotate(foo=JsonbArrayElements(ObjectAtKey('stakeholders', 'weather'))) \
.order_by('foo') \
.distinct('foo') \
.values_list('foo', flat=True)
['A', 'B', 'C']
die Teile der Config von home-assistant ins mqtt pushen, um in graphite Zuordnungen zu haben:
https://github.com/mfa/shack-mqtt-homeassistant/blob/master/push_homeassistant_names.py
anderer subscriber der von einem sensor die werte in eine andere api pusht. alle 5 minuten:
https://github.com/aerospaceresearch/cress-meta/blob/master/mqtt/push_dht22.py
Die letzte Query von oben gibt es im folgenden unter MyModel.get_list_elements().
from abc import ABCMeta
registry = dict()
class MyMeta(ABCMeta):
def __new__(mcls, class_name, bases, namespace):
new = super().__new__(mcls, class_name, bases, namespace)
if class_name == 'MyBase':
try:
list_elements = MyModel.get_list_elements()
except (OperationalError, ProgrammingError):
# Either there is no db
# or the relation is missing
pass
else:
for list_element in list_elements:
subcls_name = 'My{}Concrete'.format(
list_element.capitalize(),
)
subcls = type(subcls_name, (new, ), {'my_attr': list_element})
# We need this in our enviroment;
# it might not be needed in your use case
subcls.__module__ = new.__module__
registry[subcls_name] = subcls
return new
class MyBase(metaclass=MyMeta):
my_attr = None
def do_something(self):
# Do something based on self.my_attr
print(self.my_attr)
Besides MyBase the classes MyAConcrete, MyBConcrete, MyCConcrete` are available. Instead of adding them to a dict (i.e. registry), we could add them to the global namespace.
visualisieren von commits in cool http://gource.io/
cd repo gource --seconds-per-day 0.1 --auto-skip-seconds 0.1 gource --seconds-per-day 0.2 --auto-skip-seconds 1 -1920x1080 -o - | ffmpeg -y -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 0 -bf 0 gource.mp4
Fehlt noch: ordentliche Komprimierung
verwendet in https://cress.space/
deutlich näher an material als bootstrap-material
https://hub.docker.com/r/tianon/postgres-upgrade/tags/
bitte um Mithilfe: https://letsmeet.click/ - https://github.com/letsmeet-click/letsmeet.click
wichtige (missing) fixes:
- ical feed support
- emailadresse ändern / roundtrip-verifikation
- passwort hinzufügen/ändern
(vielleicht mal zusammen an einem Abend an letsmeet.click arbeiten)
==> Mittwochs, alle vier Wochen; der Freitagstermin bleibt erhalten
==> next 24. August 19Uhr