Image    Planeta

3 set 2018 - 18:33

M'agrada llegir codi d'altres per aprendre. I llig molt abans de preguntar dubtes.

És una forma de treballar que m'ha ensenyat el programari lliure: busca't la vida i després pregunta.

I per què preguntar si tinc milions de línies de codi amb exemples de programadors que saben programar més que jo?

Per això em sembla inaudit, que al munt de llistes de correu on estic apuntat, els nouvinguts del programari propietari, el primer que fan és preguntar. I cada pregunta... Sobre això ja faré un apunt intens els propers dies. M'ho apunte [*].

Ací volia parlar de cercar.

No tinc memòria, i és impossible recordar-se de tot. Així que és normal per mi cercar, en milers de fitxers, el nom de funcions, de paraules clau, etc. en distints formats de fitxer, per tal de trobar exemples, refrescar la sintaxi o aprendre la millor manera de fer les coses.

Fins ara m'havia fet un script en Bash jo mateix al qual li havia posat el nom de tb (trobar):

Bàsicament utilitza la comanda find amb combinació amb la comanda grep per cercar dins de fitxers. Hi ha, si llegiu el codi, 3 possibilitats depenent dels paràmetres. Cercar la cadena en totes les extensions o en una especificada, i després hi havia una altra que era cercar la cadena i afegir n línies, la qual cosa em permetia cercar en la resta de línies per alguna cosa.

Així, si volia trobar la funció default_get() simplement havia d'executar:

cubells@portatil:~/Dades/git/odoo11/src/core/addons/account$ tb py "default_get" ./models/account_payment.py: def default_get(self, fields): ./models/account_payment.py: rec = super(account_register_payments, self).default_get(fields) ./models/account_payment.py: def default_get(self, fields): ./models/account_payment.py: rec = super(account_payment, self).default_get(fields) ./models/account_bank_statement.py: company_id = self.env['res.company']._company_default_get('account.bank.statement').id ./models/account_bank_statement.py: default=lambda self: self.env['res.company']._company_default_get('account.bank.statement')) ./models/chart_template.py: def default_get(self, fields): ./models/chart_template.py: res = super(WizardMultiChartsAccounts, self).default_get(fields) ./models/account.py: default=lambda self: self.env['res.company']._company_default_get('account.account')) ./models/account.py: def default_get(self, default_fields): ./models/account.py: return super(AccountAccount, contextual_self).default_get(default_fields) ./models/account_invoice.py: default=lambda self: self.env['res.company']._company_default_get('account.invoice')) ./models/account_invoice.py: readonly=True, states={'draft': [('readonly', False)]}) #Default value computed in default_get for out_invoices ./models/account_invoice.py: def default_get(self,default_fields): ./models/account_invoice.py: res = super(AccountInvoice, self).default_get(default_fields) ./models/account_move.py: def default_get(self, fields): ./models/account_move.py: rec = super(AccountMoveLine, self).default_get(fields) ./wizard/account_reconcile.py: def default_get(self, fields): ./wizard/account_reconcile.py: res = super(AccountMoveLineReconcile, self).default_get(fields)

Com veieu, perfecte.

Però cercant per la xarxa i per casualitat he vist millors opcions.

La primera ha estat el programa ack. És una meravella com podeu comprovar:

Per instal·lar simplemente heu de fer apt-get install ack.

Avantatges:

  • Apareix el nom de cadascun dels fitxers on està la cadena de manera més clara.
  • Sintaxi amb colors.
  • Apareix el número de la línia on està la cadena.

I aquest va ser el nou programa que vaig adoptar.

Però també de casualitat, em vaig trobar amb un programa que és el que actualment faig servir per cercar: ripgrep.

I quina diferència hi ha entre ack i rg? Doncs la velocitat, la qual m'ha encisat. Ripgrep és molt més ràpid que l'ack, com podeu comprovar per a la mateixa cerca:

És de l'ordre de 5 vegades més ràpid.

Per instal·lar simplemente heu de fer apt-get install ripgrep.

També m'ha agradat molt perquè exclou els fitxers inclosos als patrons dels .gitignore durant la cerca directament, o que fa cerca a fitxers unicode.

Així que m'he creat uns quans alies per cercar a les extensions més comuns que utilitze i no haver de posar-la cada vegada:

$ cat ~/.bashrc | grep rg alias rgp="rg -g '*.py'" alias rgx="rg -g '*.xml'" alias rgc="rg -g '*.csv'" alias rga="rg"

I he afegit una variable al bash per dir-li on està el fitxer de configuració del ripgrep:

$ cat ~/.bashrc | grep RIPGREP export RIPGREP_CONFIG_PATH=~/.ripgreprc

On he especificat aquestos paràmetres generals:

$ cat ~/.ripgreprc ───────┬───────────────────────────────────────────────────────────── │ File: /home/cubells/.ripgreprc ───────┼───────────────────────────────────────────────────────────── 1 │ # Don't let ripgrep vomit really long lines to my terminal. 2 │ --max-columns=150 3 │ 4 │ # Because who cares about case!? 5 │ --smart-case 6 │ 7 │ # Ignore .gitignore message warnings 8 │ --no-messages

