Friday, May 16, 2014

Disney Cars 2 game problem windows 8

Maybe this solution will work for you ?

My son loves the Disney Cars 1 & 2 games. Well.. he loves Disney Cars movies as well :) This game is not supported on windows 8 (especially running on Intel HD4000 graphic card) but it works.. It hangs randomly but we can play. Suddenly I noticed that it no longer runs.
The process starts and crashes after 10 seconds. Using a grat AppCrashView app I found that the process loads a Bitdefener antivirus module which I have installed 2 days before we tried to play Cars again.

Here's the line:

LoadedModule[4]=C:\Program Files\Bitdefender\Antivirus Free Edition\avc3\avc3_sig_241\avcuf32.dll

After uninstalling the antivirus the game works fine. Yeah!

Though I love Bitdefender I have to admit that I can't use it with Cars game. Back to Avast.
Sorry. Maybe this is not your fault Bitdefender. Maybe the problem related to other games. Who knows.

Hope you find this post and it will save your time. Have a nice gaming!

Friday, May 24, 2013

Notification and confirm service using angular-ui bootstrap, phonegap and AngularJS

I've been playing with AngularJS lately when developing a new application using a Phonegap framework.

Phonegap is a framework which lets you create mobile apps for many platforms by just using HTML5 CSS and Javascript. These won't be as fast as native apps, but it makes developing faster.. I don't want to talk about Phonegap advantages and disadvantages here.

In my mobile applicatin I use alerts and confirmations windows many times.
Ripple - chrome extension that lets you emulate Phonegap someway doesn't provide confirmation windows (as far as I know) so I had to write my own fallback code for using native phonegap notifications on phone and html based notifications. For the second, I've used a great project angular-ui bootstrap which has a dialogs built in.

The code is a AngularJS service. I won't write here how AngularJS is great and awesome. Just look at the website and find yourself using this great framework. I think that Angular service is the right place to put this into work.

I should also mention  that I am using a great angular-phonegap-notification.

My intention was to make my service work similar to Phonegap notification API.


Wednesday, February 6, 2013

Restricting django to one user concurrent session only

Here's the tiny code that helps you avoid multiple users logged using the same account.
# -*- coding: utf-8 -*

from django.conf import settings
from django.core.cache import cache, get_cache
from django.utils.importlib import import_module


class UserRestrictMiddleware(object):
    def process_request(self, request):
        """
        Checks if different session exists for user and deletes it.
        """
        if request.user.is_authenticated():
            cache = get_cache('default')
            cache_timeout = 86400
            cache_key = "user_pk_%s_restrict" % request.user.pk
            cache_value = cache.get(cache_key)

            if cache_value is not None:
                if request.session.session_key != cache_value:
                    engine = import_module(settings.SESSION_ENGINE)
                    session = engine.SessionStore(session_key=cache_value)
                    session.delete()
                    cache.set(cache_key, request.session.session_key, 
                              cache_timeout)
            else:
                cache.set(cache_key, request.session.session_key, cache_timeout)

# vim: ai ts=4 sts=4 et sw=4
Hope you like it.
Remember, to put UserRestrictMiddleware somewhere after Session Middleware in MIDDLEWARE_CLASSES (settings.py)

Friday, September 21, 2012

Django cache templatetag with dynamic backend parameter

I've found a nice project django-adv-cache-tag.

From the project website:

