3 Sustainability and Tree Planting related Chrome extensions

Being sustainable is increasing in popularity. Except from eating less meat, flying less, recycling, etc. there’s also ways to browse as sustainable as possible. In this article we’re giving 3 Chrome extensions that make living sustainable easier. Some even plant trees for free!TreeClicks Screenshot

1. TreeClicks – Plant Free Trees While Shopping

TreeClicks is a recently launched Chrome & Firefox extension that plants trees for free while shopping. It works simple.

  1. You go to TreeClicks.com
  2. Download the TreeClicks Chrome or Firefox extension
  3. When you shop at one of their more than 50.000 connected stores, trees are planted from the ad fee they receive. You do have to activate the TreeClicks popup that shows up when you visit one of their connected stores.

When shopping a decent amount, it’s easy to help planting already a couple of trees. Since online shopping is a 500 billion dollar business in the United States, if only a tiny percentage of this fee goes into tree planting, TreeClicks could plant billions of trees. Download now.

2. Tab for a cause

Tab for a Cause is a very simple Chrome extension that shows a tab with an advertisement every time you open a new tab. A part of that ad revenue is used for causes. You can select your own causes. If you want a sustainable cause, choose for example a Nature Conservancy related cause.

3. DoneGood – shop more ethical

DoneGood is a simple Chrome Extension that recommends brands that make the world better a place.

It’s an online shopping assistant automatically recommends the best ethical, sustainable brands as you shop on Amazon, Google, or other retail websites. Plus, with exclusive offers and discount codes for 25% off or more, you can easily shop your values while saving money at the same time.

Other handy Chrome Extensions

While this is a short list, there’s many other great Chrome Extensions. Check them out here:

  • Adblock
  • Article about other productivity Chrome Extension
  • Forest: This Chrome extension is also sustainability related. It plants a virtual tree. That one gets destroyed if you browse un-useful websites.
  • Grammarly: Chrome Extension that checks your input on grammar and spell errors.

Lijst van Nederlandse PSP’s om uit te sluiten in Google Analytics voor iDeal, Mollie en PayPal

Wanneer je in Google Analytics E-commercetracking, dus tracking van sales bijhoudt, valt het je misschien op dat je veel referral verkeer krijgt als veroorzaker van de sale. Als je dat opzoekt zie je dan adressen als: ideal.ing.nl en mollie.com . Dat zijn niet de adressen waar de bezoekers begonnen. Toch worden ze als referral bron geregistreerd.

Hoe voorkom je dit? Dit artikel legt het goed uit. Alleen is de lijst met referrals achterhaald. Wij hebben hem geüpdatet met de meeste Nederlandse banken en  Payment Service Providers (PSP’s) zoals PayPal en Mollie:

Lijst met Nederlandse PSP’s en iDeal + Mister Cash Banken

  • ideal.vanlanschot.com
  • multisafepay.com
  • mollie.com
  • ideal.ing.nl
  • bankieren.ideal.ing.nl
  • betalen.rabobank.nl
  • abnamro.nl
  • ideal.asnbank.nl
  • ideal.snsbank.nl
  • ideal.triodos.nl
  • securecode.abnamro.nl
  • pay.multisafepay.com
  • paypal.com
  • pay.mollie.nl
  • pay.mollie.com
  • ideal.knab.nl
  • diensten.asnbank.nl
  • bancontact.girogate.be
  • ideal.bunq.com
  • pay.multisafepay.com
  • secure.curopayments.net
  • pay.nl
  • payment-web.sips-atos.com
  • secure.ogone.com
  • ideal.regiobank.nl

Je voegt deze lijst in Google Analytics per entry toe bij Admin > Tracking Info > Referral Exclusion List.

Ontbreekt er nog een bank?

Bekijk regelmatig je referral verkeer. Als je dan dingen ziet zoals bijv. ideal.JOUWBANK.nl voeg je hem toe aan je referral exclusion list. En laat het gerust in de comments weten!

Waarom de Secrid portemonnee NIET duurzaam is

Vier jaar geleden heb ik een Secrid portemonnee in gebruik genomen. Het is in principe de eerste vier jaar een top product. Wanneer je googlet op: “Secrid duurzaamheid” zie je veel posts die hem als duurzaam aanprijzen. Zoals BNR beschrijft:

