Es mostren els missatges amb l'etiqueta de comentaris informàtica. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris informàtica. Mostrar tots els missatges

dijous, 14 de novembre del 2013

Com fer el deploy d'app django actualitzat a dinahosting


Dinahosting suporta aplicacions django, per defecte django1.4 i python2.6.5 (nov 2013). 

Nosaltres actualitzarem el django a la darrera versió usant un virtualenv.

Cal que la teva imatge de hosting sigui python / node.js, si no ho és, has d'anar a la eina storm i canviar-ho ( Hosting / Administrar / STORM ). T'ha de quedar així:




Ara cal entrar per ssh:

1) Crear usuari ftp i posar-li password.
2) ssh -p 22 nomUsuariFtp@www.dominiQueSigui.cat

Pots posar l'aplicació allà on vulguis, jo l'he posat sota de www, de manera que m'ha quedat un arbre com aquest:

home
   gratia 
      django16p27
      .htaccess  (1)
      www
         .htaccess   (2)
         ping2u.wsgi
         ping2u
             manage.py
             ping2u
                 settings.py           

  • django16p27 és un virtualenv amb el django 1.6 instal·lat, mira al final del manual si no saps com crear-lo.
  • gratia és el meu usuari
  • ping2u és la aplicació que vols fer rodar (mira el final del document si no saps crear-la)
  • El primer .htaccess l'he deixat tal com ve.
  • El segon .htaccess és el que cal adaptar, ha de quedar com aquest:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /ping2u.wsgi/$1  [QSA,L]

  • El fitxer 'ping2u.wsgi' t'ha de quedar com aquest:

import os, sys
import site

# Remember original sys.path.
prev_sys_path = list(sys.path)

site.addsitedir('/home/gratia/django16py27/lib/python2.6/site-packages/')
sys.path.append('/home/gratia/www/ping2u')

# Posar els paths de l'entorn virtual davant dels per defecte.
new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_path 

os.environ['DJANGO_SETTINGS_MODULE'] = 'ping2u.settings'
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

  • Creació del virtualenv:

cd ~
virtualenv django16p27
source ~/django16p27/bin/activate
pip install django

  • Per crear l'aplicació de test ping2u:

cd www
django-admin.py startproject ping2u

A l'aplicació he provocat un error (divisió per 0) per veure si està rodant realment amb 1.6:



L'.htaccess (1) és aquest:

##
## DHGENERATED
## NO EDITAR MANUALMENTE!!!!
##
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On
Options +ExecCGI
AddHandler wsgi-script .wsgi

RewriteEngine On

##REGLAS_NODE##

##FIN_REGLAS_NODE##



I això és tot. Agraïr a la gent de suport de dinahosting, en especial a A.A. l'ajuda que m'han prestat per poder posar en marxa l'aplicació, els fitxers .htaccess són seus. Una llàstima la versió de python, tant de bo la canviin aviat.

Després de tot plegat, aquí la meva aplicació (que encara no sé per a que em serveix) funcionant.

Disclaimer: aquesta guia no és oficial de dinahosting, utilitza-la al teu risc.

dilluns, 31 de desembre del 2012

Exercicis de Primària amb Python V

Aquest és un exercici de Grafs extret del llibre Nou i Mig 8 de l'editorial Teide:


Plantejament


  • Identifiquem cada vertex amb una lletra.
  • Construim un diccionari python amb una 'cassella' per a cada vertex.
  • Fem una 'llista' (és una tupla en realitat) amb els parells de nodes adjacents.
  • Provem totes les permutacions de digits tot imprimint les que compleixen amb els requeriments de l'enunciat.

El codi del programa


from itertools import permutations, combinations_with_replacement

vertex = {}
for identificador in ( 'A','B','C','D','E','F' ):
    vertex[identificador] = None