With django-adv-cache-tag you can :
  • add a version number (int, string, date or whatever, it will be stringified) to you templatetag : the version will be compared to the cached one, and the exact same cache key will be used for the new cached template, avoiding keeping old unused keys in your cache, allowing you to cache forever.
  • avoid to be afraid of an incompatible update in our algorithm, because we also use an internal version number, updated only when the internal algorithm changes
  • define your own cache keys (or more simple, just add the primary key (or what you want, it's a templatetag parameter) to this cache key
  • compress the data to be cached, to reduce memory consumption in your cache backend, and network latency (but it will use more time and cpu to compress/decompress)
  • choose which cache backend will be used
  • define {% nocache %}...{% endnocache %} blocks, inside your cached template, that will only be rendered when asked (for these parts, the content of the template is cached, not the rendered result)
  • easily define your own algorithm, as we provide a single class you can inherit from, and simply change options or whatever behaviour you want, and define your own tags for them
I am using template fragments caching a lot, but some parts of website need invalidating depending on products type etc. 
I am invalidating cache on save & delete signals for model.

Here's the example:
Say there are 5 types of products and your website includes listing for them (which needs lots of data processing etc) and you want to cache it.


from django.db import models

PRODUCT_TYPE_CHOICES = (
('type1','type2'),
('type2','type2'),
('typen','typen'),
)

class Product(models.Model):
    attr1 = ...
    attrn = ...
    type =  models.CharField("Product Type", max_length=6, choices=PRODUCT_TYPE_CHOICES)
Using one backend, modifying product of type1 will purge the entire cache backend. Set up more backends:
# settings.py

CACHES= {
    'templates_products_type1': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        },
    'templates_products_type2': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11212',
        },
}
You can also use Redis for caching, which requires you to run one redis instance with multiple databases. Let's create our own {% my_cache %} templatetag with cache backend name as a first vary_on parameter. (this is the quickest way as you can also use get_pk() or even add your own parameters to {% my_cache %} templatetag. You could also use fragment name but it's not resolvable. Let's get to the code:
#my_cache_tags.py
from adv_cache_tag.tag import CacheTag
from django.core.cache import get_cache
from django import template

register = template.Library()

class MyCacheTag(CacheTag):
    def get_cache_object(self):
        backend = self.vary_on[0]
        return get_cache(backend)
MyCacheTag.register(register, 'my_cache')
Here's the template code:
# assuming products_type variables is assigned
{% load my_cache_tags %}

{% with backend="templates_products_"|add:products_type %}
{% my_cache 0 products backend other_vary_on_variables %}
{% for product in product_list %}
{{ product }}
{% endfor %}
{% endmy_cache %}
When saving or deleting products of some type, just purge template cache for produdcts only of this specified type.
from django.core.cache import get_cache
#function run on model save / delete

def clear_products_template_cache(type):
    cache_name = "templates_products_" + type
    cache = get_cache(cache_name)
    cache.clear()
NOTE: This is a SIMPLIFIED solution. I just wanted to point out that you can easily use different backends for one template cache tag. It's your job to make some additional processing code (especialy get_cache_object() for selecting cache backend etc.

Monday, September 17, 2012

Kantor Alior Banku i tajemniczy licznik

W taryfie prowizji i opłat bank wielokrotnie opiera się na wartości "licznika", do wartości którego można
przelewać walutę za darmo. Jeśli nie chcesz czytać całego wpisu, to proszę bardzo.

Możesz wymienić (w tym kantorze) nawet 10 tyś. franków szwajcarskich i nie zapłacisz prowizji za przelew.

Dalej moje boje z kantorami...
W związku z koniecznością wymiany waluty, przy złodziejskim spreadzie walutowym (a więc różnicy w cenie kupna i sprzedaży waluty) postanowiłem poszukać lepszego rozwiązania.

Jako pierwszy przetestowałem serwis inkantor.pl. Jest to jednak kantor, który nie podlega nadzorowi KNF.
Następnym kantorem internetowym był gocash.pl. Jestem z niego zadowolony, a kurs wymiany franka
był jeszcze korzystniejszy.

Obecnie kurs sprzedaży CHF:

3,3717 - gocash
3,3819 - inkantor
3,3666 - kantor alior


W obu przypadkach przelew walutowy zlecony do mbanku trafiał tego samego dnia, o ile zlecony został przed godziną 11ą. Było to nieco problematyczne, gdyż wymiany waluty chciałem dokonywać o godz: 14:50, z której to mbank pobiera kurs do wymiany złotówek na franki w dniu płatności raty za kredyt,
a ja nie chcę bawić się w spekulanta.

Dodam jeszcze, że w przypadku inkantor.pl pobierano ode mnie opłatę ~5 zł za przelew, zaś gocash.pl takiej opłaty nie pobierał.
Może później zrobię porównanie tych serwisów.

Obecnie czas przyszedł na kantor aliorbanku http://kantor.aliorbank.pl
Kursy walut są jeszcze korzystniejsze w moim przypadku. Nie jest to znaczna różnica, gdyż w przypadku gocash.pl te kursy również były bardzo korzystne.