Secrid produceert hun slimme portemonnee bij Nederlandse sociale werkplaatsen en gebruiken het leer van lokale leerlooiers.

Dat klinkt fantastisch en sommige shops noemen de portemonnee zelfs 100% recyclebaar en duurzaam.

Eerste tekenen van uitelkaar gaan na ongeveer drie jaar

Helaas, na drie jaar beginnen de naden van de cardprotector en het leer los te laten. Nu, na ruim vier jaar zit hij nog aan een paar naden vast, maar is hij zo goed als kapot:

Secrid kapot

secrid kapot 2

Jammer, maar aangezien Secrid zo een duurzaam bedrijf is, zullen ze hier ongetwijfeld vaker te maken mee krijgen en een passend oplossing hebben.

Tijd om de klantenservice te mailen …

Mailen met de Secrid klantenservice

Secrid geeft aan dat ze een garantietermijn hebben van twee jaar. De termijn wordt met een jaar verlengd als je je wallet registreert. Helaas kunnen ze niks meer doen voor mijn portemonnee:

Wij hanteren een garantietermijn van 2 jaar en sinds 2016 is het mogelijk om een 3e jaar garantie te krijgen door de wallet te registeren. De garantietermijn is dus helaas voorbij en daarom kunnen wij je niet verder helpen.

Zelfs als ik ze aanbied om de reparatiekosten voor eigen rekening te nemen kunnen ze niks doen. Zoals ik ze mail:

Dat snap ik helemaal. Wat zouden de kosten zijn om hem te laten repareren? Ik vind het zonde om hem weg te gooien en volgens mij gaat dat ook jullie eigen duurzaamheidsprincipe tegen?

Daarop reageert de klantenservice van Secrid met:

Helaas is het niet mogelijk om het leer te repareren. Normaalgesproken sturen we een nieuw product als het nog binnen de garantietermijn valt. Je zou het zelf kunnen proberen te naaien, maar ik weet niet of dit echt gaat werken. Ik ben bang dat je toe bent aan een nieuw product.

Dan maar zelf repareren

Het kost je een uur en de nodige frustratie, maar het lukte me inderdaad om de portemonnee zelf te repareren met naald en draad:

Secrid naald en draad Secrid naaien Secrid genaaid en gerepareerd

Een druppeltje lijm langs de naden doet wellicht ook nog wat wonderen.

Verdere tips voor Secrid zelf

Nou heb ik geen zin om zuur te worden en onredelijke uitspraken over Secrid te doen. De wallet is vier jaar meegegaan, niet slecht, maar ik had van zo een hip designbedrijf dat zichzelf als duurzaam profileert toch meer oplossingen verwacht. Ik weet zeker dat veel mensen niet de moeite zouden nemen om de portemonnee te naaien, waardoor deze op de vuilnishoop belandt.

Secrid CEO, mocht je dit lezen, hier heb je wat tips van bedrijven die wel kaas gegeten hebben van duurzaamheid:

  • Mud Jeans – Hier lease je een spijkerbroek voor €5 per maand. Als ie kapot gaat, stuur je hem op en krijg je een gerepareerde of nieuwe. Wellicht een idee voor Secrid om te starten met leasen van portemonnees voor een tientje per jaar?
  • Eastpak – Biedt uit mijn hoofd 30 jaar garantie. Ik heb hier ooit mijn tien jaar oude rugzak naartoe teruggestuurd, omdat de ritssluiting kapot was. Binnen een paar weken kreeg ik weer een werkende tas terug. Eastpak heeft ervoor gezorgd dat de afvalhoop net een stukje kleiner blijft.

P.S. repareren is op eigen risico. Ga er vanuit dat je van Secrid in ieder geval weinig hulp krijgt.

South-Africa Tourist Visa Extension with 90 days

south africa tourist visa extensionSouth-Africa gives a 90 day tourist visa to most Western countries (I’m Dutch, so this probably/hopefully will work for most EU countries). There are possibilities to extending another 90 days. With this tourist visa extension guide you can stay up to 180 days in total.

