Raspberry Pi et clef Wifi DWA-131

Attention comme le signale le site Ubuntu il y en fait 3 modèles de clef Wifi D-Link DWA-131.
Je possède 2 modèles:

Bus 001 Device 005: ID 2001:330d D-Link Corp. 
Bus 001 Device 006: ID 2001:3319 D-Link Corp. 

La révision B1 (ID:330d)

Sur le dernier kernel (4.9.35+) de mon Raspberry Pi aucun problème le matériel est reconnu directement.

La révision E1 (ID:3319)

Ca ne fonctionne pas directement…
Voici donc la procédure à suivre pour faire fonctionner tout ça (en tant que root):

# aptitude install raspberrypi-kernel-headers dkms build-essential git
# cd /usr/src/linux-headers-`uname -r`/arch/
# ln -s arm armv6l
# cd
# git clone https://github.com/Mange/rtl8192eu-linux-driver.git
# cd rtl8192eu-linux-driver/
# make
# make install

Et voilà !!!
Une petite vérification au niveau du kernel:

# lsmod
8192eu

Linux et XBox One Wireless Controller


Installation d’un manette de jeux XBox One sous Linux:

  • Linux: Ubuntu 16.04 LTS
  • Manette XBox One: XBox One Wireless Controller Winter Forces

Outils de configuration

Je recommande l’installation de jstest pour tester configurer votre manette:

sudo apt-get install jstest-gtk

Installation avec cable USB

Il suffit de connecter le cable USB/microUSB entre votre manette et votre PC.
Ubuntu reconnaît automatiquement la manette de jeu, mais malheureusement la manette ne fonctionne pas !!!
La manette de jeu est plus récente que le driver installé (xpad).
La solution consiste à installer la dernière version du drivers (kernel module):

sudo git clone https://github.com/paroj/xpad.git /usr/src/xpad-0.4
sudo dkms install -m xpad -v 0.4

Le mieux est de recharger le driver et de déconnecter/reconnecter la manette de jeu:

sudo modprobe -r xpad
sudo modprobe  xpad

Tout doit fonctionner normalement: le bouton XBox de votre manette doit s’allumer.
Attention: Si le module refuse de se charger il faudra désactiver le secure boot au niveau de votre BIOS.

Voilà ce que doit donner la commande dmesg:

[  510.311819] usb 1-3: new full-speed USB device number 10 using xhci_hcd
[  510.498112] usb 1-3: New USB device found, idVendor=045e, idProduct=02ea
[  510.498127] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  510.498137] usb 1-3: Product: Controller
[  510.498144] usb 1-3: Manufacturer: Microsoft
[  510.498151] usb 1-3: SerialNumber: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
[  510.500326] input: Microsoft X-Box One S pad as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/input/input24

Installation via Bluetooth

Pour l’installation bluetooth il suffit de rajouter la ligne suivante dans /etc/rc.local (avant le exit 0)

echo 1 > /sys/module/bluetooth/parameters/disable_ertm

Ensuite on reboot ou on lance la commande en tant que root.
On peut ensuite appairer notre manette comme n’importe quel composant bluetooth.
Coté manette on l’allume et ensuite on appuie sur le bouton d’appairage situé derrière la manette.

Une fois la manette appairée il suffira de la rallumer pour quelle soit automatiquement reconnue.

Voilà ce que doit donner la commande dmesg:

[   20.251086] Bluetooth: RFCOMM TTY layer initialized
[   20.251089] Bluetooth: RFCOMM socket layer initialized
[   20.251092] Bluetooth: RFCOMM ver 1.11
[  169.608876] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[  169.608880] Bluetooth: HIDP socket layer initialized
[  169.609294] hid-generic 0005:045E:02E0.000B: unknown main item tag 0x0
[  169.609358] input: Xbox Wireless Controller as /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/bluetooth/hci0/hci0:70/0005:045E:02E0.000B/input/input24
[  169.609453] hid-generic 0005:045E:02E0.000B: input,hidraw10: BLUETOOTH HID v9.03 Gamepad [Xbox Wireless Controller] on 00:1a:7d:da:71:14

Utilisation des WebSockets en python

Voici un exemple de code permettant une diffusion de message avec les WebSocket.
La démonstration est composé de 3 programmes:

  • Le serveur WebSocket en python qui accepte les connexion
  • Un client WebSocket en python qui emet des messages
  • Un client WebSocket en Javascipt dans une page html qui affiche les messages

Les clients se connectent sur les différentes URL:

  • ws://127.0.0.1:5678/broadcast/read : Pour lire les messages diffusés
  • ws://127.0.0.1:5678/broadcast/write : Pour diffuser un message

Le serveur:

#!/usr/bin/env python3

import asyncio
import datetime
import random
import websockets

connected = set()

async def pub_sub(websocket, path):
    global connected
    if path == '/broadcast/read' :        
        connected.add(websocket)
        print("READER "+str(websocket.remote_address)+"    connected")
        while True:
            await asyncio.sleep(100)
    elif path == '/broadcast/write' :
        print("WRITER "+str(websocket.remote_address)+"    connected")
        try :
            while True:
                data = await websocket.recv()
                print("MULTICAST: "+data)
                still_connected = set()
                for ws in connected :
                    if ws.open:
                        still_connected.add(ws)
                        await asyncio.wait([ws.send(data)])
                    else:
                        print("READER "+str(ws.remote_address)+" disconnected")
                connected=still_connected
        except:
            print("WRITER "+str(websocket.remote_address)+" disconnected")
            