Przelew waluty (nawet w trybie ekspresowym) jest darmowy, ale "do wartości licznika". Co owa wartość oznacza?
Jest to wartość, która powiększa się przy każdej wymianie waluty.
Pierwsza myśl, jaka przychodzi do głowy, to "ile wynosi górna wartość licznika", powyżej której naliczana jest opłata ?
W internecie krążą różne wartości, np. 600 CHF (dla franka szwajcarskiego). Autor tej tezy informuje więc,
że nie opłaca się wymieniać więcej niż 600 franków, gdyż przelanie ich będzie już kosztowne.

Ciekawy tego zagadnienia zacząłem szukać wartości granicznej licznika i niestety nie udało mi się jej znaleźć.
Pani na infolini potwierdziła, że nie ma takiej granicy.

Chodzi o to, by nie wpłacać franków w kasie i korzystać z darmowych przelewów za pośrednictwem tegoż kantoru. Można więc śmiało przelewać każdą wartość waluty, którą za pośrednictwem kantoru wymieniamy.
Pani na infolinii wspomniała też o innych typach zleceń, ale nie to jest tematem tego wpisu.
Najczęściej z kantoru korzystać będzie zwykły zjadacz chleba, który wymienia walutę do swojego kredytu hipotecznego oszczędzając dobre kilkadziesiąt złotych na racie.

Saturday, September 15, 2012

KNF razem z rządem i bankami w jednym tańcu

Nie jest to referat na temat działalności KNF. Są to tylko moje przemyślenia (być może czasami pozbawione sensu), które zmuszą kogoś mądrzejszego do napisania "mądrego referatu", który skłoni co niektórych do zastanowienia się nad polityką tej instytucji i jej roli w życiu Polaków.

 
Komisja Nadzoru Finansowego, powstała w 2006r. instytucja mająca chronić klientów instytucji podlegających pod ten nadzór (a więc np. banki, czy też instytucje ubezpieczeniowe, domy maklerskie itd.) Czy jest jednak tak, że instytucja ta chroni tych najsłabszych ? W moim przekonaniu tak nie jest. Większość wydawanych przez tą instytucję rekomendacji w rzeczywistości negatywnie odbija się na tych najbardziej skubanych przez owe banki - klientów z zaciągniętymi kredytami hipotecznymi. Nie tylko poprzez swoją politykę ogranicza ona dostępność kredytów, ale też zmierza ku wbiciu kolejnej szpili tym najsłabszym. Jak czytać można za niezalezna.pl
Komisja Nadzoru Finansowego zobowiązała banki do prześwietlenia nieruchomości zabezpieczających udzielone przez nie kredyty. Powstanie swoisty spis inwentaryzacyjny nieruchomości kredytowanych w Polsce. Powodem tej gigantycznej akcji są spadające wciąż ceny nieruchomości oraz coraz większa groźba niewypłacalności kredytobiorców.
Artykuł zacznę takim powyższym sformułowaniem i przejdę do grzechów KNFu, które wg. mnie popełnił (świadomie lub nie).

Zanim przejdę dalej pozwolę sobie opisać rynek mieszkaniowy w ostatnich latach. Mam kolegów, którzy w okolicach roku 2003r. zaciągnęli kredyt hipoteczny we franku szwajcarskim. Kilka lat później (a mieli czas do lipca 2008r.) spłacając lub też sprzedając swoją nieruchomość mogli nieźle zarobić.

Stało się tak ponieważ kurs franka w 2003r. oscylował w granicach 3 zł, zaś w lipcu 2008r. wartość jego spadła do 1,99 zł.
Dodatkowo zadziałał tutaj sprytnie wykorzystany przez deweloperów program "Rodzina na swoim", który sztucznie napompował - wspomaganą chęcią zakupu przez osoby urodzone w latach wyżu demograficznego, czyli ~8x - bańkę na rynku nieruchomości. Marże deweloperów kształtowały się nawet w okolicach 50%!