adjacents = (
  ( 'A', 'B' ),  ( 'A', 'D' ),  ( 'A', 'E' ),  ( 'A', 'F' ),
  ( 'B', 'A' ),  ( 'B', 'D' ),  ( 'B', 'C' ),
  ( 'C', 'B' ),  ( 'C', 'D' ),  ( 'C', 'F' ),
  ( 'D', 'A' ),  ( 'D', 'B' ),  ( 'D', 'C' ),  ('D', 'E'),
  ( 'E', 'A' ),  ( 'E', 'D' ),  ( 'E', 'F' ),
  ( 'F', 'A' ),  ( 'F', 'C' ),  ( 'F', 'E' ),
)

digits = ( 5,6,7,8,9,10 )

for (vertex['A'], vertex['B'], vertex['C'], 
     vertex['D'], vertex['E'], vertex['F'], ) in permutations ( digits ):
    if all( vertex[ v1 ] - vertex[v2] != 1 for ( v1, v2) in adjacents ):
        print ( 'A:', vertex['A'], 'B:', vertex['B'], 'C:', vertex['C'], 
                'D:', vertex['D'], 'E:', vertex['E'], 'F:', vertex['F'] ) 


El resultat


dani@egg-v3:~/tmp/llu$ python vertexs.py 
('A:', 5, 'B:', 8, 'C:', 6, 'D:', 10, 'E:', 7, 'F:', 9)
('A:', 10, 'B:', 7, 'C:', 9, 'D:', 5, 'E:', 8, 'F:', 6)

Altres Exercicis

http://beutil.blogspot.com.es/search/label/python_i_exercicis_mates



diumenge, 30 de desembre del 2012

Exercicis de Primària amb Python IV

Enunciat

Aquest exercici no té enunciat. Nomès apareix aquesta imatge:



Entenc que és un exercici tipus 'xifres i lletres' i cal obtenir el resultat indicat amb una combinació d'operacions amb tots els dígits disponibles.

Recordo que aquests exercicis són de Nou i mig 8 és un llibre de l'editorial Teide.

Resolució:


  • Creo les operacions com diccionaris per tal de tenir el nom i la operació.
  • Faig una tupla amb les operacions que intervenen.
  • Faig una llista amb els dígits disponibles.
  • Poso en una variable el resultat desitjat.
  • Per últim, busco totes les possibles combinacions d'operacions preses de 4 en 4. Per a cada combinació busco totes les seves permutacions i les combino amb totes les permutacions dels dígits disponibles.
  • El resultat el comparo amb el resultat desitjat


El programa:



from itertools import permutations, combinations_with_replacement

operacions = {}
operacions['+'] =  lambda x,y: x+y
operacions['-'] =  lambda x,y: x-y
operacions['*'] =  lambda x,y: x*y
operacions['/'] =  lambda x,y: x/y

numeros = ( 22, 2, 10, 6, 11 )

resultat_desitjat = 201

for (A, B, C, D, E ) in permutations ( numeros ):
    for combinacio_operacio in combinations_with_replacement( operacions, 4 ):
        for ( op1, op2, op3, op4 ) in permutations( combinacio_operacio ):
                r1 = operacions[op1]( float( A ),  float( B ) )
                r2 = operacions[op2]( float( r1 ), float( C ) )
                r3 = operacions[op3]( float( r2 ), float( D ) )
                r4 = operacions[op4]( float( r3 ), float( E ) )
                if r4 == resultat_desitjat and r1 > 0 and r2 > 0 and r3 > 0 and r4 > 0:
                    print A, op1, B, op2, C, op3, D, op4, E



Els resultats:


dani@egg-v3:~/tmp/llu$ python batedora.py  | more
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11




Altres Exercicis





dissabte, 29 de desembre del 2012

Exercicis de Primària amb Python III

Enunciat: 


  • Quant sumen els punts de les 28 fitxes del dòmino?

Plantejament:


  • Anomenarè família a totes les fitxes que tenen en comú una mateixa puntuació. Per exemple, la família del 0 (blanc) serà: 0:0, 0:1, 0:2, ... 0:6
  • Hem de tenir en compte que la fixa 1:0 i la fitxa 0:1 és la mateixa. Per tant, si a la família del 0 hem inclòs el 0:1, a la família de l'1 no podem incloure el 1:0. 
  • Per a solucionar el punt anterior, cada família es combinarà amb els punts començant pel seu doble:


