Lock&Lock: Sjöduglig elektronikförvaring

Alla känner nog till Lock&Lock burkarnas absolut främsta användningsområden: fukt säker förvaring av geocacher ute i natur, grottor m.m.  Men det finns faktiskt potentiella andra användningsområden för dem!

Här ser ni mitt test av Lock&Lock för att förvara plånbok, elektronik m.m., hemma i badkaret (vem har sagt att det måste vara tråkigt att göra rent badkaret?). Speciellt intressant är att GPS:en inte bara flyter, skärmen är dessutom läsbar genom locket. På bilden har ni även min gamla flytande ficklampa som just fått nya batterier.

Även inhandlat en reflexjacka (geocachare till i båt mitt i vintern skall ju gärna ha något som signalerar att de har en legitim anledning att båta runt) och skall leta rätt på mina cyalume ljusstavar, min pannlampa och så. Dessutom lite vattensäkrade säckar att packa i.

Om det bara är trevligt väder på söndag så blir det ett kul äventyr!


QR-läsare till iPhone

Lite snabba tester av att plåta min skärm när den visar QR-koder,
  • QR app: har historik-funktion och lyckas ganska bra med QR-koder som innehåller länkar och kortare meningar. På en stor bild gör den rätt kanske cirka 60% av fotona. Försöker man med bilder som innehåller QR-koder i QR-koder så klarar den inte av jobbet, verkar som en viss informationsmängd gör programmet oanvändbart.
  • Aftonbladet Tagga (bygger på Beetag mjukvaran tror jag): ingen historik. Verkar dekoda ungefär lika bra som QR app.
  • Mobiletag: har historik-funktion. Extremt dålig på att dekoda, misslyckas nästan jämt. 20% av fotona lyckas kanske, vissa bilder klarar den inte alls.
Man förvånas över hur dåliga de är på att dekoda, även på ganska skarpa bilder.
Alla har en ganska usel integration med kameran, man måste ta ett foto istället för att de dekodar direkt när man håller upp den. Man skulle kunna tro att det är någon brist i iPhone som gör att de inte kan skapa bättre applikationer, men det finns ju bättre applikationer  av andra typer till iPhone (t.ex. layar) så det är nog bara fantasilöshet och dålig kodning som orsakar att integrationerna är så kassa.

Splinterheads

En tråd på forumet försöker få Splinterheads till Göteborg ;)


Demand Splinterheads in Gothenburg!
Splinterheads in Gothenburg - Learn more about this Eventful Demand

View all Gothenburg events on Eventful

Skrivet om FAD av mig

http://geobloggen.com/2009/10/27/veckans-utmaning-vecka-44/#comment-524

Det var grymt kul. Lite lugnare för mig i år då jag gick ihop med sansade människor, istället för stressen som vart 2007 och 2008.

Fumble Before Dark var också en enormt positiv överraskning. Jag var med på FBD 2007 och hade inte så höga förväntningar men FBD 2009 visade sig vara ett superbra event med riktigt bra föreläsningar.

Vi avrundande natten med att göra en gemensam ansats på GC1QYZV Permissions. Under cachen stod tre personer som busenkelt kunde lösa den med rätt kunskaper, å en som kunnat lösa den med lite mer arbete, samt vår uppfinnarjocke (J.Pixbo) som skapat utrustningen vi använde för att logga.

Hysteriskt muntert och roligt, med rätt prylar och sent i natten så kunde en Terräng Femma loggas enkelt =)

http://www.geocaching.se/forum/viewtopic.php?t=8152&highlight=

ag och Benrangel har diskuterat lite i de banorna. Han tycker naturlig tillväxt är bättre än en medveten strategi, för att inte få växtvärk. Å andra sidan, en strategi för hur man når ut till fler betyder att fler nybörjare får chansen att uppleva FAD. Både rent naturlig tillväxt och tillväxt genom mer agresiv PR har sina fördelar och nackdelar. 

PR behöver ju inte vara att vi annonserar på stan, utan t.ex. någon öppen form av viral marknadsföring. Typ att man har en plan för hur och när man börjar läcka information på hemsidan, att man börjar skriva "Fear the night; Fumble After Dark xx/xx". Marknadsföringen av Cloverfield i USA var lite småtuff, man släppte inte ens titeln i början utan skrev bara ett releasedatum på affischer m.m. Om någon är road/duktigt på marknadsföring så kan den ju fundera på det. Ett stilistiskt och dramatiskt foto av en cachare i bäcksvart mörker på FAD 2010 hemsidan / cachebeskrivningen vore en intressant variant. Överdramatiskt beskrivning av det första FAD följt av "2009 kom 400 geocachare: barn, vuxna och pensionärer för att följa i legendernas fotspår. Kommer du 2010?". Finns säkert massa skoj man kan laborera med =)
http://www.geocaching.se/forum/viewtopic.php?t=8125&start=135