Dzisiaj mamy franka po około 3,5 zł, gdzie jeszcze niedawno wartość jego wynosiła 4 zł.
Mamy również dużą część "umoczonych", których wartość nieruchomości jest znacznie poniżej wartości kredytu ze względu na:
1. Wzrost wartości franka szwajcarskiego do polskiego złotego.
2. Spadek cen nieruchomości. Bańka musiała pęknąć i tak się też dzieje.

Efektem takiej sytuacji jest kolejny atak na bezbronnych klientów maszyny bankowej, ale o tym dalej.

Mamy rok 2008, gdzie kurs franka szwajcarskiego spada do wartości 1,99 zł.
Ciężko w telewizji usłyszeć o niebezpieczeństwie zawierania kredytów hipotecznych w tej walucie.
Nawet nasz "sprawny" KNF nie widzi przeszkód w udzielaniu takich kredytów. Przypomnę, że jest to instytucja działająca od 2006r.


Banki nie dość, że udzielały kredyty we franku na potęgę, to dodatkowo jeszcze namawiały obecnych zadłużonych w złotówkach do przewalutowania swoich kredytów na franka szwajcarskiego.
Demon kusił niższymi ratami, bo przecież frank jest nisko, a oprocentowanie też niskie.
Osobiście dostawałem sygnały o telefonach, gdzie namawiano do tak idiotycznego kroku.

Przypomnę jeszcze raz. KNF milczał.
Korzystając z okazji, udałem się do mojego banku celem przewalutowania kredytu z franka szwajcarskiego na złotówki. Moje doświadczenie techniczne w zakresie analizy technicznej pozwalało na wyciągnięcie takich wniosków. W banku stanęło nade mną 4 panów w białych koszulach, którzy mocno namawiali mnie do odstąpienia od tego kroku. Nie dałem się jednak przekonać i wymusiłem na nich umożliwienie mi
złożenia takiej dyspozycji.
W swojej bezsilności, otrzymałem kawałek czystej kartki A4, gdzie napisać miałem dyspozycję.

Odpowiedź na moją dyspozycję otrzymałem po 2,5 miesiącu, gdy kurs franka poszybował w górę.
Dodatkowo warunki nowej umowy były nieciekawe. Proszę uwierzyć, że do dzisiaj banki mają
totalną swobodę w ilości czasu, jaki potrzebują na rozpatrzenie wniosku o przewalutowanie.
Nie jest to określone w regulaminie (bynajmniej mojego banku), a sam UOKiK nie widzi w tym nic dziwnego.

Wiemy zatem już, że KNF nie widział w kredytach walutowych nic złego w 2008r. Wiem także,
że wydał później bankom rekomendacje, które znacznie ograniczają możliwość udzielania kredytów hipotecznych w walucie obcej. Kiedy tak mocno zmieniło się podejście KNFu do takich kredytów?

Stało się to w 2010r., gdy kurs franka szwajcarskiego oscylował w granicach 2,8-3 zł, a więc było 33% wyższy, niż w lipcu 2008r, gdy tak wciskano ludziom kredyty w tej walucie. Ktoś, kto brał kredyt w wysokości 300 tyś. zł, do spłaty ma dzisiaj do spłaty ponad 400 tyś. zł.

Jak wiadomo, dla klienta najlepszym rozwiązaniem jest zaciągać kredyt walutowy, gdy wartość waluty obcej jest wysoka. Zmniejsza to znacznie (choć nigdy nie eliminuje) ryzyko związane ze wzrostem wartości
tego kredytu dla zarabiających w złotówkach. W złotówkach bowiem albo kredyt jest spłacany, albo kupowana jest waluta celem spłaty raty.

Jest to szwindel jeszcze większy niż obecne Amber Gold. Mamy rok 2012 i kredytobiorcy stawiani są często w sytuacji krytycznej spowodowanej:
1. Wzrostem wartości kredytu - spowodowane wzrostem wartości franka szwajcarskiego CHFPLN (i nie tylko, ale jako mój przypadek z tą walutą piszę artykuł wzorując się na franku).
2. Spadkiem cen nieruchomości wywołanym pęknięciem sztucznie napompowanej bańki, na której zyskali głównie deweloperzy dzięki wyżowi demograficznemu oraz programowi "Rodzina na Swoim".