0:0 0:1 0:2 0:3 0:4 ... 0:6
    1:1 1:2 1:3 1:4 ... 1:6
        2:2 2:3 2:4 ... 2:6
                    ...
                        6:6


  • Per últim, fem servir un acumulador per tal de saber quant punts portem.

Solució:

acumulador = 0
for familia in range(0,7):
    for n in range(familia,7):  #No comencem des de 0
                                #comencem des del doble X:X
        print familia,n
        acumulador += familia+n
print 'Total:', acumulador

Resultat:

$ python domino.py 
0 0
0 1
...
4 6
5 5
5 6
6 6

dimarts, 18 de desembre del 2012

Exercicis de primària amb Python II

A la mateixa pàgina que l'exercici anterior trobem aquest exercici altre exercici ('Nou i mig 8', editorial teide):




Com es pot veure no necessita enunciat.

Per resoldre'l utilitzem diferents recursos del llenguatge, destaco els diccionaris, els bucles niuats i les expressions lambda:


from itertools import combinations

suma = { 'operacio': lambda x,y: x+y, 'nom':'suma' }
resta = { 'operacio': lambda x,y: x-y, 'nom':'resta' }

operacions = ( suma, resta )
for op1 in operacions:
    for op2 in operacions:
        for op3 in operacions:
            for op4 in operacions:
                r1 = op1['operacio']( 10, 9)
                r2 = op2['operacio']( r1, 15)
                r3 = op3['operacio']( r2, 7 )
                r4 = op4['operacio']( r3, 4 )
                if r4 == 19:
                    print op1['nom'], op2['nom'], op3['nom'], op4['nom']


Resultat:

resta suma suma resta

Cal dir que les itertools ens permeten substituir els bucles niuats per un sol bucle:

http://stackoverflow.com/questions/1280667/in-python-is-there-an-easier-way-to-write-6-nested-for-loops




Altres Exercicis



diumenge, 16 de desembre del 2012

Python i els exercicis de Mates

Python és un llenguatge de programació d'alt nivell. El codi escrit amb Python és de fàcil lectura, això forma part de la filosofia del llenguatge. És per això que recomano aquest llenguatge a qui vulgui iniciar-se al món de la programació d'una manera autodidàcta.

Nou i mig 8 és un llibre de l'editorial Teide. Els problemes d'aquest llibre són molt gràfics i divertits.

Resoldre els problemes del Nou i mig amb Python és encara més divertit.

Aquest problema apareix a la pàgina 11 del llibre. Ens donen una figura en forma d'estrella, cada línia de la figura conté tres caselles, una al mig i una a cada extrem. Cal repartir els dígits de l'1 al 9 dins d'aquestes caselles de manera que els dígits de totes les línies sumin el mateix.

És a dir que A + B + C ha de sumar el mateix que C + D + E i així per totes les línies.

Per solucionar aquest problema amb python utilitzo la llibreria itertools, allà hi ha una funció que ella sola em fabricarà totes les possibles permutacions dels digits de l'1 al 9.

Provarem cada permutació per comprovar si cumpleix els requeriments de l'enunciat.

L'operador per a comparar és == per això apareix aquest operador dins la sentència 'if'.


from itertools import permutations

digits = ( 1, 2, 3, 4, 5, 6, 7, 8, 9)

for (A, B, C, D, E, F, G, H, I ) in permutations( digits ):
    if ( A + B + C == 
         C + D + E ==
         E + F + G ==
         G + B + H ==
         H + D + I ):
        print 'Solucio: ', A, B, C, D, E, F, G, H, I

El resultat:


Solucio:  1 5 9 2 4 8 3 7 6
Solucio:  1 5 9 4 2 6 7 3 8
Solucio:  1 6 8 3 4 9 2 7 5
Solucio:  1 6 8 4 ...



Altres Exercicis





dissabte, 7 de juliol del 2012

La web de Bankinter dia 7 de juliol a les 16:30:



Answer:  The oerr utility says this about the ORA-00257 error:
ORA-00257: archiver error. Connect internal only, until freed.