FAD 2009 blev i likhet med 2008, 2007 och 2006 en av årets roligaste händelser! 

Mest nostalgi har jag nog till 2006, det var ju dels första gången, så var Kaprifol med, osså var det snö (glömmer aldrig när marken gick sönder under oss och det visade sig att vi gått på is hehe, tur att det inte var djupare)
http://www.geocaching.se/forum/viewtopic.php?t=8125&postdays=0&postorder=asc&start=15
Jag tycker kvällen var GRYM! Härligt att hitta några lugna personer att gå med, gjorde kvällen till den minst stressade FAD någonsin Smile

Speciellt FBD överraskade mig positivt. Föredragen var mycket lyckade och det blir en rejäl utmaning att toppa dem vid nästa FBD. 

En tanke kring FBD är kanske att lägga halva FBD före lunch halva efter, då blir mingel-delen mer naturlig och skolan får kanske bättre försäljning. Kaffet på FBD var för övrigt underbart, hade huvudvärk och led av sömnbrist så utan kaffepimplandet i rasterna hade jag stupat! 

Undertecknad var en av de sena på FAD-natten, vi var trötta och navigerade bort oss fullständigt på slutet - gick FRÅN eventet istället för TILL det (som tur hittade vi en buss som tog oss till eventet, annars hade vi blivit kvar därute länge). Kan hålla med om att det kan vara onödigt att vänta på oss stollar. Går det att köra igång, kör igång, och håll lista över vilka som vunnit och trasslat bort sig. 

Att effektivisera kvällen är nog ett bra mål. Man kanske kan låta flera vinna på samma gång, typ visa 3 vinnare i olika kategorier på en gång. Och delay-animationen var sexig de första 3 gångerna sen så var den lite uttjatad, kunde gott och väl låtit systemet gå i realtid =) 

Jag hade lite kaos i min Colorado, hade med några cacher jag kunde svurit på att jag loggat tidigare. Andra trodde att arrangörerna lagt med en del cacher i närområdet som inte hade med eventet att göra. Ser nu i efterhand att w944-6-fad_caches_final.gpx faktiskt innehåller en massa "bjäfs". Skulle jag skulle nog avråda från det, det var väldigt förvirrande. Räcker gott och väl om man får det som har med FAD att göra, så ansvarar man själv för sin GPS i övrigt. 

Jag hade anmält intresse om att hjälpa till men antingen så glömdes jag bort eller så föll jag ur funktionärslistorna pga överflöd eller nått. Kunde varit tydligare hur det skulle funka. 

Positivt var även de olika formerna av deltagarnabaserad sponsring. Jag ser gärna att FAD står sig i stor utsträckning på deltagarnas egna sponsring, så kan inte FAD få problem pga problem med att hitta sponsorer. Jag tyckte framförallt att FAD-coinen var en bra idé, jag skall låta mina gå runt med någon käck reklamtext för Fumble After Dark med myntet och på myntets hemsida.

Lithium batterier och ny ficklampa

Prövat Energizer Lithium AA batterier till min Garmin Colorado GPS. De är inte uppladningsbara med tusan vad länge de orkar driva GPS:en! Grymma!!! Behåller dock NiMH som primär batterikälla tills vidare. Men skall jag t.ex. fjällvandra igen så lär ju ett par paket Lithium-batterier få följa med!
Andra nyheter i min utrustning är Rebel 90 ALX-77R92L som drivs med två CR123 Lithium-batterier. Digital förstärkare i den så den lyser starkt även om batteriet börjar bli trött. Starkt är en underdrift, det är förbaskat starkt!!! Denna mycket lilla ficklampa utklassar t.om. min Silva L1 jag köpte inför FAD 2008!
På ämnet FAD, naturligtvis köptes ficklampan inför FAD 2009 som nyss gick av stapeln! Titta gärna på foton i väntan på att jag får klart ett blogginlägg om FAD 2009!

458

458 cacher loggade i år... mitt rekord på 463/år lär snart vara slaget :)

Kryptera med nyckel, IV och HMAC och spara som sträng