UPDATE: While having done this visa extension myself I only got an extension for 90 days from the visa extension date, not from the expiry date. VFS tells that I should have done a visa extension 7 days before expiry instead of 60 days before expiry. This is very confusing. So, ask a VFS of visa service company very clear about this. Else you would get (just like me) a shorter extension than 90 days. Read more about is on this blog.

While being in this situation myself, I’ve written this article to prevent wasting hours of time for you. Use this article on your own risk.

Apply for an extension as soon as possible as you enter the country, since it may take up to eight weeks. In order for one to apply for an extension of your existing visa, an extension application needs to be made 60 days prior to the expiry of your current visa and must be submitted in person at one of the VFS Global centres in South Africa.

How to extend your 90 days visa with another 90 days?

Step 0) Go to a VFS office

VFS Global is the office that runs the visa/immigration service in SA. They will explain you what you need to extend your tourist visa. In my case:

  • Flight return ticket within these 180 days, your return date determines the amount of extra days you’ll get (a flight reservation is fine, which you can do at Flight Centre)
  • Copy of passport / visa
  • Proof of enough financial incomes
  • Letter of support

Step 1) Fill in the form

  • USE INTERNET EXPLORER: or the browsers VFS advice. Safari (or maybe even Chrome) won’t work!
  • Don’t forget your password! The password forget tool of VFS does NOT work!

VFS gave me a form with what to fill in and what you need and where you need to fill in this form https://www.vfsvisaonline.com/DHAFOSOnlineVAF/gatewaypage.aspx. That may differ for your situation.

In my case, I filled in these details (check if the visa in your passport also says 11(1) or call VFS):

VFS Form - what to select

 

Then you can create an account, fill out the requested forms, pay by credit card and create an appointment (this only works with Internet Explorer). From then it can take some time for your visa to be renewed.

2) Make an appointment

Make an appointment, this only works in Internet Explorer. The VFS office will help you further to get your tourist visa extended. In this appointment letter you will find the documents you need to bring along (like a flight reservation until your new desired stay date, copy of passport & visa, motivation letter, etc.).

3) Go to the appointment

In the appointment you’ll need to bring all the documents as requested in your appointment letter and checklist which will be emailed to you after you scheduled an appointment. The VFS member takes all your documents and gives a trace-number you can use to track your application.

4) Wait

It could take a while to hear about an update. Check if your trace number is in the system and if so, just wait a while.

Following this article is at your own risk. Not sure what to do? Go to a VFS office or call them.

Good luck with your visa extension!

More info on tourist visa extension:

NB. This is just a guideline. Use at your own risk.

Moneybird koppelen met PayPal transacties

Doe je ook je boekhouding met Moneybird en ben je online actief? Grote kans dat je dan wel eens een PayPal transactie hebt moeten koppelen in Moneybird. Daarvoor heb je twee mogelijkheden:

  1. Aan de PayPal transactie de één of meerdere facturen die erachter horen koppelen in het tabblad “banktransacties”.
  2. Een aparte PayPal-bankrekening bijhouden waarin alle transacties gekoppeld worden, zoals Moneybird vermeldt.

Als je veel transacties hebt en regelmatig een positief saldo hebt bij PayPal heb je al snel met optie 2 te maken. Je moet volgens Moneybird PayPal transacties één voor één inboeken.

Aparte rekening aanmaken met MT940 software

Je kunt ook CSV-export doen van PayPal en de CSV omzetten in MT940. Gebruik daarvoor de MT940-creator. Zelf gebruik ik het volgende stappenplan:

  1. Ga naar PayPal, selecteer een datum, eventuele overlap mag, maar let goed op het begin- en eindsaldo. Het makkelijkste is een moment waarop deze allebei 0 zijn.
  2. Exporteer als CSV met bedragen die ‘invloed op saldo’ hebben (selecteer deze optie).
  3. Check begin en eindsaldo in CSV, bij voorkeur allebei 0
  4. Voer in in MT940 creator
  5. Check de begin- en eindsaldo’s of deze kloppen
  6. Controleer of PayPal valutafilter op EUR staat
  7. Rekeningnr = 222222222 (een fictief rekeningnummer, ik gebruik de ABN-Amro unstructured export soort)
  8. Klik op opslaan als en voer in bij de bank van Moneybird
  9. Check in Moneybird bij Rapporten bij Balans of het saldo van rekening 222222222 klopt per de maand van het eindsaldo. Als het saldo 0 is staat de rekening er niet tussen.