start_server = websockets.serve(pub_sub, '127.0.0.1', 5678)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Le client python qui emet des messages

#!/usr/bin/env python3

import asyncio
import websockets

async def hello():
    async with websockets.connect('ws://localhost:5678/broadcast/write') as websocket:
        while True:
            name = input("Message ? ")
            await websocket.send(name)

asyncio.get_event_loop().run_until_complete(hello())

La ou les pages html qui recoivent les messages:

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket demo</title>
    </head>
    <body>
        <script>
            var ws = new WebSocket("ws://127.0.0.1:5678/broadcast/read"),
                messages = document.createElement('ul');
            ws.onmessage = function (event) {
                var messages = document.getElementsByTagName('ul')[0],
                    message = document.createElement('li'),
                    content = document.createTextNode(event.data);
                message.appendChild(content);
                messages.appendChild(message);
            };
            document.body.appendChild(messages);
        </script>
    </body>
</html>

Oracle Storage Cloud Service: Creating Containers Using the REST API

Here an interactive script to create a storage container:
Download here

#!/bin/bash

## DESCRIPTION: Oracle Storage Cloud Service: Creating Containers Using the REST API
## DOCUMENTATION: http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/objectstorage/creating_containers_REST_API/creating_containers_REST_API.html

## KNOWN ISSUES: Does not work with the following identity domains:
## - oucloudusa8

## AUTHOR: Sebastien Colas 


echo -n 'Your identity domain :'
read identity
echo -n 'Your username :'
read username
echo -n 'Your password :'
read password
echo -n 'Container name you want to create :'
read container

echo

curl -v -s -X GET -H "X-Storage-User: Storage-${identity}:${username}" -H "X-Storage-Pass: ${password}" https://${identity}.storage.oraclecloud.com/auth/v1.0 2> auth.txt

storage=`cat auth.txt | grep X-Storage-Url auth.txt | cut -f 3 -d ' ' | col -bp`
auth=`cat auth.txt | grep X-Auth-Token | cut -f 3 -d ' '`

echo "X-Storage-Url : ${storage}"
echo "X-Auth-Token : ${auth}"

curl -v -s -X PUT -H "X-Auth-Token: ${auth}" ${storage}/${container} 2> create.txt

ret=`cat create.txt | grep 'HTTP/1.1 201 Created'`

echo

if [ -n "$ret" ]
then 
  echo "Container ${container} successfully created"
  echo "Cloud Storage Container: Storage-${identity}/${container}"
else
  echo "an error occured please see the log files"
fi

Get number of unread posts on phpbb3 in php

<?php

/*
* Doc: https://www.phpbb.com/customise/db/mod/view_or_mark_unread_posts/support/unread_posts_counter_small_optimize-t_99119
*/

/* Headers JSON */
header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . 'GMT' );
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Content-type: application/json; charset=iso-8859-1');

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : '../forum/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include ($phpbb_root_path . 'common.' . $phpEx);

$user->session_begin();

global $db, $user;

if ($user->data['user_id'] == ANONYMOUS)
{
echo '{"unread_posts":"0"}';
return;
}

// Select unread topics
$unread_topics = array ();
$sql = 'SELECT t.topic_id
FROM ' . TOPICS_TABLE . ' t
LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id)
LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id)
WHERE t.topic_last_post_time > ' . $user->data['user_lastmark'] . ' AND
(
(tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR
(tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR
(tt.mark_time IS NULL AND ft.mark_time IS NULL)
)
LIMIT 1001';

$result = $db->;sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$unread_topics[] = $row['topic_id'];
}

if (empty ($unread_topics))
{
echo '{"unread_posts":"0"}';
return;
}

// now count the posts with post time after each of the relevant times
$sql = 'SELECT COUNT(p.post_id) as count
FROM ' . POSTS_TABLE . ' p
LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (p.forum_id = ft.forum_id AND ft.user_id = ' . $user->data['user_id'] . ')
LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (p.topic_id = tt.topic_id AND tt.user_id = ' . $user->data['user_id'] . ')
WHERE ' . $db->sql_in_set('p.topic_id', $unread_topics) . '
AND
(
p.post_time > tt.mark_time
OR (tt.mark_time IS NULL AND p.post_time > ft.mark_time)
OR (ft.mark_time IS NULL AND p.post_time > ' . $user->data['user_lastmark'] . ')
)';

$result = $db->sql_query($sql);
$unread_post_count = $db->sql_fetchfield('count', false, $result);
$db->sql_freeresult($result);

echo '{"unread_posts":"' . $unread_post_count . '"}';

?>

Serveur VNC de BrickPi

Pour changer la résolution du serveur VNC de BrickPi il suffit d’éditer le fichier

/etc/systemd/system/vncserver@.service

Ci dessous je change la résolution en 1920×180:
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=pi
PAMName=login
PIDFile=/home/pi/.vnc/%H:%i.pid
WorkingDirectory=/home/pi
ExecStartPre=-/usr/bin/vncserver -kill :%i
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1920×1080 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target

Ensuite on redémarre et voilà le travail:

root@brickpi:/home/pi# systemctl restart vncserver@1.service

Mise à jour de WordPress sur free.fr

Free ne supportant qu’un vieille version de PHP il m’était alors impossible de mettre à jour WordPress.
Avec le support de PHP 5.6.8 la mise à jour de WordPress est désormais possible.
Du coup le site est désormais sur la version 4.5.2–fr_FR de WordPress.
Coté technique il suffit de créé un fichier .htaccess contenant les informations suivantes:

<IfDefine Free>
php56 1
</IfDefine>