Hjälpte en bekant med att implementera något liknande Microsoft VIEWSTATE i java, dvs konfigurerbar krypteringsnivå och HMAC för att stoppa klientsidemanipluering av data. Snyggt va?
Färgmärkt och indenterat!
/*
* Blaufish's HMAC'ed and IV:ed encryptor/decryotor
* http://blaufish.blogg.se/
*
* Some rights reserved;
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
*/
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.Mac;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
public class TestIsATest {
private static final String HMAC_ALGORTIHM = "HmacSHA1";
@Test
public void test1() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes24 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes24, iv, "DESEDE", "/CBC/PKCS5Padding");
}
@Test
public void test2() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes24 = new byte[24];
rnd.nextBytes(keybytes24);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes24, iv, "DESEDE", "/CBC/PKCS5Padding");
}
@Test
public void test3() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes8 = new byte[8];
rnd.nextBytes(keybytes8);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes8, iv, "DES", "/CBC/PKCS5Padding");
}
@Test
public void test4() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes16 = new byte[16];
rnd.nextBytes(keybytes16);
byte[] iv = new byte[16];
rnd.nextBytes(iv);
testEncryption(keybytes16, iv, "AES", "/CBC/PKCS5Padding");
}
@Test
public void test5() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes16 = new byte[16];
rnd.nextBytes(keybytes16);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes16, iv, "blowfish", "/CBC/PKCS5Padding");
}
static void testEncryption(byte[] keybytes, byte[] iv,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidKeySpecException,
InvalidAlgorithmParameterException {
byte[] cleartext = "This is just an example".getBytes();
String encrypted = encrypt(keybytes, iv, cleartext, algorithm,
algorithmModifiers);
byte[] cleartext1 = decrypt(keybytes, encrypted, algorithm,
algorithmModifiers);
System.out.println(new String(cleartext1));
}
private static String encrypt(byte[] keybytes, byte[] iv, byte[] cleartext,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException {
SecretKey key = generateKey(keybytes, algorithm);
Mac mac = Mac.getInstance(HMAC_ALGORTIHM);
Cipher cipher;
cipher = Cipher.getInstance(algorithm + algorithmModifiers);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] ciphertext = cipher.doFinal(cleartext);
mac.init(key);
byte[] keyedDigest = mac.doFinal(cleartext);
TupleIvCiphertextMac icm = new TupleIvCiphertextMac(iv, ciphertext,
keyedDigest);
return icm.generateEncodedString();
}
private static byte[] decrypt(byte[] keybytes, String encryptedString,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException {
TupleIvCiphertextMac icm = new TupleIvCiphertextMac(encryptedString);
SecretKey key = generateKey(keybytes, algorithm);
Mac mac = Mac.getInstance(HMAC_ALGORTIHM);
Cipher cipher;
cipher = Cipher.getInstance(algorithm + algorithmModifiers);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(icm.iv);
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
byte[] cleartext = cipher.doFinal(icm.ciphertext);
mac.init(key);
byte[] keyedDigest = mac.doFinal(cleartext);
if (!Arrays.equals(keyedDigest, icm.mac)) {
throw new RuntimeException("MAC failure");
}
return cleartext;
}
private static SecretKey generateKey(byte[] keybytes, String algorithm)
throws NoSuchAlgorithmException, InvalidKeyException {
SecretKey secretKey = new SecretKeySpec(keybytes, algorithm);
if (algorithm.contains("DES")) {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
secretKey = skf.translateKey(secretKey);
}
return secretKey;
}
private static class TupleIvCiphertextMac {
private static final char FIELD_SEPARATOR = ':';
byte[] iv;
byte[] ciphertext;
byte[] mac;
TupleIvCiphertextMac(byte[] iv, byte[] ciphertext, byte[] mac) {
this.iv = iv;
this.ciphertext = ciphertext;
this.mac = mac;
}
String generateEncodedString() {
String sIV = Base64.encodeBase64String(iv);
String sCiphertext = Base64.encodeBase64String(ciphertext);
String sMac = Base64.encodeBase64String(mac);
StringBuilder sb = new StringBuilder().append(sIV).append(
FIELD_SEPARATOR).append(sCiphertext)
.append(FIELD_SEPARATOR).append(sMac);
return sb.toString();
}
TupleIvCiphertextMac(String encodedString) {
int separator1 = encodedString.indexOf(FIELD_SEPARATOR);
int separator2 = encodedString.lastIndexOf(FIELD_SEPARATOR);
if (separator1 == separator2) {
throw new IllegalArgumentException();
}
String sIV = encodedString.substring(0, separator1 - 1);
String sCiphertext = encodedString.substring(separator1 + 1,
separator2 - 1);
String sMac = encodedString.substring(separator2 + 1);
iv = Base64.decodeBase64(sIV);
ciphertext = Base64.decodeBase64(sCiphertext);
mac = Base64.decodeBase64(sMac);
}
}
}
/*
* Blaufish's HMAC'ed and IV:ed encryptor/decryptor
* http://blaufish.blogg.se/
*
* Some rights reserved;
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
*/
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.Mac;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
public class TestIsATest {
private static final String HMAC_ALGORTIHM = "HmacSHA1";
@Test
public void test1() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes24 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes24, iv, "DESEDE", "/CBC/PKCS5Padding");
}
@Test
public void test2() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes24 = new byte[24];
rnd.nextBytes(keybytes24);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes24, iv, "DESEDE", "/CBC/PKCS5Padding");
}
@Test
public void test3() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes8 = new byte[8];
rnd.nextBytes(keybytes8);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes8, iv, "DES", "/CBC/PKCS5Padding");
}
@Test
public void test4() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes16 = new byte[16];
rnd.nextBytes(keybytes16);
byte[] iv = new byte[16];
rnd.nextBytes(iv);
testEncryption(keybytes16, iv, "AES", "/CBC/PKCS5Padding");
}
@Test
public void test5() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] keybytes16 = new byte[16];
rnd.nextBytes(keybytes16);
byte[] iv = new byte[8];
rnd.nextBytes(iv);
testEncryption(keybytes16, iv, "blowfish", "/CBC/PKCS5Padding");
}
static void testEncryption(byte[] keybytes, byte[] iv,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidKeySpecException,
InvalidAlgorithmParameterException {
byte[] cleartext = "This is just an example".getBytes();
String encrypted = encrypt(keybytes, iv, cleartext, algorithm,
algorithmModifiers);
byte[] cleartext1 = decrypt(keybytes, encrypted, algorithm,
algorithmModifiers);
System.out.println(new String(cleartext1));
}
private static String encrypt(byte[] keybytes, byte[] iv, byte[] cleartext,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException {
SecretKey key = generateKey(keybytes, algorithm);
Mac mac = Mac.getInstance(HMAC_ALGORTIHM);
Cipher cipher;
cipher = Cipher.getInstance(algorithm + algorithmModifiers);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] ciphertext = cipher.doFinal(cleartext);
mac.init(key);
byte[] keyedDigest = mac.doFinal(cleartext);
TupleIvCiphertextMac icm = new TupleIvCiphertextMac(iv, ciphertext,
keyedDigest);
return icm.generateEncodedString();
}
private static byte[] decrypt(byte[] keybytes, String encryptedString,
final String algorithm, String algorithmModifiers)
throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException {
TupleIvCiphertextMac icm = new TupleIvCiphertextMac(encryptedString);
SecretKey key = generateKey(keybytes, algorithm);
Mac mac = Mac.getInstance(HMAC_ALGORTIHM);
Cipher cipher;
cipher = Cipher.getInstance(algorithm + algorithmModifiers);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(icm.iv);
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
byte[] cleartext = cipher.doFinal(icm.ciphertext);
mac.init(key);
byte[] keyedDigest = mac.doFinal(cleartext);
if (!Arrays.equals(keyedDigest, icm.mac)) {
throw new RuntimeException("MAC failure");
}
return cleartext;
}
private static SecretKey generateKey(byte[] keybytes, String algorithm)
throws NoSuchAlgorithmException, InvalidKeyException {
SecretKey secretKey = new SecretKeySpec(keybytes, algorithm);
if (algorithm.contains("DES")) {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
secretKey = skf.translateKey(secretKey);
}
return secretKey;
}
private static class TupleIvCiphertextMac {
private static final char FIELD_SEPARATOR = ':';
byte[] iv;
byte[] ciphertext;
byte[] mac;
TupleIvCiphertextMac(byte[] iv, byte[] ciphertext, byte[] mac) {
this.iv = iv;
this.ciphertext = ciphertext;
this.mac = mac;
}
String generateEncodedString() {
String sIV = Base64.encodeBase64String(iv);
String sCiphertext = Base64.encodeBase64String(ciphertext);
String sMac = Base64.encodeBase64String(mac);
StringBuilder sb = new StringBuilder().append(sIV).append(
FIELD_SEPARATOR).append(sCiphertext)
.append(FIELD_SEPARATOR).append(sMac);
return sb.toString();
}
TupleIvCiphertextMac(String encodedString) {
int separator1 = encodedString.indexOf(FIELD_SEPARATOR);
int separator2 = encodedString.lastIndexOf(FIELD_SEPARATOR);
if (separator1 == separator2) {
throw new IllegalArgumentException();
}
String sIV = encodedString.substring(0, separator1 - 1);
String sCiphertext = encodedString.substring(separator1 + 1,
separator2 - 1);
String sMac = encodedString.substring(separator2 + 1);
iv = Base64.decodeBase64(sIV);
ciphertext = Base64.decodeBase64(sCiphertext);
mac = Base64.decodeBase64(sMac);
}
}
}