Vervolgens kun je alle transacties koppelen in je nieuwe fictieve 222222222 PayPal rekening.

MT940 PayPal Moneybird account

Beste optie: API

Iemand tijd en zin om een API te bouwen die dit bovenste automatisch doet? Ik zou er geld voor over hebben. Is het je gelukt? Of heb je inmiddels een betere workaround? Laat het onderstaand weten.

 

Laravel 5 socialite with Facebook integration

Would you like to offer a Facebook login functionality next to a regular e-mail based login? This is a tutorial to achieve that with Laravel 5 and the Socialite plugin. This tutorial is based on Matt Stauffer’s tutorial.

First of all pull in Laravel Socialite via composer:

composer require laravel/socialite

Create the users and password_remember migration:

$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('avatar');
$table->string('password', 60);
$table->boolean('is_admin');
$table->string('facebook_id');
$table->rememberToken();
$table->timestamps();

Get your Facebook developer id and secret at: https://developers.facebook.com/.

Insert the Facebook credentials into the app/services.php file:

'facebook' => [
        'client_id' => env('FACEBOOK_ID'),
        'client_secret' => env('FACEBOOK_SECRET'),
        'redirect' => env('FACEBOOK_URL'),
    ],

In my case, I store them in the .env file as environment variables:

FACEBOOK_ID=xxx
FACEBOOK_SECRET=yyy
FACEBOOK_URL=http://myapp.devapp/auth/facebook/callback

Create a users model and make sure that some fields are fillable:

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use Authenticatable, CanResetPassword;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password', 'avatar', 'facebook_id'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['password', 'remember_token'];
}

So the model and migrations are prepared, if necessary, run your migration:

php artisan migrate

Register a new controller in your routes file (if there’s an auth controller already, do it above the auth controller):

Route::get('/auth/facebook', 'Auth\SocialController@redirectToProvider');
Route::get('/auth/facebook/callback', 'Auth\SocialController@handleProviderCallback');

Create the Facebook Social Auth Controller (app/Http/Controllers/Auth/SocialController.php):

<?php namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; use App\User; use App\Http\Requests; use App\Http\Controllers\Controller; use Auth; use Socialite; class SocialController extends Controller { /** * Redirect the user to the Facebook authentication page. * * @return Response */ public function redirectToProvider() { return Socialite::driver('facebook')->redirect();
    }

    /**
     * Obtain the user information from Facebook.
     *
     * @return Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('facebook')->user();

        $authUser = $this->findOrCreateUser($user);

        Auth::login($authUser, true);

        return redirect()->back();
    }

    /**
     * Return user if exists; create and return if doesn't
     *
     * @param $fbUser
     * @return User
     */
    private function findOrCreateUser($fbUser)
    {

        if ($authUser = User::where('facebook_id', $fbUser->id)->first()) {
            return $authUser;
        }

        return User::create([
            'name' => $fbUser->name,
            'email' => $fbUser->email,
            'facebook_id' => $fbUser->id,
            'avatar' => $fbUser->avatar
        ]);

    }
}

You can now link to your social auth controller from somewhere in your blade view:

<a class="btn btn-primary" href="{{ action('Auth\SocialController@redirectToProvider') }}"> Login with Facebook</a>

Important safety note

If you’d like to keep the possibility for people to login, make sure that you’ve empty password validation checks, so that people can’t sign in with only Facebook e-mail addresses.

That’s it. Do you’ve additions to this tutorial? Let me know in the comments.

Magic Trackpad Rubber Replacement Tutorial

Lost your Apple Magic Trackpad rubber feet / mouse button?

It happened to me that the rubber feet of the Magic Trackpad suddenly was lost. Problem is that you aren’t able to buy them at the Apple store. My solution was simple. Get a pencil’s eraser. And cut a small slice off.
Magic Trackpad Pencil
And glue tape it under the trackpad in order to see if the height of the feet is good. If it is good glue it with a small point at the trackpad. Make sure that you don’t glue too much, else the trackpad isn’t able to click. Doing this is at your own risk of course.

Magento Direct SQL Queries

