21. tammikuu 2011, 18:11

Mikrobloggailua talossa

Ja nyt sitä mikrobloggailua on tässä. Edellinen artikkeli johti mielettömän kovaan arpomiseen ja pohdintaan, onko se oikeasti sen arvoista kirjoittaa mikroblogia itselleen, sen sijaan että — Twitterissä on oikeasti hienoja puolia.

Kirjailin Python-skriptin Twitterin henkeen. Samainen skripti taipuu helposti myös tavallisten, pidempien blogikirjoitusten kasvualustaksi. Kyseessä on siis ihannoimani komentoriviklientti. Mikäli Twitteriin joskus sitten uskaltaudun, voin olla kuin kotonani. Ehkäpä näytän sen, sillä se ei ole kauhean pitkä. Jaoin sen kolmeen osaseen. Ensimmäinen osa koskee varsinaista viestinvälitystä internettiin:

# coding=utf8
import xmlrpclib
srvr = xmlrpclib.Server("/rpc/")

username = "progo"
password = ""
section = "hetket"
to_publish = True

# Hae tarvittavat datat ja lähetä uusi miete maailmalle
def send_shout(description, keyword_string):
  # hae viimeisin id:
  try:
    newest = srvr.metaWeblog.getRecentPosts(section, username, password, 1)[0]['postid']
  except IndexError:
    newest = 0

  # kirjoitellaan viestin runko valmiiksi
  post = {'title': 'hetkessä nro ' + str(int(newest) + 1),
          'description': description,
          'mt_keywords': keyword_string}

  srvr.metaWeblog.newPost(section, username, password, post, to_publish)

Heh, ei vikasietoisuutta vielä tässä vaiheessa. Otsikot nimeän kaavan mukaan about yksiselitteisesti, jotta ne on helppo hakea kannasta. Metodi send_shout ottaa sisäänsä siis vain kaksi merkkijonoa, joista toinen menee tsirpityksen sisällöksi ja toinen on pilkuin eroteltu lista tageja.

Ja mitenkö otan tagit vastaan komentoriviltä? Hyödynnän Twitterin merkintätapoja ja käytän risuaitamerkintojä. Esimerkiksi viestin loppuun heitetty #python liittäisi asiaankuuluvan tagin viestini perälle. Se poistettaisiin varsinaisesta viestistä. Jotta yllätyksiltä vältyttäisiin, haen vain lopusta alkaen, ja lopetan heti kun ensimmäinen muulla merkillä alkava sana tavataan. Koodi on kamalan imperatiivista, mutta alkuperäinen list comphrehensioineita käyttänyt versio olisi mennyt liian vaikeaksi.

 # coding: utf-8
# handle information. In this case, tags
def extract_tags(description):
  if type(description) == type('str'):
    description = description.split(" ")
  tags = []
  index = len(description) - 1
  while index > 0:
    if description[index].startswith("#"):
      tags.append(description[index][1:])
      del description[index]
      index -= 1
      continue
    elif len(description[index].strip()) == 0:
      continue
    else:
      break
  return (" ".join(description), ", ".join(tags))

Tästä sanoisin sen sanasen, että Pythonin merkkijonoille löytyvä metodi .split on näppärä apuväline myös ilman argumenttiansa, jolloin se vastaa säännöllistä lauseketta / +/ (tai /\s+/, jos \s tarkoittaa tyhjien merkkien joukkoa). Mutta jos haenkin erityisesti aina yhden välin mittaisia erottimia, saan tuloksena syntyvään taulukkoon tyhjiä merkkijonoja. Ei tietysti kivaa, mutta nyt lopussa tehtävä palasten yhteenliimailu tuottaa alkuperäistä vastaavan merkkijonon! Aika kiva jäynä, ettenkö sanoisi. Minun pitää vain lisätä while-silmukan sekaan yksi ylimääräinen elif.

Siinä olivat työkalut, ja nyt itse komentoriviohjelma:

 #!/usr/bin/python
# This shamelessly named CLI front-end will take all the thoughts and send them
# to the blog

import sys, tempfile
from subprocess import call
import post_handler, post_sender

if len(sys.argv) == 1: # use the Editor. Probably happens rarely
  tempfile = tempfile.NamedTemporaryFile()
  call(["vim", tempfile.name])
  message = "\n".join(tempfile.readlines())
  tempfile.close()
else:
  # the argv is ours...
  message = sys.argv[1:]

(msg, tags) = post_handler.extract_tags(message)
post_sender.send_shout(msg, tags)

Nimesin sen todella tweet.py:ksi, kun en muutakaan keksinyt. Voin käyttää vimiäkin viestin kirjoittamiseen, jos haluan. Hakemalla ympäristömuuttujat esille voisin tehdä koodista käyttäjäystävällisempää, mutta nyt laiskuuttani en tehnyt sitä. Kaikin puolin Python on hyvin tyydyttävä kieli komentorivisovelluksiin. Olisin kirjoittanut Clojurella, mutta JVM:n käynnistysaikoja en halua katsella aina kun haluan sanoa jotain ääneen. Ehkä pitäisi opiskella Schemen alkeet niin saisin natiivikoodista lispiä.

Mutta nyt on myös blogin puolella useimmat ongelmista ratkottu. Erottelin lyhyet huudahdukset hyvin pois oikeista kirjoitelmista, ja ajattelin onnistuneeni siinä yllättävän hyvin. Mutta vain aika näyttää, miten tässä käy. Twitter siellä tsirpittelee, kutsuu. Odottaa, jos teen virheen.

Tageja: , ,

---
---

---

Aiheen vierestä