Don't drink and code!

Fredag klockan 00:30 började en berusad Blaufish skriva kod. Klockan två var koden klar, och fisken var något mindre onykter. Då började jag inse den enorma idiotin i följande:
<html>
before... <div id="data"></div> after!
<script>
var html = "";
function out(data) {
html = html + data + " ";
document.getElementById('data').innerHTML = html;
}
function e(data) {
str = "";
var i;
for(i = 0; i < data.length; i++) {
var c = data.charAt(i);
switch(c) {
case '<': str += '&lt;'; break;
case '>': str += '&gt;'; break;
case '"': str += '&quot;'; break;
default:  str += c;
}
}
return str;
}
if (typeof DOMParser == "undefined") {
DOMParser = function () {}
DOMParser.prototype.parseFromString = function (str, contentType) {
if (typeof ActiveXObject != "undefined") {
var d = new ActiveXObject("MSXML.DomDocument");
d.loadXML(str);
return d;
} else if (typeof XMLHttpRequest != "undefined") {
var req = new XMLHttpRequest;
req.open("GET", "data:" + (contentType || "application/xml") +
";charset=utf-8," + encodeURIComponent(str), false);
if (req.overrideMimeType) {
req.overrideMimeType(contentType);
}
req.send(null);
return req.responseXML;
}
}
}
var url = "http://twitter.com/statuses/user_timeline/77535685.rss";
function xhr_handler() {
//if(this.readyState == 4 && this.status == 200) {
if(this.readyState == 4) {
var xml =  (new DOMParser()).parseFromString(this.responseText, "text/xml");
rss_handler(xml);
}
}
function rss_handler(xml) {
var rss = xml.getElementsByTagName('rss')[0];
var channels = rss.getElementsByTagName('channel');
var channel;
var i;
for(i=0; i < channels.length; i++) {
channel = channels.item(i);
var channel_title = channel.getElementsByTagName('title').item(0).firstChild.nodeValue;
var channel_link = channel.getElementsByTagName('link').item(0).firstChild.nodeValue;
out('<a href="' + channel_link + '">' + channel_title + '</a><br>');
var items = channel.getElementsByTagName('item');
var j;
for(j=0; j < items.length; j++) {
var items_item = items.item(j);
var items_title = items_item.getElementsByTagName('title').item(0).firstChild.nodeValue;
out(e(items_title)+'<br>');
}
}
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = xhr_handler;
xhr.open("GET", url);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.send();
</script>
</html>
<html>
before... <div id="data"></div> after!
<script>
var html = "";
function out(data) {
html = html + data + " ";
document.getElementById('data').innerHTML = html;
}
function e(data) {
str = "";
var i;
for(i = 0; i < data.length; i++) {
var c = data.charAt(i);
switch(c) {
case '<': str += '&lt;'; break;
case '>': str += '&gt;'; break;
case '"': str += '&quot;'; break;
default:  str += c;
}
}
return str;
}
if (typeof DOMParser == "undefined") {
DOMParser = function () {}
DOMParser.prototype.parseFromString = function (str, contentType) {
if (typeof ActiveXObject != "undefined") {
var d = new ActiveXObject("MSXML.DomDocument");
d.loadXML(str);
return d;
} else if (typeof XMLHttpRequest != "undefined") {
var req = new XMLHttpRequest;
req.open("GET", "data:" + (contentType || "application/xml") +
";charset=utf-8," + encodeURIComponent(str), false);
if (req.overrideMimeType) {
req.overrideMimeType(contentType);
}
req.send(null);
return req.responseXML;
}
}
}
var url = "http://twitter.com/statuses/user_timeline/77535685.rss";
function xhr_handler() {
//if(this.readyState == 4 && this.status == 200) {
if(this.readyState == 4) {
var xml =  (new DOMParser()).parseFromString(this.responseText, "text/xml");
rss_handler(xml);
}
}
function rss_handler(xml) {
var rss = xml.getElementsByTagName('rss')[0];
var channels = rss.getElementsByTagName('channel');
var channel;
var i;
for(i=0; i < channels.length; i++) {
channel = channels.item(i);
var channel_title = channel.getElementsByTagName('title').item(0).firstChild.nodeValue;
var channel_link = channel.getElementsByTagName('link').item(0).firstChild.nodeValue;
out('<a href="' + channel_link + '">' + channel_title + '</a><br>');
var items = channel.getElementsByTagName('item');
var j;
for(j=0; j < items.length; j++) {
var items_item = items.item(j);
var items_title = items_item.getElementsByTagName('title').item(0).firstChild.nodeValue;
out(e(items_title)+'<br>');
}
}
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = xhr_handler;
xhr.open("GET", url);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.send();
</script>
</html>
1. Det är helt onödigt, det finns redan enklare sätt att få in twitter på sin blogg (typ, använda det på twitters hemsida)
2. Det verkar bara fungera i IE. I övriga browsers får man inte ens läsa HTTP response-koden, vilket förmodligen är ett säkerhetsskydd mot datastölder (förbud mot cross domain XHR).
Både 1 och 2 borde jag vetat från start. Men med en massa vin i sig så...
Mycket är av koden är lånat från webb, det mesta är exempelkod och annan public domain.
Intressanta läror:
IE populerar inte responseXML om innehållstypen är RSS.
IE exponerar inte xml-parsern per default.

iPhone 3GS recension till geocaching.com

OBVIOUS:
Cool phone which can do "everything". Great games and apps.
GEOCACHING, GOOD:
The compass is excellent, the geocaching software by groundspeak is also very good (limited, but good).
The A-GPS solution works superb, gets GPS lock almost instantly 9 times out of 10.
Can show geocache in Google maps, and google maps can route way to geocache in the city.
GEOCACING, BAD:
GPS reception is a bit lacking compared to e.g. Garmin Colorado, GPS 60 etc.
You need to use map and hint a lot as GPS coordinates often are too off to be used geocaching.
No wherigo support?
No good support for GPS avaraging and other "how to hide a geocache"; definately something which beginners would need and appreciate, the phone should tell beginners what they need to do and if the coordinate is good enough.
No good support for making temporary notes, i.e. you need pen&paper to make notes during multi's and mysterys.
Not suitable as a primary GPS, more like a secondary supporting gadjet - I use it mainly to log online.
Some issues can be remedied by using e.g. MotionX but in my opionon iPhone is clearly less powerfull than a Garmin device as soon as you need to do any moderately complex task. Better application support can remedy some of it in the future though.
OBVIOUS:
  • Cool phone which can do "everything".
  • Great games and apps.
GEOCACHING, GOOD:
  • The compass is excellent, the geocaching software by groundspeak is also very good (limited, but good).
  • The A-GPS solution works superb, gets GPS lock almost instantly 9 times out of 10.
  • Can show geocache in Google maps, and google maps can route way to geocache in the city.
GEOCACING, BAD:
  • GPS reception is a bit lacking compared to e.g. Garmin Colorado, GPS 60 etc.
  • You need to use map and hint a lot as GPS coordinates often are too off to be used geocaching.
  • No wherigo support?
  • No good support for GPS avaraging and other "how to hide a geocache"; definately something which beginners would need and appreciate, the phone should tell beginners what they need to do and if the coordinate is good enough.
  • No good support for making temporary notes, i.e. you need pen&paper to make notes during multi's and mysterys.
  • Not suitable as a primary GPS, more like a secondary supporting gadjet - I use it mainly to log online.
Some issues can be remedied by using e.g. MotionX but in my opionon iPhone is clearly less powerfull than a Garmin device as soon as you need to do any moderately complex task. Better application support can remedy some of it in the future though.
(är vad jag tänkte skriva, men fick korta ner något för att komma in under gc.com's begränsade maxlängd)

GO:TEBORG Wherigo

Jag och Benrangel gav oss ut i rusket för att pröva Göteborgs nya Wherigo cache, GO:TEBORG, stadens första. Jag har kört Wherigo lite grann, mest "Build your own GPSr", men detta var första gången det varit en cache kopplad till Wherigo-programmet. I grova drag var det muti på sightseeing tema med lite bilder och turistinformation. Ett ganska trevlit och kul upplägg. Ser fram emot att lite mer spel-orienterade wherigo-cacher publiceras, kan bli riktigt kul!


October 11 by blaufish (1338 found)
Ombedd att ge feedback!

Wherigo enhet/mjukvara: Garmin Colorado 300

Erfarenheter/synpunkter:

- Helhetintryck av tekniken: funkade klockrent. Inget strul, bara funkade!

- Potentiell tekniskt förbättring: vore fint om man bedömdes framme när man var inom 3 meter från en waypoint. Lite lustigt att jaga den exakta nollan när man är framme, tog typ 1-2 min att jaga den vid en punkt (gissa om jag såg kul ut om någon spanat på mig just då), annars så var det oftast pang på.

- Cacheupplägg: ganska trevlig promenad en ganska blöt, kall och rå dag, lite lång så det var kul att ha benrangel med så man slapp traska runt ensam i någon timme. Kändes ungefär som en bra och enklare multi, vilket är helt OK eftersom det var just det jag förväntade mig från cachebeskrivningen. Jag tror wherigo systemet tillåter mer avancerade cacher, t.ex. att waypoints dyker upp allt eftersom, RPG-liknande spel osv. Tycker cachen är finfin och inte bör ändras så mycket, men denna lämnar mersmak - Göteborg bör få lite fler och mer exotiska wherigo's.

Tack för en bra start j-annie :-)


October 11 by blaufish (1338 found)
Min första wherigo ! med benrangel. Ganska kul faktiskt värt att börja experimentera med detta!


Sen ströcachade vi lite. På det hela taget väldigt skönt att få vara ute och röra rejält på kroppen igen, och prata om både geocaching och de stora och små frågorna i livet. Båda var rätt trötta och slitna av lite olika anledningar så vi var helt i synk: stopp på Max, McD och cafér höll oss vid liv och värmde upp oss när vi var lite för frusna från det blöta. Någon sådan här tur behövs för att få vila hjärnan, fräsha upp kroppen och få nya krafter ibland!

På väg mot Feskekrykan träffade vi förresten två glada nybörjare som såg att vi bar GPS:er och undrade om vi hittat cachen. Lite förvirring senare insåg vi att de referade till Petit och förklarade att vi inte letat efter den men pekade ut var den skall sitta och inflikade "kanske inte så lämplig att ta nu när det är blött och halt". De berättade att de loggat 18 cacher och jag viftade glatt åt benrangel och frågade "Benrangel, hur många har du tatt nu?" "Drygt 2500". De hoppade till lite förskräckt =) Tyvärr visade de sig vara bilburna och ha en egen plan, annars hade vi nog erbjudit dem att haka på vår wherigo-färd.

Intensivt...

Väldigt mycket just nu, därav att jag inte bloggat. Försökt twittra lite från mobilen istället, så att det skall komma lite linjebrus från mig åtminstone! La just till ett litet twitter widget på startsidan. Dock så verkar det bara funka i IE och Chrome, i FF krånglar det (varken adblockern eller noscript spyr på det dock, vet det tusan vad det kan vara.
På cachingfronten så loggade jag just Three Wise Monkeys som varit ett problem länge men som jag och Benrangel fick löst för några dagar sen.
Annars så har jag satt loggat några trevliga legacy-cacher; så som Red Ghost Letterbox (Letterbox Hybrid) och Keep an eye on the road (Webcam Cache). Speciellt Red Ghost var kul, dels för att cachen i sig var en rolig utmaning och dels för att det var min allra första Letterbox cache!
Så FTF:ade j.pixbo OUIIUO (Unknown Cache) och hade turen att vara med :).

Twittrar

Med bland iphone applikationerna fanns en bunt Twitterapplikationer, och jag bestämde mig för att testa några. Valde Twitteriffic på lite lösa grunder (den fanns i gratis trialversion, hade en grymt snygg icon och såg lättanvänt&trevligt ut) och efter att testat det lite snabbt passade jag på att köpa den skarpa versionen.

Så: lägg blaufish_ på minnet ("One word. Witten like this: bLaufish_, capital L, trailing underscore, bLaufish_"... just kidding :-) ).  http://twitter.com/Blaufish_

