How to get rid of Bing in new Firefox tab

As I wrote in another post, I like posting solutions to problems I would like to find directly in search engines… but I have not found.

Since some week ago my wife has noted that opening new tabs in Firefox she did not find the usual list of favourite sites, but Bing search page. This is one thing I just cannot stand. I do not want someone else change my selection, by Jove!

So I searched the Net a lot, and found many people were affected by this annoyance and solutions were quite convoluted.  Fortunately I can report that, after a long and fatiguing search, I eventually found this great link.

Very simply, if you search the page, you will find near the lower left corner an active link to reset! I hope this helps…

RMAP – important resource

Weather-Station-128x128I would like to be the first or one of first people quoting it: RMAP project. It is a very interesting initiative for a network of environmental data agents. The acronym stays for Rete di Monitoraggio Ambientale Partecipativo (Environmental and Participated Monitoring Network).

RMAP provides a whole set of – absolutely open source – tools, from hardware sensors up to web server for data gathering and distributing.

I am sure you will hear again about it. For the meanwhile… stay in touch.

Raspberry Pi: how to read pin status without shutting it down in Python

From now on, sometimes I would like to publish results of internet searching… that I did NOT find. The results I wanted and I found after just after a long wandering.


 

Raspi-PGB001_reasonably_small When you work with Raspberry Pi, and you are controlling something via output port, say a relay, you can have set a status on it, i.e. you can have put it HIGH, with the usual

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.GPM)
GPIO.setup(25, GPIO.OUT)
GPIO.output(25, HIGH)

Then, some times after, you are willing to know if pin 25 is HIGH o LOW. You have forgot it, or you are not you, but another person willing to know that. Problem: if you set pin 25 as input, you suddenly switch off it. So DO NOT DO this, in the same or another program:

GPIO.setup(25, GPIO.IN)
print GPIO.input(25)

because you will always get a False, at least with default pullups.

Fortunately the answer is simple: just set that pin as output… but read it!

GPIO.setup(25, GPIO.OUT)
print GPIO.input(25)

and you will get a True or a False depending on the real status.

LibreOffice vs OpenOffice 1-0 in pdf editing

I recently discovered that I can open directly (File->Open) pdfs  in my LibreOffice on Windows. I am eager LibreOffice logoto try in Ubuntu at home. Anyway, as presented in this interesting column, the same is not valid for OpenOffice: sure, you can use an extension, but it is a frankly awkward path you need follow…

LibreOffice opens it in LibreOffice Draw, and you can edit it like any other Draw document, so you can alter, delete, or add any item you like. If you, as usual for me, just want to “edit pdf”, remember to export to pdf exiting!

How I met Ubuntu Linux

In the simplest way: I was a lazy Windows user, but curious about Linux. I remembered I had tried something many years before, and I had a vague but not so good memory: yes, pretty, but too difficult, good for initiates.

But when my old PC broke, I changed a lot of hardware, and I didn’t want to fuss over neither complicated and expensive Windows licenses, nor piracy. So I gave Linux a chance: I took the usual (in 2008) Ubuntu CD-ROM sold with a magazine issue and put it in the tray. If you, dear Ubuntu, start smoothly, I will foster you. And that’s what happened.

Everything went fine, no strange questions, no locking. Ubuntu was not so difficult, and much, much more similar to my usual environment than I expected. Five years have passed since then, and now Ubuntu is my usual environment.

So, dear reader, please give you too a chance to Linux: the only thing you really risk, if you reflect, is to find a free and live resource!

Pomodoro pauses

pomodoro_techniqueSome time ago I stumbled across this interesting column. The conclusion is:

Of course, not every mental activity can or should be performed while walking, but this new research reinforces anecdotal evidence and other research findings that suggest being too tightly chained to our desks is bad for our minds as well as our physical health. Science shows we often have creative breakthrough when our minds are disengaged from the problem we’re wrestling with, hence the common experience of getting great ideas while relaxing in the shower.