Oba powyższe punkty sprawiły, że banki czują się mniej zabezpieczone i żądają nowych zabezpieczeń kredytu. Tutaj wystosuję kilka pytań:
1. Czy istnieje jeszcze pojęcie "ryzyko kredytowe". Jeśli tak, proszę o odpowiedź, na czym ono polega.
Obecne czasy pokazują, że nawet spekulacyjne banki mogą liczyć w ostateczności na podatników, gdyż są "za duże, żeby upaść" (ale o tym innym razem).
2. Czy banki przy udzielaniu kredytu nie zawarły z klientem umowy,  w której to obie strony świadome są podejmowanego ryzyka?
3. Czy żaden pan w białej koszuli (zwany analitykiem) w 2008r. nie przewidywał tego, co stanie się po 2010r. z rynkiem nieruchomości?

Jestem pewien, że doskonale wiedziały. Na polu walki pozostał osamotniony Kowalski, od którego żądać się będzie wykupienia dodatkowego ubezpieczenia kredytu. Mało jeszcze bankom zysków, które z roku na rok rosną. Trzeba wyciągać z Kowalskiego ile wlezie.

W przypadku odmowy wykupienia takiego dodatkowego - często bardzo kosztownego - ubezpieczenia jest wypowiedzenie kredytu przez bank. Stawia do klienta w sytuacji, w której musi od razu spłacić cały kredyt.
Jeśli to nie poczyni, następuje egzekucja z majątku i jego sprzedaż. Chodzi oczywiście o mieszkanie.
Różnica między kwotą pozyskaną ze sprzedaży mieszkania i wartości kredytu dalej ciąży na kliencie.
Pomijam tutaj niemałe koszty całego postępowania, które również obciążą klienta.

Do realizacji tego diabolicznego planu brakuje jednak jeszcze jednej rzeczy, ale o tym dalej.

Gdzie zatem jest KNF?

KNF nie próżnuje i leci z odsieczą. Komu?  Z pewnością nie Kowalskiemu.
Jak wyczytać możemy, instytucja ta zamierza "wymusić" na bankach, by stworzyły szczegółową bazę nieruchomości oraz jej wartości - włączając w to aspekty, czy też wydarzenia mające wpływ na wartość danej nieruchomości.

KNF tłumaczy to potrzebą monitorowania rynku kredytów. Ja jednak widzę inne dno (a nawet dwa) tego ruchu.

1. Bankom niełatwo jest egzekwować wykup dodatkowego ubezpieczenia. Wymaga do często kosztownego wykonania wyceny nieruchomości w sytuacji, gdy klient od razu nie ulega żądaniu banku.
Bank sam sobie ustala taką wartość. Klient, który nie z nią się nie zgadza, musi dokonać wycenę (a więc za nią zapłacić). Nie zawsze to jednak bankowi wystarcza, ale to inna kwestia. Na odsiecz idzie KNF, który zapewne za jakiś czas ustali wartości z tej przecudownej bazy za "wiążące" i znacznie ułatwi to egzekwowanie od biednych owieczek wykupu ubezpieczeń.

2. Od długiego czasu mówi się o podatku katastralnym. Byłby to niezły zastrzyk gotówki dla zrujnowanego na własną prośbę budżetu. Na drodze stoi jednak niemożność nałożenia takiego podatku, gdyż niełatwe jest
dokonanie wyceny nieruchomości, na podstawie to której naliczony ma być kataster.
Słyszy się pomysłach naliczania podatku w zależności od odległości od centrum miasta itd., ale raczej szybko zdają sobie rządzący sprawę, jak idiotyczne są to pomysły. Z resztą niebawem uzyskają pomoc powstałej w 2006r. instytucji.

Czy ważna jest afera Amber Gold w cieniu tej sprawy?. Bohater jednej z reklam rzekłby "pikuś", przy całej tej aferze związanej z rynkiem nieruchomości oraz udzielonymi kredytami i związanymi z tym działaniami instytucji finansowych, a także publicznych.

Mam nadzieję, że z czasem zacznie się o tym mówić coraz głośniej i zawita to na żółtych paskach w telewizji
informacyjnych.