Sen exakt var avvägningen mellan hur mycket jag bloggar VS twittrar framöver återstår att se, det gäller att hitta rätt former. Givet att det blir mycket resande ett tag framöver kanske det blir mer kvitter än bloggande, då enkelheten i kvittrandet passar bra - enkelheten och kravlösheten i twittrandet passar bra för någon som med livet i en laptopväska. Bloggandet är bättre när man vill vara intelligent, tankeväckande eller publicera roliga bilder.

blaufish_Tycker det är lite spännande med mysterys som folk har svårt att knäcka. Åttaårsdagen, GKV Mystery osv, själv först och sen ingen. Tufft! :)less than 5 seconds ago from web

blaufishblaufish_...cut my leg on the glas while getting up of bed! (clarification: the lamps broke, the window is fine)2 minutes ago from web

blaufishblaufish_worst wakeup ever: the storm blew my window open and it smashed down my lamps. It turned into glas shreds all around me and my bed, cut ...3 minutes ago from web

Johan DahlbergJoziiRT @larmats: kanonlänk att tipsa om! http://bit.ly/3mNGYz Se vad de bloggar och twittrar om och ge poäng till de folkvalda i riksdagenabout 2 hours ago from TweetDeck

blaufishblaufish_Still no STF on GKV Mystery :-)about 4 hours ago from Twitterrific