Cause: The archiver process received an error while trying to archive a redo log. If the problem is not resolved soon, the database will stop executing transactions. The most likely cause of this message is the destination device is out of space to store the redo log file.

divendres, 8 de juny del 2012

Càrrega i anàlisi datamart de la despesa

Captures de pantalla projecte datamart econòmic de comptabilitat pressupostària

Càrrega amb SSIS

Anàlisi amb Tableau


diumenge, 15 d’abril del 2012

Pujar aplicació MVC 3 a Dinahosting

Conservo un compte a dinahosting degut al concurs webs al punt. Avui he pujat una BDD i una Aplicació Web (MVC 3). El procediment no és complicat:

  • La base de dades es crea des del taulell de control de dinahosting, dresprés t'hi pots connectar a ella des de l'SQLServer Management Studio. Cap problema. El nom de servidor me'l van dir des de dinahosting pel chat de suport.
  • Per pujar l'aplicació primer has de declarar una aplicació ASP.NET (des del taulell de control), després puges l'aplicació des del propi assistent de visual studio via FTP (cal haver fet un compte FTP).

Aquí està l'aplicació  http://www.joincar.cat/a/search/go :


De pas publico la caxonda consulta LINQ per obtenir les dades i el model de dades:






dijous, 5 d’abril del 2012

LightSwitch Custom Control: Tree lookup Operations

Here the second part of treeview custom control. This include lookup operations:


See also:

LightSwitch Custom Control: Tree CRUD Operations

For a recent project I have developed a treeview lightswitch custom control to edit a tree structure.
Here I share the code to do CRUD+CutAndPaste operations over a generic tree. I have also documented this tree sample project.




I will post a second part of project with tree lookups operations.

Don't forget to write a comment if this code us useful for you.

( Thanks to Karol Zadora )

diumenge, 18 de setembre del 2011

Lightswitch TreeView Custom Control

Deprecated: GO TO  http://beutil.blogspot.com.es/2012/04/lightswitch-custom-control-tree-loojup.html
------------------------------------------

I have wrote 2 kinds of trees; lookup tree and screen tree.

First one is intended to replace combo lookup and the second to manage a large data tree.

You can download source code.

Thanks to Karol Zadora

Screen shots:

Lookup tree:




Screen Tree



divendres, 22 de juliol del 2011

Gran concurs: Troba les 8 diferències

Participa en aquest concurs i podràs obtenir la glòria eterna.
Com veus no hi ha cap pregunta ni hi ha bases del concurs. Pots respondre el que vulguis.

Figura 1


Figura 2

Silverlight 4: "The remote server returned an error: NotFound."

Quan hi ha un problema de comunicació de les WCF, el client ens informa amb aquest error:

"The remote server returned an error: NotFound."

Es tracta d'un error genèric, no és que haguem escrit malament el nom del servei al que ens volem connectar ni res d'això.

Per trobar l'error real cal posar configurar el tracing, això es fa tocant el 'web.config'.


Al meu cas m'he trobat amb aquest error:


"The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'."


El cas és que passava sense contemplacions del servidor al client tota la taula de la base de dades, que sembla ser grossa. Per passar-la cal serialitzar-la abans i això provocava l'error.


Com que el que jo estic carregant en realitat és un arbre el que he fet ha estat tocar el domain service i crear dos serveis nous - Jo això ho volia evitar perquè a cada moment estic posant noves taules dins l'EF i per tant haig de regenerar els fitxers (cosa que fins ara feia borrant-los i creant-los de nou i ara ja no serà tant directe). El primer dels dos serveis que he creat és per carregar els nodes arrel:


    Public Function GetVEconomia_unitatsDArrel() As IQueryable(Of VEconomia_unitatsD)
        Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
        Where (x.IdPare = 0)
        Select x
        Return r
    End Function


I el segon per carregar els fills d'un node:

    Public Function GetVEconomia_unitatsDChild(ByVal id As Integer) As IQueryable(Of VEconomia_unitatsD)
        Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
        Where (x.IdPare = id)
         Select x
        Return r
    End Function

És important recordar que si volem passar els objectes de negoci associats a un objecte de negoci hem de decorar el metadata amb l'anotació include:


        <Include()>
        Public Property unitatChildren As EntityCollection(Of VEconomia_unitatsD)