Póki co życzę Wszystkim niskiego kursu waluty obcej, szczególnie franka szwajcarskiego.
Od gilotyny uratował wszystkich umoczonych szwajcarski bank centralny, "usztywniając" kurs franka do euro na poziomie 1.2. Gdyby nie ten ruch, zapewne zobaczylibyście niedawno "5kę" przy kursie tej waluty do polskiego złotego.

Wiem, że życzenie to nie spodoba się to coraz liczniejszej rzeszy polskich imigrantów, ale nie oszukujmy się - i tak nie macie zamiaru wrócić do kraju :-) więc tak mocno nie stracicie, bo nie będzie potrzeby przewalutowania swoich franków, funtów, koron norweskich na złote.

Eksporterzy jakoś sobie poradzą :) CHF w końcu to nie EUR :)

Umoczeni sprzedadzą nieruchomość, spłacą kredyt, albo po prostu go przewalutują i przestaną być narażonymi na skubanie przez banki spekulantami.

Tuesday, June 19, 2012

Django verbose_name in your template

There are many situations when you want to display model field verbose_name in template when displaying tables and other data. Ideally you would put this value in header section of your table for DRY purposes.
The problem is that it's unable to use model _meta in templates. You can achive the same using an example verbose_name_tags.py templatetag.
# verbose_name_tags.py

from django import template

register = template.Library()

def get_field_verbose_name(instance, arg):
    return instance._meta.get_field(arg).verbose_name
register.filter('field_verbose_name', get_field_verbose_name)

def get_queryset_field_verbose_name(queryset, arg):
    return queryset.model._meta.get_field(arg).verbose_name
register.filter('queryset_field_verbose_name', get_queryset_field_verbose_name)

you can get your header names rendered the DRY way.
Assuming your model looks like this:
class Product(models.Model):
    name = models.CharField(_(u"Name"), max_length=20)
    weight = models.PositiveIntegerField(_(u"Weight"))

Your template would be similar to the one below:
{% load verbose_name_tags %}

<table>
  <thead>
  <tr>    
    <th>{{ object_list|queryset_field_verbose_name:"name" }}</th>
    <th>{{ object_list|queryset_field_verbose_name:"weight" }}</th>
  </tr>
  </thead>
  <tbody>
{% for product in object_list %}    
  <tr>
    <td>{{ product.name }}</td>
    <td>{{ product.weight }}</td>
  </tr>
{% endfor %}
</table>

What if you need sorting ?
For some time I've been using a django-sorting for sorting my tabular data.
The new code
{% load sorting_tags %}
{% autosort object_list %}

<table>
  <thead>
  <tr>    
    {# _("Name").. need to specify the display name all the time.. bad.. #}
    <th>{% autosort 'name' _("Name") %}</th>
    <th>{% autosort 'weight' _("Weight") %}</th>
  </th></tr>
  </thead>
  <tbody>
{% for product in object_list %}  
  <tr>
    <td>{{ product.name }}</td>
    <td>{{ product.weight }}</td>
  </tr>
{% endfor %}
  </tbody>
</table>

Great, but this is not DRY! You can do this the other way. Note: I think {% autosort %} should take verbose_name by default (maybe will take a look into the code later, but for now we can achieve the same using a {% with %} and verbose_name_tags.py template tags.
{% load sorting_tags %}
{% load verbose_name_tags %}

{% autosort object_list %}

{% endfor %}
<table>
  <thead>
  <tr>
    {% with name=object_list|queryset_field_verbose_name:"name" %}    
    <th>{% autosort 'name' name%}</th>
    {% endwith %}
    {% with weight=object_list|queryset_field_verbose_name:"weight" %}
    <th>{% autosort 'weight' weight %}</th>
    {% endwith %}
  </tr>
  </thead>
  <tbody>
  <tr>
    <td>{{ product.name }}</td>
    <td>{{ product.weight }}</td>
  </tr>
  </tbody>
</table>

Now we can just change verbose_name in models.py and we don't have to worry about the table headers.
You can also use a "field_verbose_name" for model instances:
{# assuming {{ product }} is an instance of Product model #}
{% load verbose_name_tags %}

{{ product|field_verbose_name:"name" }}: {{ product.name }}

Some might wonder why didn't I simply use one templatetag name which would identify if it checks for queryset or instance field. I decided to use different names to quickly see If I act with querysets or instances. Hope you like it.