blaufishblaufish_Gick nästan hela vägen till jobbet men nu blir det spårvagn för att hinna i tid till morgonmöte.about 13 hours ago from Twitterrific

blaufishblaufish_@diephotographin i use the one by groundspeak i like ut. People At geocaching.se Said it was one of the bestabout 13 hours ago from Twitterrific in reply to diephotographin

blaufishblaufish_@joeunfiltered geocaching on avarage 1cache/day.addictive fun! Some are cool:Seen tunnels bunkers heights. Lots of splendid nature tooabout 15 hours ago from Twitterrific in reply to JoeUnfiltered

blaufishblaufish_@KI6ILS not sure what you are trying to do. Do you have an option find nearby caches?about 15 hours ago from Twitterrific in reply to KI6ILS

blaufishblaufish_Morgon :-) känns som en bra veckaabout 16 hours ago from Twitterrific

blaufishblaufish_@rumcat You need a gps or a phone with gps. iPhone #geocaching app by groundspeak is good. Geocaching Live for other phonesabout 22 hours ago from Twitterrific in reply to rumcat

blaufishblaufish_@kmtom in Sweden #geocaching .se maintains a list of volunteers that support beginners. Maybe the local geocaching community has one too?about 22 hours ago from web

blaufishblaufish_Loggat Liseberg spoting cache!5:13 PM Sep 27th from Twitterrific