Queries for fetching in an array


    /**
     * Get the resource model
     */
    $resource = Mage::getSingleton('core/resource');
     
    /**
     * Retrieve the read connection
     */
    $readConnection = $resource->getConnection('core_read');
     
    $query = 'SELECT * FROM ' . $resource->getTableName('catalog/product');
     
    /**
     * Execute the query and store the results in $results
     */
    $results = $readConnection->fetchAll($query);
     
    /**
     * Print out the results
     */
     var_dump($results);

Fetching one query

Therefore use the method fetchCol() instead of fetchAll, so like:

$sku = $readConnection->fetchCol('SELECT sku FROM ' . $table . ');

Read more at FishPig.

Queries for wrtiting

$resource = Mage::getSingleton('core/resource');
	$writeConnection = $resource->getConnection('core_write');
	
	$query = "INSERT INTO abc_hit SET
			  visitor_id = :visitor_id,
			  hit_date = :hit_date,
			  ";
	$binds = array(
    'visitor_id' => $_SESSION['visitor_id'],
    'hit_date' => date("Y-m-d H:i:s"),
	);
	
	$writeConnection->query($query, $binds);

Get Last Inserted ID

$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$sql = "INSERT INTO .......";
$write->query($sql);
$lastInsertId = $write->lastInsertId();

Thanks to sbditto85.

IWD Checkout refresh review after payment selection

With the IWD onestep checkout plugin, there’s a free method for one step checkouts.

Though it still has a problem when you want to select a payment method, because it doesn’t refresh the review summary. This is feature is vital for payment methods that add service fee. Thanks to this plugin I found a code workaroud.

Just enable jQuery $j and add the following code in the checkout process (onepagecheckout.phtml):

$j(function($) {
      $j('input[name*="payment[method]"]').live('click', function() {
              checkout.update({
                    'review': 1,
                    //,'shipping-method': 1
                    'payment-method': 1
              });

             setTimeout(function(){
                        checkout.update({
                            'review': 1
                            //'payment-method': 1
                        });
             }, 5000);
      });

      $j('input[name*="shipping_method"]').live('click', function() {
              checkout.update({
                    'review': 1
                    ,'payment-method': 1
                    //'shipping-method': 1
              });
             setTimeout(function(){
                        checkout.update({
                            'review': 1,
                            //'payment-method': 1
                        });
             }, 500);
        });
	});

Now IWD One Step checkout works with payment methods with service costs, because the review/summary is refreshed.

Having too much problems with IWD, than just try OneStepCheckout.

Add an image field in your admin plugin (by example AW Blog)

Schermafbeelding 2013-07-03 om 14.28.17

Add an image field to plugins like AW Blog

Edit in /app/code/community/AW/Blog/Block/Manage/Blog/Edit/Tab/Form.php

$fieldset->addField('filename', 'file', array(
'label' => Mage::helper('blog')->__('Image'),
'required' => false,
'name' => 'filename',
'after_element_html' => 'Formaat 125 x 118 pixels',
));

Edit in /app/code/community/AW/Blog/controllers/Manage/BlogController.php after:

public function saveAction() {

if ($data = $this->getRequest()->getPost()) {

Add:

if(isset($_FILES['filename']['name']) && $_FILES['filename']['name'] != '') {
try {
/* Starting upload */
$uploader = new Varien_File_Uploader('filename');

// Any extention would work
$uploader->setAllowedExtensions(array('jpg','jpeg','gif','png'));
$uploader->setAllowRenameFiles(false);

// Set the file upload mode
// false -> get the file directly in the specified folder
// true -> get the file in the product like folders
// (file.jpg will go in something like /media/f/i/file.jpg)
$uploader->setFilesDispersion(false);

// We set media as the upload dir
$path = Mage::getBaseDir('media') . DS ;
$uploader->save($path, $_FILES['filename']['name'] );

} catch (Exception $e) {

}

//this way the name is saved in DB
$data['filename'] = $_FILES['filename']['name'];
}

Further add an field ‘filename’ in your db (table ‘aw_blog’).

And finally in /app/code/community/AW/Blog/Block/Blog/Edit/Form.php make sure that $form variable is defined as follows, so it works with multipart/form-data:

$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
'method' => 'post',
'enctype' => 'multipart/form-data',
)
);