Després d'això l'únic que he hagut de fer és carregar les dades de manera recursiva. Primer he carregat els nodes arrel i a partir d'allà la resta de l'arbre:


Partial Public Class vwParUnitats2CentresDeCost
    Inherits Page


    Dim CActx As New CADomainContext()
    Dim unitatsTree As New List(Of VEconomia_unitatsD)
    Dim loadOperationUnitats As LoadOperation(Of VEconomia_unitatsD)


    Public Sub New()
        InitializeComponent()
        Dim q3 = CActx.GetVEconomia_unitatsDArrelQuery()
        loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q3)
        AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
    End Sub

    Private Sub loadOperationUnitats_Completed(ByVal sender As Object, ByVal e As EventArgs)
        Dim llista = directcast(sender, loadoperation(of VEconomia_unitatsD) ).Entities.ToList
        If llista.Any AndAlso llista.First.IdPare = 0 Then
            unitatsTree = llista
            TreeViewUnitats.DataContext = unitatsTree
        End If
        For Each item In llista
            For Each fill In item.unitatChildren
                Dim q2 = CActx.GetVEconomia_unitatsDChildQuery(fill.IdUnitat)


                loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q2)
                AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
            Next
        Next
    End Sub


I aquest és el nostre bricoconsejo per avui. No us deixeu la rebobinada.






Una darrera reflexió: algú podria pensar que fora més interessant anar carregant els nodes amb lazy load a mesura que els expandim. Segurament té raó, però no per aquest cas, perquè necessito tot l'arbre carregat perquè la lògica de negoci em fa que hagi de mostrar la situació de diferents nodes de l'arbre a mesura que em pregunten per diferents objectes de negoci. Ah! Per fer el IsSelected hauré de fer servir la funció ContainerFromItem.


També pots augmentar la mida del maxItemsInObjectGraph:

http://social.msdn.microsoft.com/Forums/en-NZ/wcf/thread/f408be56-6983-4c1c-8275-aae9c73ab2d6







dimecres, 20 de juliol del 2011

Llenguatge Informàtic

Fa uns mesos un col·lega em feia la següent consulta:

"magradaria veure les pelis que tinc al portàtil per la tele, ho puc fer?".

Li vaig dir que sí, però que m'ensenyés el portàtil i em descrigués la tv primer. Vaig veure que pel seu cas la solució més senzilla era amb un cable d-sub 15 com a la imatge:


Jo mateix li vaig aconseguir el cable d'un monitor vell.

A l'endemà em vaig trobar el col·lega, de seguida li vaig detectar la mirada de 'alguna cosa no va anar bé'. Així que vaig tenir temps de pensar que podia haver fallat i preparar la resposta.

Efectivament el col·lega em diu: "El cable que em vas passar va perfecte, ja puc veure la peli per la tele, però no se sent res. Saps que pot ser?"

La resposta va ser ràpida:

"Bé, si recordes, em vas dir que volies veure pelis, no que les volguessis escoltar."

Naturalment després li vaig dir que necessitava el segon cable:


De vegades els informàtics apliquem la solució directa al problema que ens proposa l'usuari sense qüestionar-nos quin és realment el problema que hem de solucionar.

"ContainerFromItem returns null" (or Nothing)

"ContainerFromItem returns null" (or Nothing) v.s. "Puedo quedarme embarazada con la regla":

Molts amics quan em troben pel carrer m'aturen i em dieun:

Quan treballo amb un treeView (o un listView) de silverlight i vull obtenir el container d'un node m'apareix l'error: "ContainerFromItem returns null"

Potser penseu que estic fent broma, però fixeu-vos que realment és un error molt habitual:


60Mil resultats que podem comparar-los amb altres cerques:



Anem a solucionar-ho, jo només m'hi he passat 3 hores per trobar quin és el motiu.
I no és un motiu, són dos:

1) En primer lloc, quan des d'un objecte X invoquem el mètode ContainerFromItem només busca els Items fills de l'objecte X.