blaufishblaufish_Två av tre visa apor funna!2:34 PM Sep 27th from Twitterrific

blaufishblaufish_Got my #eee PC running #eclipse IDE on #linux. Works nice for small apps after slimming down the GUI: http://tinyurl.com/y9yk7fb9:16 PM Sep 26th from web

blaufishblaufish_@dueyfinster congratulations!8:44 PM Sep 26th from Twitterrific in reply to dueyfinster

blaufishblaufish_@arnfinnmork Fumble After Dark: #geocaching event in the dark night gc1rxtr strong led recommended8:39 PM Sep 26th from Twitterrific in reply to arnfinnmork

blaufishblaufish_@f1manager pq pocket query i.e 500 geocaches in one file #geocaching8:33 PM Sep 26th from Twitterrific in reply to f1manager

blaufishblaufish_@f1manager Site is slow because tio much load on too fee servers. Pm won't help but pm use pq so we need the site less #geocaching8:31 PM Sep 26th from Twitterrific in reply to f1manager

Johan DahlbergJoziiJag gjorde bort mig på bokmässan! http://bit.ly/m9Kfw8:29 PM Sep 26th from TweetDeck

blaufishblaufish_@f1manager use geocaching.com while USA cachers sleep much faster! I use pq fn & iphone to minimize website use. #geocaching8:09 PM Sep 26th from Twitterrific in reply to f1manager