He afegit el nombre màxim de columnes, que no faça cas de les majúscules i que no mostre els errors en processar els fitxers .gitignore.

Si voleu una bona comparativa, podeu llegir aquesta web, del creador d'ack, una mica antiquada ja pels canvis al programari, però que us pot donar una idea de quina és la millor eina per a vosaltres.

1 set 2018 - 15:30
Com cada any, organitzo amb Caliu el Dia de la Llibertat del Programari (Software Freedom Day). Farem xerrades i tallers de diversos programes lliures per tal de donar informació a tothom que hi estigui interessat a l’Ateneu La Bòbila de Nou Barris, al carrer de l’Estudiant, 26. Dissabte 15 de setembre 16:15  Presentació de La Continue reading →
31 ag 2018 - 10:33
Instal·lem els paquets: $ sudo apt install cuetools shntool flac Separem els fitxers: $ shnsplit -f file.cue -t %n-%t -o flac file.flac 0
27 ag 2018 - 23:01

Mai no ha estat tan fàcil aconseguir totes les eines que necessites al teu ordinador, per facilitar-te la feina.

Si tens un sistema amb Linux, com en el meu cas, és molt fàcil fer-ho amb l'aplicació Snapd.

La pots instal·lar a aquestos sistemes operatius:

Executant la comanda:

$ sudo apt-get install snapd

i ja està!

Què pots instal·lar-te per convertir el teu ordinador en una estació de trebal potent?

Necessites un entorn integral de desenvolupament?

Però no solament tens accés a IDES, també tens editors de text que són també entorns de programació:

Que no tens prou eines? Doncs pots instal·lar-te'n més:

No en tens prou?

Doncs tots aquestos programes te'ls pots instal·lar simplemente executant:

$ sudo snap install nom_del_programa

Si vols llistar els snaps que tens al teu sistema, simplement has d'executar:

$ snap list Name Version Rev Tracking Publisher Notes android-studio 3.1.4.0 53 stable snapcrafters classic core 16-2.35 5328 stable canonical✓ core

I sis vols desinstal·lar, sols has d'executar:

$ sudo snap remove nom_del_programa

I per acabar, la llista completa de comandes disponibles:

$ snap -help Usage: snap <command> Install, configure, refresh and remove snap packages. Snaps are 'universal' packages that work across many different Linux systems, enabling secure distribution of the latest apps and utilities for cloud, servers, desktops and the internet of things. This is the CLI for snapd, a background service that takes care of snaps on the system. Start with 'snap list' to see installed snaps. Available commands: abort Avorta un canvi pendent ack Add an assertion to the system alias Set up a manual alias aliases List aliases in the system buy Buy a snap changes List system changes connect Connect a plug to a slot disable Disable a snap in the system disconnect Disconnect a plug from a slot download Download the given snap enable Enable a snap in the system find Find packages to install (aliases: search) get Print configuration options help Show help about a command info Show detailed information about snaps install Install a snap to the system interface List snap interfaces interfaces List interfaces in the system known Show known assertions of the provided type list List installed snaps login Authenticate to snapd and the store logout Log out of snapd and the store logs Retrieve logs of services pack Pack the given directory as a snap prefer Prefer aliases from a snap and disable conflicts refresh Refresh a snap in the system remove Remove a snap from the system restart Restart services revert Reverts the given snap to the previous state run Run the given snap command services Query the status of services set Change configuration options start Start services stop Stop services switch Switches snap to a different channel tasks List a change's tasks (aliases: change) try Test a snap in the system unalias Unalias a manual alias or an entire snap version Show version details wait Wait for configuration watch Watch a change in progress whoami Print the email the user is logged in with

Completet.

26 ag 2018 - 09:22

Interessant article de fa un any on l'autor tracta d'explicar l'auge que està tenint el format JSON, en contraposició a la davallada del format XML.

Podeu comprovar com cada vegada es consulta més sobre JSON a StackOverflow en aquesta gràfica:

O també podeu comprovar-ho en ca Google:

Això indica la bona salut que pateix aquest format.

Les raons que expliquen la davallada del format XML són:

  • L'ús obligat del símbols < i >. Cada vegada que s'obre una etiqueta, s'ha de tancar i això fa que hi haja un munt de caràcters que no fan res, fan el document molt gran i, més important, el fan difícil de llegir.
  • L'XML encara que moltes vegades s'usa per l'intercanvi de dades, originalment no es va disenyar per aixó, sinó per a ser un llenguatge de marques.
  • L'XML és confús perquè hi ha un munt de sabors distints: RSS, ATOM, SOAP, o SVG.

El format JSON, en canvi, és fàcilment entenible, tant pels usuaris com pels programes, i solament fa una cosa i la fa senzilla.