Solució: Doncs cal invocar ContainerFromItem a l'objecte contenidor pare de l'objecte de negoci del qual volem el contenidor (ContenidorPare.ItemContainerGenerator) . Però, com obting el contenidor del pare? Doncs invocant el mètode ContainerFromItem al seu contenidor pare .... i així fins al node arrel on coneixem el contenidor pare que és conegut: TreeViewX.ItemContainerGenerator. LLavors cal usar recursió:

Public Function ContainerFromItem(ByVal item As objecteDeNegoci) As TreeViewItem
        Dim containerThatMightContainItem As TreeViewItem
        If IsNothing( item.parent ) Then
            containerThatMightContainItem = DirectCast(TreeViewX.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
        Else
            Dim containerItemPare = ContainerFromItem(item.parent)
            containerThatMightContainItem = DirectCast(containerItemPare.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
        End If
        Return containerThatMightContainItem
    End Function
2) Tot i que ja sabem baixar pels contenidors fins al nostre objecte de negoci, pot ser que encara el seu contenidor sigui Null, a que és degut? Doncs a que FINS QUE NO ES PINTA UN NODE NO SE LI CREA CONTENIDOR. Aleshores cal que estiguis segur que el node s'ha pintat:

Solució:
Primer: Expandir el pare:

Dim ccP = ContainerFromItem(objecteDeNegoci.parent)
ccP.IsExpanded = True
ccP.Visibility = Windows.Visibility.Visible

Segon: Forçar que es repinti. (Hi ha solucions alternatives amb events i tal)
ccP.UpdateLayout()

Ara ja estem en condicions de demanar el contenidor del fill:

Dim ccO = ContainerFromItem(objecteDeNegoci)
ccO.IsSelected = True

Si teniu dubtes de que als nodes pares no tinguin contenidor llavors heu de modificar el nostre mètode ContainerFromItem per tal que vagi expandir i fent UpdateLayout dels nodes intermitjos:


Public Function ContainerFromItem(ByVal item As objecteDeNegoci) As TreeViewItem
        Dim containerThatMightContainItem As TreeViewItem
        If IsNothing( item.parent ) Then
            containerThatMightContainItem = DirectCast(TreeViewX.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
containerThatMightContainItem.IsExpanded = True
containerThatMightContainItem.UpdateLayout() Else Dim containerItemPare = ContainerFromItem(item.parent) containerThatMightContainItem = DirectCast(containerItemPare.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem) End If Return containerThatMightContainItem End Function


Bé, espero que ja no us trobeu més amb aquest problema (ni amb l'altre). Si és així, please, deixa un comentari.

dimecres, 14 de juliol del 2010

T-SQL Càlcul del dígit de control. Comptes CCC i comptes IBAN.

He hagut de fer "comprovacions" massives dels dígits de control dels comptes bancaris. He fet la programació al servidor per accelerar el procés.

Aquí us deixo el codi que genera dígits de control tant per comptes IBAN com per comptes CCC.

Recordeu que els DC sempre els ha de proporcionar el banc. No s'hi val a calcular-los.

Create function IBANAllGenerateDC (@IBANxx00 CHAR(34) )
returns CHAR(2)
as
begin
declare @RetVal CHAR(2)
DECLARE @Pais CHAR(4)
DECLARE @s AS VARCHAR(200)
DECLARE @iModValue AS INT
DECLARE @iDigit AS INT
DECLARE @i AS INT

SET @s = @IBANxx00

SET @s = Replace(@s, 'A', 10)
SET @s = Replace(@s, 'B', 11)
SET @s = Replace(@s, 'C', 12)
SET @s = Replace(@s, 'D', 13)
SET @s = Replace(@s, 'E', 14)
SET @s = Replace(@s, 'F', 15)
SET @s = Replace(@s, 'G', 16)
SET @s = Replace(@s, 'H', 17)
SET @s = Replace(@s, 'I', 18)
SET @s = Replace(@s, 'J', 19)
SET @s = Replace(@s, 'K', 20)
SET @s = Replace(@s, 'L', 21)
SET @s = Replace(@s, 'M', 22)
SET @s = Replace(@s, 'N', 23)
SET @s = Replace(@s, 'O', 24)
SET @s = Replace(@s, 'P', 25)
SET @s = Replace(@s, 'Q', 26)
SET @s = Replace(@s, 'R', 27)
SET @s = Replace(@s, 'S', 28)
SET @s = Replace(@s, 'T', 29)
SET @s = Replace(@s, 'U', 30)
SET @s = Replace(@s, 'V', 31)
SET @s = Replace(@s, 'W', 32)
SET @s = Replace(@s, 'X', 33)
SET @s = Replace(@s, 'Y', 34)
SET @s = Replace(@s, 'Z', 35)

SET @s = RTRIM(SUBSTRING(@s,7,34)) + LEFT(@s,4) + '00'

IF ( ISNUMERIC(@s) = 1 )
begin
SET @iModValue = 0
SET @i = 1
WHILE ( @i <= Len(@s) ) begin SET @iDigit = CAST( substring(@s, @i, 1) AS INT ) SET @iModValue = ((@iModValue * 10) + @iDigit) % 97 SET @i = @i + 1 end SET @iModValue = 98 - @iModValue IF (@iModValue > 9)
set @Retval = CAST ( @iModValue AS CHAR(2) )
ELSE
set @Retval = '0' + CAST ( @iModValue AS CHAR(1) )
end
ELSE
set @Retval = '99'

return @Retval
end

GO

Create function [dbo].[CCCgenerateDC] (@Entitat AS CHAR(4), @Agencia AS CHAR(4), @Compte AS CHAR(10) )
returns CHAR(2)
as
BEGIN
--from: http://www.bulma.net/body.phtml?nIdNoticia=1396
declare
@RetVal CHAR(2),
@aPesos AS CHAR(10),
@iDC1 AS INT,
@iDC2 AS INT,
@iX AS INT,
@iDigit AS INT,
@iResto AS INT,
@sEntOfi AS CHAR(8)

SET @aPesos = '0137498625' --cal sumar-hi 1
SET @sEntOfi = @Entitat + @Agencia

SET @iDC1 = 0
SET @iX = 8
WHILE (@iX > 0)
begin
SET @iDigit = SUBSTRING(@sEntOfi,@iX,1)
SET @iDC1 = @iDC1 + ( CAST( substring(@aPesos, @iX+2, 1) AS INT ) + 1 ) * @iDigit
SET @iX = @iX -1
END
SET @iResto = @iDC1 % 11
SET @iDC1 = 11 - @iResto
IF (@iDC1 = 10) SET @iDC1 = 1
IF (@iDC1 = 11) SET @iDC1 = 0

SET @iDC2 = 0
SET @iX = 10
WHILE (@iX > 0)
begin
SET @iDigit = SUBSTRING(@Compte,@iX,1)
SET @iDC2 = @iDC2 + ( CAST( substring(@aPesos, @iX, 1) AS INT ) + 1 ) * @iDigit
SET @iX = @iX -1
END
SET @iResto = @iDC2 % 11
SET @iDC2 = 11 - @iResto
IF (@iDC2 = 10) SET @iDC2 = 1;
IF (@iDC2 = 11) SET @iDC2 = 0;

SET @retval = CAST ( @iDC1 AS CHAR(1) ) + CAST ( @iDC2 AS CHAR(1) )

return @Retval
end

cat: T-SQL Càlcul del dígit de control. Comptes CCC i comptes IBAN.
esp: T-SQL Cálculo del dígito de control. Cuentas CCC i IBAN.

El codi es proporciona 'as is'. No hi ha garantia i l'executaràs sobre la teva responsabilitat.
Sigues lliure d'utilitzar aquest codi. Llicència GPL2.
Part del codi està traduit des d'altres llenguatges de programació. La font està resenyada al codi.

diumenge, 18 d’octubre del 2009

mvk2avi amb mencoder

Estic preparant un script per passar les pelis amb format mkv al format que millor s'ajusti al dispositiu amb que les vull visualitzar. Poso l'script que tinc escrit ara i ja publicaré les millores.

Deixo un link de documentació de mencoder.

#!/bin/sh

INPUT=$1
OUTPUT=$2

#codec
CODEC_MPEG4="-ffourcc divx -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=1200"
CODEC_XDIV="-ovc xvid -xvidencopts bitrate=1200"

#scale
SCALE_720="-sws 2 -vf scale=720:-3"
SCALE_352="-sws 2 -vf scale=352:-3"
SCALE_NTSC="-sws 2 -vf scale=::::::ntsc"

#lang
SLANG_SP="-slang eng"
SLANG_ENG="-slang eng"

#use external audio
#EXTERNAL_AUDIO="-audiofile audio$$.wav"

CODEC=$CODEC_XDIV
SCALE=$SCALE_720
SLANG=$SLANG_ENG

if [ -f "$INPUT" ]
then

if [ -n "$EXTERNAL_AUDIO" ]
then
mplayer "$INPUT" -ao pcm:fast:file=audio$$.wav -vc null -vo null
fi

mencoder "$INPUT" \
$CODEC \
$EXTERNAL_AUDIO \
-oac mp3lame -lameopts vbr=3 \
$SLANG \
$SCALE \
-o "$OUTPUT"

if [ -n "$EXTERNAL_AUDIO" ]
then
rm -f audio$$.wav
fi

else

echo "$INPUT no trobat"

fi



dissabte, 19 de setembre del 2009

VirtualBox com un servei a Ubuntu

Al meu Quad Core corre l'Ubuntu 9.04. Li he hagut de posar VBox perquè tinc documents antics amb office que no es veuen bé amb openoffice i per altres temes.

Com que tinc 6GB de memòria no em molesta tenir les màquines virtuals permanentment engegades, de manera que quan s'engega l'ordinador també s'engeguen les màquines virtuals (una amb windows, una amb mldonkey).

Per fer el muntatge he seguit aquest manual:

http://www.glump.net/howto/virtualbox_as_a_service

l'unic que he canviat per que em funcionés ha estat posar l' "start" de les màquines dins l'/etc/rc.local. És la única manera que he sabut fer per que em funcionés bé amb l'upstart d'ubuntu 9.04.

dimarts, 15 de setembre del 2009

82801JI (ICH10 Family) HD Audio Controller

La setmana passada vaig comprar un packard bell al "no soy tonto".

Estic molt content amb ell, he posat Linux (ubuntu 9.04 i tot funciona de maravella).

La tarja gràfica és nvidia, he posat els drivers propietaris i funciona bé.

EL que no em funcionava era el so. He estat un grapat d'hores fins que he trobat la solució.


Problema:

El so no funciona amb “82801JI (ICH10 Family) HD Audio Controller”

No hi ha so amb “82801JI (ICH10 Family) HD Audio Controller”


Solució:

Només calia baixar i instal·lar l'alsa utils de realtek:


http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=24&PFid=24&Level=4&Conn=3&DownTypeID=3&GetDown=false#High%20Definition%20Audio%20Codecs


La solució l'he trobat als foros d'ubuntu:


http://ubuntuforums.org/showthread.php?t=534070


Altre informació útil:

per saber el HW de so que teniu:
lshw -c sound

*-multimedia

description: Audio device

product: 82801JI (ICH10 Family) HD Audio Controller

vendor: Intel Corporation

physical id: 1b

bus info: pci@0000:00:1b.0

version: 00

width: 64 bits

clock: 33MHz

capabilities: pm msi pciexpress bus_master cap_list

configuration: driver=HDA Intel latency=0 module=snd_hda_intel

per saber el model de tarja que teniu:
root@egg:/etc/modprobe.d# cat /proc/asound/card0/codec#* | grep Codec
Codec: Realtek ALC888

=================================


For english people:


No sound with “82801JI (ICH10 Family) HD Audio Controller”

No sound with “snd_hda_intel”


tags: imedia S3710, ubuntu, no sound.




Solution:


Check card model:


cat /proc/asound/card0/codec#* | grep Codec


Connect to realtek, download and install driver:


alsa utils de realtek:


http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=24&PFid=24&Level=4&Conn=3&DownTypeID=3&GetDown=false#High%20Definition%20Audio%20Codecs



==========