Eee & Eclipse, funkar bra!

Fick in Eclipse utan några som helst problem och slimmade det till en bra storlek, genom att flytta runt koden. Visst det är en nackdel att inte ha en enorm widescreen med hög upplösning, men denna bör funka för mindre uppgifter!


The Night

The Night

Andra bloggar om: 
Technorati: 

Java & NetBeans installation på Eee PC

Jag har tänkt flytta min mysteryknäckar-arsenal till min ultraportabla Eee PC. Alltså javasnuttar för att dekoda morse, göra subsitutionschiffer, räkna primtal och nummerserier, trixa med filer, osv osv.
-
I grova drag följde jag denna guide: http://blogs.sun.com/eckstein/entry/video_blog_5_netbeans_6 fast förenklade lite; jag laddade bara hem en Java SE SDK från java's hemsida som kom med NetBeans förpaketerat, och installerade den rakt av. Fick dock ange en annan tempdrive (för att rootpartionen /.rw är nästan full) och installera till /home/user/java istället för /usr/java, av samma orsak.
-
En sak som strulade till det var att instruktionerna om simpleui.rc var fel, den filen gör ingenting alls på min version av Eee. Istället är det denna filen som gäller:
 /var/lib/AsusLauncher/simpleui.rc
Eee wikin har mer info.
-
Det enda negativa var att jag fick en depression när jag såg NetBeans igen. Detta pinsamt fula uschliga usla monster. Skall se om jag inte kan få Eclipse för Java att funka på Eee också, så man slipper sitta fast i monstret som ser ut som en zoombie från 70-talet.