Quins poden ser segons tu les raons d'aquesta davallada?

Per mi simplement són formats que van ser creats per a tasques distintes. Però també poden explicar la cada vegada major demanda de procés i intercanvi de dades en la web, en contraposició amb les pàgines on solament es mostren. Aquesta demanda farà que triem un o altre llenguatge i que siga un llenguatge de futur.

25 ag 2018 - 11:27

Un dels deures que tenia pendent i que m'havia proposat fer aquest estiu era llegir el llibre Codi Rebel de Glyn Moody.

Doncs resulta que avui fa 27 anys del famós missatge a Usenet de Linus Torvalds on anunciava que estava treballant amb linux:

Hola a tots aquells que sou usuaris del minix,

Estic fent un sistema operatiu (lliure) (només és un passtemps, no serà tan gran ni tan professional com el gnu) per als clons del 386(486) AT. Ha estat fermentat des de l'abril i ja comença a estar a punt. M'agradaria rebre comentaris sobre allò que a la gent li agrada/desagrada del minix, ja que el meu SO se li assembla una mica (el sistema de fitxers té el mateix format físic -per raons pràctiques, entre altres coses).

...Aconseguiré que funcione en la pràctica en uns pocs mesos i m'agradaria saber quines característiques són les que la majoria de la gent voldria mantenir. Qualsevol suggeriment serà benvingut, però no puc prometre que els acceptaré tots :-)

Linus (torvalds@kruuna.helsinki.fi)

Hi ha una dèbil polèmica per si s'ha de celebrar l'aniversari el 25 d'agost, avui, o el 5 d'octubre on alguns consideren que és quan es va poder accedir al primer codi de linux.

Tant se val. Ho celebrem igual. Feliços 27 anys.

25 ag 2018 - 11:00

Interessant pàgina web on es pot comprovar la quota de mercat que tenen els distints sistemes operatius, navegadors, cercadors i dispositius.

Així podem saber ràpidament que el navegador Chrome ha augmentat lleugerament la seua quota de mercar els darrers mesos:

Que Windows és el sistema operatiu més implantat als ordinadors del món:

Encara que als telèfons mòbils, els sistemes operatius amb un nucli linux, pràcticament són el 100%:

I que els mòbils ja superen als ordinadors convencionals:

Hi ha moltes més dades que podeu consultar. Ja direu.

De moment apunte l'enllaç a l'apartat d'enllaços.

4 ag 2018 - 10:20

Impressionant (per a mi) pàgina web on es pot comparar la grandària de diversos cossos de l'esapi de manera interactiva. A més a més amb fotos actualitzades dels planetes.

Per exemple, en aquesta captura estem comparant la terra i mart:

Afegisc l'URL a la secció d'enllaços. Llegit a meneame.net.

1 ag 2018 - 22:27

Tot just, en un interval de tan sols 14 minuts, he rebut dos correus electrònics avisant-me que, primer, s'ha publicat una actualització de seguretat que solucionava el possible phishing que es pot fer si tens activats django.middleware.common.CommonMiddleware i la variable APPEND_SLASH en la configuració (CVE-2018-14574). Això ha obligat a publicar la versió 2.0.8 que la solucionava. 

I el segon correu electrònic m'avisava de la publicació de la versió 2.1 de Django amb l'esperada millora dels permisos de les vistes entre altres moltes coses.

En aquest enllaç podeu vore la llista de versions i la seua caducitat.

A actualitzar.

De moment jo he actualitzat a la versió 2.0.8 perquè quan he intentat actualitzar a la 2.1 s'ha produït aquest error:

... File "/home/cubells/ma_web/lib/python3.6/site-packages/django/utils/html.py", line 397, in <lambda> klass.__str__ = lambda self: mark_safe(klass_str(self)) File "/home/cubells/ma_web/lib/python3.6/site-packages/django/forms/boundfield.py", line 33, in __str__ return self.as_widget() File "/home/cubells/ma_web/lib/python3.6/site-packages/django/forms/boundfield.py", line 93, in as_widget renderer=self.form.renderer, TypeError: render() got an unexpected keyword argument 'renderer'

Això és degut a aquest commit del mateix Tim Graham, que suprimeix el suport dels mètodes Widget.renderer() sense l'argument renderer. He de repassar com cride jo aquesta funció per renderitzar els formulari dels comentaris. Més notícies els propers dies.

30 jul 2018 - 19:48

Ara que ja m'arriben les vacances vos compte les tasques que em plantetge fer en els proper dies.

Evidentment, no sé si podré o tindré ganes de fer-les totes. Com diu el títol de l'entrada, són simplement propósits: una llista del que vull fer i no sé si aconseguiré. Em servirà el llistat de guia.

Doncs la llista és la següent:

Al final de l'estiu pegaré un repàs a la llista a vore què he pogut i què no he pogut fer. I què he d'acabar-ho a llarg termini.

I vosaltres? Teniu algun propòsit per a l'estiu?

Pàgines