Getting up for a walk or a jog is another way to achieve this sort of head space–after all, it worked for Einstein and Charles Darwin

It seems to me a strong reinforcement of the importance of pomodoro technique. I make use of this technique quite often, and – al least in my case – I find that its usefulness is strongly linked to the necessity to break your activity after at most 25 minutes. In fact I find it difficult to stop my task(s) and I end up getting too tired and not productive.

Posting 1-wire/RasPi data to Xively without third-party libraries – the simple way

Recently I connected to Xively (you know, the site accepting your environmental data, keeping it and letting you manage it for free – roughly speaking) with Raspberry. I just wanted to send some temperature data with the very famous  1-wire solution. Other help here.

There is a plenty of info about what software to use. I lately fell in love with python, so the language had to be that. If you look for help, you will find that Xively itself and Tinkerforge gives you some handy… pieces of python, and the same with the library owfs  but:

  • Xively gives a library with a full API, very useful but too large for my needs
  • Tinkerforge’s library is based – obviously and rightly – on the hardware they sell. Too large again.
  • OWFS shares – IMHO – the same problems as the Xively one: too large
  • all of them need to be downloaded, installed, etc.
  • really do we need a library? At the end of the day we just must send a PUT call to the HTTP(S) server

So I ended up with a personal version based on the – anyway well done – Tinkerforge version. Mine is “pure python”, using just and only the normal python installation. Probably you still will want to work to refine the code, but that could be considered a good starting point. Here it is:

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

import socket
import sys
import time
import math
import logging as log
import httplib
import json
import threading

log.basicConfig(level=log.INFO)

MIN_TEMP = -100

def read_temperature():
    # the following code will be different in your case
    tfile = open("/sys/bus/w1/devices/28-0000046ca58d/w1_slave") 
    text = tfile.read()
    tfile.close()

    lines = text.split("\n")

    if lines[0].find("YES") > 0:
        temp = float(lines[1].split(" ")[9][2:])
        temp /= 1000
        return temp
    return MIN_TEMP - 1

class Xively:
    HOST = 'api.xively.com'
    AGENT = "my-agent"
    FEED = 'FEED-ID'
    API_KEY = 'unreadeable-code-given-by-xively'

    def __init__(self):
        self.items = {}
        self.headers = {
            "Content-Type"  : "application/x-www-form-urlencoded",
            "X-ApiKey"      : Xively.API_KEY,
            "User-Agent"    : Xively.AGENT,
        }
        self.params = "/v2/feeds/" + str(Xively.FEED)

        self.upload_thread = threading.Thread(target=self.upload)
        self.upload_thread.daemon = True
        self.upload_thread.start()

    def put(self, identifier, value):
        try:
            _, min_value, max_value = self.items[identifier]
            if value < min_value:                 
                min_value = value             
            if value > max_value:
                max_value = value
            self.items[identifier] = (value, min_value, max_value)
        except:
            self.items[identifier] = (value, value, value)

    def upload(self):
        while True:
            time.sleep(10 * 60) # Upload data every ... min
            if len(self.items) == 0:
                continue

            stream_items = []
            for identifier, value in self.items.items():
                stream_items.append({'id': identifier,
                                     'current_value': value[0],
                                     'min_value': value[1],
                                     'max_value': value[2]})

            data = {'version': '1.0.0',
                    'datastreams': stream_items}
            self.items = {}
            body = json.dumps(data)

            try:
                http = httplib.HTTPSConnection(Xively.HOST)
                http.request('PUT', self.params, body, self.headers)
                response = http.getresponse()
                http.close()

                if response.status != 200:
                    log.error('Could not upload to xively -> ' +
                              str(response.status) + ': ' + response.reason)
            except Exception as e:
                log.error('HTTP error: ' + str(e))

#========================
if __name__ == "__main__":

    log.info('Start')

    xively = Xively()
    i = 0
    while True:
        i += 1
        print('reading ' + str(i))
        temp = read_temperature()
        xively.put('temperature', temp)

        time.sleep(60)

    log.info('End')