Viernes 20 de julio de 2018

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: Cambiar fecha de un archivo

En ocasiones nos podemos encontrar con la necesidad de tener que cambiar la fecha de modificación, etc... de un archivo en sistemas Linux. Antes de empezar, hemos de entender que existen 3 tipos de marcas de tiempo en los ficheros. Fijémonos en este ejemplo: Con el comando stat, al indicar como parámetro un fichero, vemos que aparece: Access: Se actualiza cuando abrimos el
Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: Servicios systemd systemctl

Muchas distribuciones de Linux actuales han pasado del modelo de SystemV a SystemD y por tanto se cambia la forma de administrar los servicios del sistema. En el caso de distribuciones Linux RedHat o CentOS: - Versiones anteriores a la 7: SystemV - Versión 7: SystemD Siguiendo con las distribuciones RedHat/CentOS, en las versiones que funcionan con SystemV, la administración de los

Jueves 19 de julio de 2018

Asociación LiGNUx: Wireshark alcanza su versión 2.6

Miércoles 18 de julio de 2018

Asociación LiGNUx: Presentación de godedupe (alternativa a fdupes)
Gorka Urrutia

Gorka Urrutia
Nideaderedes

Cómo indicarle al git la llave ssh que debe usar

Si tienes tantas llaves ssh como yo seguro que tarde o temprano tendrás problemas porque en algún sitio se quejará de “too many retries”. Si eso te pasa en git hay una forma de indicar cuál es la llave que quieres usar al conectarte vía ssh.

En mi caso yo tenía problemas al conectarme a BitBucket. Así que para solucionarlo hay que editar el fichero de configuración SSH de tu ordenador. En mi caso:

/home/gorka/.ssh/config

y añadir:

host bitbucket.org
    HostName bitbucket.org
    IdentityFile ~/.ssh/llave_publica_para_conectarme_a_bitbucket.pub
    User gorka

En tu caso deberás cambiar “gorka” por tu usuario en BitBucket y ~/.ssh/llave_publica_para_conectarme_a_bitbucket.pub por la ruta de tu llave pública (la que uses para conectarte a BitBucket).

Si el problema lo tuvieses con GitHub harías:

host github.com
    HostName github.com
    IdentityFile ~/.ssh/llave_publica_para_conectarme_a_github.pub
    User git

Cómo ejecutar tu distribución favorita de Linux desde un pendrive

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} span.s1 {font-kerning: none} span.s2 {text-decoration: underline ; font-kerning: none} Cada día son menos los equipos portátiles que

酵素ダイエットは業者の宣伝からではなく

酵素ダイエットは業者の宣伝からではなくネットなどの口コミで広まったダイエット法なのです。心身に負担をかけずにやせることができた、薬に頼っていた程重い便秘が治った、ウエスト周りの贅肉が減ったといったように、大勢の人が声を上げてその効果を知らせてくれています。そんな声の中には失敗について教えてくれるものもあり、他のダイエット同様、成功確率100%の方法ではないことがわかっています。やり方や仕組みをよく見聞きし、間違えて失敗することの無いようにしたいですね。

体調にもよりますが、脱毛機器の光が当たった肌は後々、ほてった状態になるケースもあるでしょう。肌に擦れてかゆみなど炎症を起こさないよう、コットンなど肌触りが良く、通気性の良い服装がオススメです。脱毛箇所が隠れるなら更にグッドです。状況次第では、そこが紫外線によって炎症を起こしたり、日焼けによって湿疹や赤みなどの肌トラブルになってしまうからです。施術前に専用の施術着に着替えることになるので、もちろん、私服が汚れることはありません。金で最も高価なのはもちろん純金ですが、他にも色々な金があります。カラットの略であるKを用い、純金なら「24K」などと表現します。純金でなく他の金属との合金の場合は、「18金(18K)」などの表現になります。18Kは24分の18という意味ですから、つまり75パーセントが金です。18Kの中でも、金に何をどれだけ混ぜるかによって種類が変わり、銀と銅が五分五分ならイエローゴールド、パラジウムが25%入ればホワイトゴールドなどと変化します。ある金製品が幾らで売れるかの目安として、純度によって大きく値段が変わるのだと思っておいてください。
インプラントの定着には長い時間がかかりますが、それが終わっても、ケアはそこで終わりではありません。治療後の綺麗な状態を維持していけるかどうかは、どうしても自分次第のところがあります。間違った口内ケアでは歯を良い状態に保てません。正しい方法を歯科で教えてくれるので、それを守って、常に歯を綺麗にしましょう。治療技術が進歩しても、結局大事なのは自分自身でのケアなのです。加えて、自分の歯の神経ではなくなりますから、口腔内の異常に自分で気付くことが難しくなります。担当歯科医による定期的な経過観察を受けるようにしましょう。

仮に不動産売却で利益が出たなら、譲渡所得税を納付しなければならないかもしれません。売った不動産の所有期間が5年より長い場合の譲渡所得税は、15%の所得税と5%の住民税が課税されます。所有期間が5年以下の短期であれば2倍の税率で納めます。いつ納付するかというのは、所得税は売却の翌年2月16日から3月15日の間に一括納付し、他方、住民税の納付期限は4期に分かれているため、支払いも4回に分かれます。
法律の中では、婚姻関係にある人が配偶者以外の異性と故意に肉体関係を持つことを不倫とよびます。ということは、法に従えば、性的に親密な関係ではなかったなら、一緒に時間を過ごしていたとしても、不倫ではありません。個人では肉体関係の証拠をつかむのは難しいですが、探偵や興信所に内偵してもらうこともできます。

なんとなく不妊を疑いはじめたら、まずは基礎体温計を購入することをおすすめします。簡単すぎるようですが、基礎体温の推移を見れば体内のホルモンバランスの変化や状態が分かり、妊娠につながる対策を講じることもできるのです。基礎体温計は小数点以下2ケタまで測れます。入院患者さんと同じで「起床時」に「毎日」計らなくてはいけないという注意点もあるので、それに従って毎日続けるのが肝心です。いまはアプリもあるので気軽にできますね。
住宅を売って得たお金には所得税などの税金はかかるものでしょうか。どれだけ利益が得たかによります。購入費を超えた価格で売れて売却益が出たなら、所得税の支払いが生じますし、反対に購入時より安値になってしまったら所得税はかからず、住民税もかかりません。また、売却価格が購入価格を大きく上回ったとしても、物件売却による譲渡所得が3000万円以内なら面倒でも確定申告をきちんとしておくと、所得税を納めなくてもいいのです。
光脱毛は、ほぼ9割9分の脱毛サロンで行われている施術形式です。皮膚に脱毛クリニックのレーザーよりパワーを落とした光を照射し、除去したい部分の毛根色素に作用して、発毛を抑制します。脱毛サロンごとにオリジナルの機器を使用していることが多く、脱毛時の刺激や皮膚にかかる負担などは差が出てくるのがあたりまえですし、こればかりは体験キャンペーンなどを利用して、自分で選ぶより方法がないです。ユーザーレビューや脱毛サロンのサイト情報はあくまでも参考です。

信頼性の高い探偵事務所に出会う方法としては、利用者による口コミを調べると安心です。ここで重要なことは、その探偵事務所が運営するサイトに掲載されている口コミなんかではなく、全く無関係の掲示板や専門の相談用サイトに記載されている口コミを確認するのがお勧めです。その探偵事務所が管轄していない口コミの方が、信頼性が高いのは明白です。
購入はこちら⇒だのに顔汗 抑える 簡単ましょ

Martes 17 de julio de 2018

Asociación LiGNUx: Tutorial para instalar la versión de mantenimiento del Kernel Linux 4.17.7

Computación cuántica para torpes: introducción para programadores

Hace ya bastante tiempo quese viene hablando de ordenadores cuánticos. ¿Qué son? ¿En qué se diferencian de los ordenadores clásicos? ¿Son de verdad tan potente como dicen?

En este largo artículo, ideal para el verano, vamos a ver los principios fundamentales de los ordenadores cuánticos más allá de lo que la típica revista o web te podría contar. Veremos qué es un qubit y algunas puertas lógicas interesantes, así como su aplicación.

Los ordenadores cuánticos actuales requieren temperaturas de funcionamiento cercanas al cero absoluto

Notación de Dirac

Lo primero antes de entrar en materia cuántica, será adaptar nuestra notación clásica, a otra más potente. Esta notación que vamos a ver, llamada notación de Dirac o Bra-ket, nos será muy útil ya que los bits clásicos no son más que un caso concreto de qubit en esta notación.

En esta notación tenemos que representar los bits como matrices. Un conjunto de N bits se representa con una matriz de 1 columna y \(2^N\) filas. En todas las posiciones existen ceros salvo para la posición que representa la combinación que representa. Veamos algunos ejemplos sencillos:

Un bit con valor 0 se representa así

\(
| 0 \rangle = \begin{pmatrix}
1\\
0
\end{pmatrix}\)

Un bit con valor 1 se representa así:

\(
| 1 \rangle = \begin{pmatrix}
0\\
1
\end{pmatrix}\)

Aquí contamos como en informática, empezando desde cero. Como ves la posición 0 del vector solo es 1 cuando representa el bit 0. Si la posición que tiene el 1 es la segunda, representa el bit 1.

La parte que va a la izquierda del igual se llama ket. En este caso hemos representado ket 0 y ket 1.

Si tenemos más bits se puede hacer de la misma forma. Vamos a representtar ket 10. 10 en binario es 2, así que estará en la posición tercera.

\(
| 10 \rangle = \begin{pmatrix}
0\\
0\\
1\\
0
\end{pmatrix}\)

Puertas lógicas como producto de matrices

¿Recuerdas el producto de matrices de tus clases de álgebra? Resulta que todas las puertas lógicas clásicas pueden representarse como producto de matrices. Por ejemplo, la puerta lógica NOT se puede implementar con esta matriz:

\(
\begin{pmatrix}
0 & 1 \\
1 & 0 \\
\end{pmatrix}
\)

Y aquí la vemos en acción

\(
\begin{pmatrix}
0 & 1 \\
1 & 0 \\
\end{pmatrix}\begin{pmatrix}
1 \\
0
\end{pmatrix}
=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\)

También podría hacerse con la puerta AND que toma como entrada dos bits.

\(
\begin{pmatrix}
1 & 1 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
0 \\
0 \\
0 \\
1
\end{pmatrix}
=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\)

Un teclado con puertas cuánticas

Juntando bits

Para formar bits más grandes ya sabemos que tenemos que tener una matriz tan grande como combinaciones haya (\(2^N\) posiciones, N bits). Existe una forma de calcular automáticamente la posición que hay que marcar y es hacer el producto tensorial. Si no sabes calcularlo no importa mucho, porque apenas lo vamos a usar, pero puedes ver un ejemplo de como funciona. En este ejemplo, queremos juntar los bits 1 y 1 (3 en decimal).

\(
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
1
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0 \\
0 \\
1
\end{pmatrix}
\)

Qubits

Hasta ahora no hemos visto nada realmente nuevo, solo hemos preparado el terreno para dejar paso a los qubits. Personalmente desconocía que podían usarse matrices para operar con bits y aunque no es tan práctico como otros sistemas, lo cierto es que es muy explícito y elegante.

Los qubits son bits como los que hemos visto antes pero tienen un estado indeterminado. No es que tengan un valor de forma secreta y no sepamos cuál es. Podríamos decir que son los dos valores clásicos a la vez, como el gato de Schrodinger. Cuando realizamos una observación sobre el qubit, este colapsa y podemos ver uno de los dos estados. ¿Cuál vemos? No podemos saberlo a priori, pero hay probabilidades. Los bits clásicos no son más que qubits cuyas probabilidades de colapsar a 0 o 1 es del 100%, por tanto no hay duda y su valor sí que está determinado.

¿Cómo representamos los qubits y sus estados cuánticos? Con números complejos. Si recuerdas, estos eran los que tenían una parte real y una imaginaria. No obstante, voy a tomar solo los números reales para simplificar. Los números reales son números complejos válidos, pero los complejos son mucho más extensos.

La esfera de Bloch permite representar todos los estados cuánticos (números complejos)

Para calcular la probabilidad que tiene un estado cuántico de colapsar a un valor, hacemos el módulo y elevamos al cuadrado: \(|a|^2\).

Todo qubit además debe cumplir una propiedad fundamental:

\(
\begin{pmatrix}
a \\
b
\end{pmatrix}
\text{ es un qubit}
\Leftrightarrow
|a|^2 + |b|^2 = 1
\)

Y es que la probabilidad de ser 0 y de ser 1 sumadas deben equivaler al suceso seguro, es decir, 1. 100% de probabilidades de que de 0 o 1.

Con esto ya podemos definir algunos qubits.

\(
\begin{pmatrix}
\frac{1}{\sqrt{2}} \\
\frac{1}{\sqrt{2}}
\end{pmatrix}
\)

Este es mi qubit preferido. Representa el estado de superposición cuántica. Cada valor tiene el 50% de probabilidades de salir. \(|\frac{1}{\sqrt{2}}|^2 = \frac{1}{2}\). Cuando colapsemos el qubit al observarlo será como lanzar una moneda al aire.

Otro detalle que a veces se nos pasa por alto es que los qubits pueden contener valores negativos. Estos qubits son físicamente diferentes a los positivos, pero tienen las mismas probabilidades de colapsar en los mismos valores que los positivos.

\(
\begin{pmatrix}
-1 \\
0
\end{pmatrix}
\)

Es un qubit válido, que colapsa con 100% de probilidad a 0.

¿Cómo se representan los qubits en notación de Dirac? Representando la probabilidad que tiene cada combinación de bits de aparecer. Para un qubit sería algo así:

\(
\alpha | 0 \rangle + \beta | 1 \rangle
\)

Siendo \(\alpha\) y \(\beta\) las probabilidades de colapsar a cada estado.

Puertas cuánticas

Ahora vamos a ver cuáles son las puertas lógicas más importantes del mundo cuántico.

Negación (Pauli X)

Esta es exactamente igual que en el mundo clásico, con la misma matriz que hemos visto antes. Su símbolo es el cuadrado con una X.

Aquí vemos una imagen del simulador IBM Q usando la puerta X cuántica. IBM nos deja ejecutarlo en ordenadores cuánticos reales. Veamos los resultados.

¡Terrible! La mayoría de casos, el ordenador cuántico responde 1, el valor correcto, pero un 13% de los casos no. Teóricamente había una probabilidad del 100% y en la práctica solo es del 86.3%. ¡Y solo es una puerta X! Es por ello que los procesadores cuánticos todavía necesitan mejorar mucho. Google, Microsoft e IBM están investigando de forma independiente en ordenadores cuánticos. Veremos quién consigue tener antes ordenadores cuánticos precisos (aunque hay expertos que piensan que nunca se podrá lograr).

CNOT

Esta puerta es muy interesante. Toma dos qubits, uno de control, que permanece invariable al traspasar la puerta y otro de datos. Al qubit de datos se le aplica la puerta X si el qubit de control está activo. Su matriz es la siguiente:

\(
CNOT = \begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0
\end{pmatrix}
\)

Se reprensenta de esta forma:

O similar, porque los símbolos de computación cuántica no están todavía muy estandarizados. El punto grande es el qubit de control y el punto pequeño está sobre el qubit de datos.

HADAMARD

Esta puerta es quizá la más famosa del mundo cuántico. Veamos su matriz:

\(
\begin{pmatrix}
\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\
\frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}}
\end{pmatrix}
\)

Esta puerta permite poner un qubit clásico en estado de superposición cuántica. Y también deshacerlo. Es muy usada en algoritmos cuánticos. Se representa con un cuadrado y una H.

Los resultados en el ordenador cuántico real de IBM Q son:

Cuando debería de ser bastante más cercano a 50% en los dos valores.

Con esto ya tenemos las puertas más usadas. Básicamente con Hadamard, X y CNOT se pueden implementar casi todos los circuitos cuánticos. Solo nos faltarían las puertas que operan entran en números complejos para poder implementar todos los circuitos.

Algoritmo de Deutsch-Jozsa

El algoritmo de Deutsch-Jozsa es uno de los algoritmos cuánticos más sencillos de entender y que mejoran drásticamente el rendimiento respecto a un algoritmo clásico.

El planteamiento básico es que tenemos una caja negra que aplica una función sobre un bit. Estas funciones pueden ser: set-to-0, set-to-1 (ambas constantes), identidad (no cambiar nada) y X (ambas dinámicas) . Si queremos saber que función contiene la caja negra, ¿Cuántas veces tenemos que pasar valores? En una CPU clásica tendríamos que hacerlo dos veces para poder determinar que función contiene la caja negra. En una CPU cuántica… también. No hay diferencia. Pero, si cambiamos la pregunta a ¿de qué categoría es la función de la caja negra?, la cosa cambia. En una CPU clásica seguiríamos necesitando 2 pruebas, pero en una CPU cuántica y con un circuito por el exterior, podemos aprovechar la superposición cuántica para realizar una sola prueba y determinar si en el interior hay una función constante o dinámica.

Vamos a ver estas 4 funciones de la caja negra como son:

¿Se te ocurre como puedes crear un circuito fuera de la caja negra que con una sola prueba, ya sepa si estamos ante las funciones Set-0, Set-1 o Identidad, Negación?

El circuito es el siguiente:

Tal y como está diseñado si en q[1] medimos 0, la función es de tipo constante y si medimos 1, es de tipo dinámica. Un desarrollo matemático de los productos de matrices, como el que hay en Wikipedia, te mostrará como siempre es cierto. Este también es un ejemplo de como los ordenadores cuánticos pueden dar resultados totalmente deterministas.

Esta idea, se puede generalizar y extrapolar a otros problemas, generando una colección muy interesante de algoritmos que se ejecutan en tiempo exponencialmente menor que en una CPU clásica.

Algoritmos de Shor y de Grover

Estos dos algoritmos han sido llamados los killer apps de la computación cuántica, ya que son algoritmos que mejoran sustancialmente (uno de forma exponencial, otro de forma cuadrática) los tiempos de problemas reales.

El algoritmo de Shor fue el primero en ser descubierto, en 1994 por Peter Shor. Sirve para factorizar números (es decir, sacar los números primos que multiplicados generan el número original). Lo puede hacer en \(O((\log{n})^3)\). De este modo, los algoritmos tipo RSA que se basan en la factorización de números podrían romperse en tiempo polinómico, por lo cuál RSA ya no serviría como protección. El algoritmo de Shor no da siempre los resultados correctos, pero tiene una probabilidad de éxito superior a la de fracaso, por lo que con repetir múltiples veces la ejecución podríamos estar casi seguros del resultado.

El algoritmo de Grover fue descubierto en 1996 por Lov Grover y permite buscar en una lista no ordenada de datos en \(O(\sqrt{n})\) mientras que en una computadora clásica sería \(O(n)\).

Estos dos algoritmos sin duda marcan lo que se ha llamada la supremacía cuántica y que ocurrirá cuando los ordenadores cuánticos puedan ejecutar con suficiente precisión estos algoritmos y su utilidad en el mundo real supere a la de los algoritmos clásicos.

Entrelazamiento cuántico

Ya hemos visto las bases de los circuitos cuánticos. Ahora veamos algunas consecuencias de todo lo anterior. Cosas cuánticas que parecen hasta cierto punto fuera de la lógica. ¿Qué ocurre si tenemos varios qubits en un estado como este?

\(
\begin{pmatrix}
\frac{1}{\sqrt{2}} \\
0 \\
0 \\
\frac{1}{\sqrt{2}}
\end{pmatrix}
\)

En este estado solo puede colapsar a 00 o a 11. ¿Esto qué significa? Significa que los qubits están entrelazados entre sí, uno depende de otro, si los separamos y uno colapsa a 0, el otro colapsa a 0. Si uno colapsa a 1, el otro colapsa a 1.

Es importante destacar que los qubits pueden separarse en este estados. Los qubits alejados a millones de kilómetros siguen entrelazados y el valor al que deciden colapsar se decide de forma instantánea. Esto quiere decir que se sincronizan a una velocidad superior a la de la luz. El truco es que no se transmite información, por eso el universo lo permite, pero esto permite realizar la teletransportación cuántica.

La forma de entrelazar qubits es muy sencilla, con una puerta Hadamard y una CNOT.

IBM Q todavía tiene que mejorar, pero se aprecia claramente el entrelazamiento cuántico.

Teletransportación cuántica

La teletransportación existe, al menos entre qubits. Y es instantánea (más o menos). La teletransportación cuántica la podemos provocar usando varios qubits entrelazados. Necesitamos 3 qubits. El qubit que va a ser teletransportado, un qubit del emisor y un qubit del receptor. La idea es entrelazar el emisor con el receptor (qubit de destino) y posteriormente el qubit del emisor con el qubit que va a ser transportado.

No he sido capaz de hacer que IBM Q haga una teletransportación, así que aquí viene un esquema distinto. T es el qubit a transportar, A es el emisor y B el receptor. En este ejemplo se usa la puerta Pauli Z, cuya matriz es la indicada.

El truco de la teletransportación instantánea tiene que ver con que A y B tienen que estar entrelazados, por tanto, han tenido que ser transportados a sus respectivos lugares anteriormente a velocidad inferior a la luz.

Esto teletransporta qubits pero no hace copias. Esto es debido al Teorema de No Clonación.

Lenguajes de programación

Mientras esperamos a que los ordenadores cuánticos sean lo suficientemente estables, ya existen lenguajes de programación que podemos usar en simuladores. Quizá el más conocido sea Q# de Microsoft (funciona en Linux, tranquilos), que guarda similitudes con C#. Otro bastante usado es OpenQasm de IBM, algo más parecido a ensamblador.

namespace Quantum.Bell
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

    operation Set (desired: Result, q1: Qubit) : ()
    {
        body
        {
            let current = M(q1);
            if (desired != current)
            {
                X(q1);
            }
        }
    }
    operation BellTest (count : Int, initial: Result) : (Int,Int,Int)
    {
        body
        {
            mutable numOnes = 0;
            mutable agree = 0;
            using (qubits = Qubit[0])
            {
                for (test in 1..count)
                {
                    Set (initial, qubits[0]);
                    Set (Zero, qubits[1]);

                    H(qubits[0]);
                    CNOT(qubits[0],qubits[1]);
                    let res = M (qubits[0]);

                    if (M (qubits[1]) == res) 
                    {
                        set agree = agree + 1;
                    }

                    // Count the number of ones we saw:
                    if (res == One)
                    {
                        set numOnes = numOnes + 1;
                    }
                }

                Set(Zero, qubits[0]);
            }
            // Return number of times we saw a |0> and number of times we saw a |1>
            return (count-numOnes, numOnes, agree);
        }
    }
}

Este es un ejemplo de lanzar la moneda con entrelazamiento cuántico en Q#, el lenguaje cuántico de Microsoft.

Referencias

Quantum Computing for Computer Scientists
Cats, Qubits, and Teleportation: The Spooky World of Quantum Algorithms
Microsoft Quantum Development Kit: Introduction and step-by-step demo
Qubit

La entrada Computación cuántica para torpes: introducción para programadores se publicó primero en Adrianistán.

もう着なくなった着物が何枚かうちに

もう着なくなった着物が何枚かうちにあるのですがかさばる着物をお店に運ぶのも大変だし手間をかけて持ち込んでも、それに見合った買い取りをしてくれるのか自分で調べる余裕もなく結局処分に踏み切れませんでした。近頃は着物買取業者も競争が激しいのか、宅配で買い取りするお店もちょっと探せばあるようです。ネットなどで口コミや評価を調べ、自分のニーズに合った業者を家族で検討しています。

不動産売買契約書は課税文書に当てはまるので、印紙税が課税されます。不動産の売値に応じて段階が変化することにより、印紙代は売価次第で数十万円に上ることもあります。しかも、契約書が売主側と買主側でそれぞれ作成された場合は、それぞれの契約書に印紙税が課税されてしまいます。ただし、この際の税額は先ほどとは違う金額別の基準が設定されていますので、確かめておくといいでしょう。

住宅を売却する際は、予想外に費用がかかるものです。一般に不動産会社を通じて売却すれば、仲介手数料が発生します。売却額の3%に6万円と消費税を足したものを不動産会社に支払う必要があります。それと司法書士へ支払う登記費用等一式、契約書や領収証に貼る印紙代、その他書類作成費など状況次第で費用がかさみます。つまり、それらの出費を踏まえて売値を決めなければいけません。どの探偵社に依頼したら良いか取っ掛かりが掴めない人は多いと思います。とりあえず優先すべきは探偵社の所在地です。ほとんどの人は自宅から通勤圏内でしか動きませんので、地域を意識して、ウェブで検索してみると良いでしょう。いくつか選んだところで電話で相談員に話してみると良いでしょう。とにかく話を聞いてみなければ、信頼できる探偵社かどうか判断がつかないですし、同時に疑問点も聞いてみると良いのです。
全身脱毛にかかる価格は、どこのサロンで行うかで全く違ってくるのです。VIO脱毛を入れた6回の全身脱毛の価格は、価格が安くて10万円ほど、高くて30万円ほどかかります。3倍ほども違ってくるんですね。平均の全身脱毛料金は約16万円程度ですから、一般的な料金としては15~18万円程度で、13万円以下ならば安価で、20万円以上かかったら高いサロンといえるでしょう。事前に全身脱毛にかかる料金の平均が分かっていると安心できますね。
利用途中の脱毛サロンが倒産してしまうと、前払い分のお金が手元に戻ってくることはありません。ローンの場合、こなしていないメニュー分の支払いは当然止めることが可能です。このご時世ですので有名な大手サロンでも倒産しないとは限りませんし、ましてや大手以外に関しては、いつ潰れてもそれほど不思議ではありません。そういう訳ですから料金の前払いはしないでおく方がリスクを減らせます。着物買取の前には必ず査定がありますが、持ち込みも出張査定も行っているとして、何とか高く売りたいと思う方は、どんな買取でもそうですが、持ち込みの方が有利です。もし納得いく査定額でなかったとき、出張よりは断りやすいと考えられます。持ち込みは難しく、宅配か出張で査定してもらう場合、出張査定は無料サービスで査定後に買取を断ることも可能と明記していることを確かめてください。
探偵御用達のツールとしては、無線発信機が全盛だったころもありますが、最近の探偵社の多くは更に信頼度が増したGPSを使用するようになり、古い無線発信機に頼っていた頃と比較すると調査対象の追跡性能がアップしました。最新のGPSは正確性で検索速度も高いため、地下駐車場など通信困難な場所でない限り、車両を発見することは簡単になりました。GPS を取り付けることができれば時間の無駄を最小限に、追跡調査ができます。

どんな買取業者であっても、買取を喜ばれるプラダは、1913年に、マリオ・プラダとフラテッリ・プラダの兄弟が立ち上げたイタリアの高級ブランドです。最初は「プラダ兄弟」という名前の、皮革製品を扱う店でしたが、こだわりの素材を使用し、高い品質を実現させて、しばらくするとイタリア王室のご用達となったのです。時代は変わり、ミウッチャ・プラダが3代目オーナー、兼デザイナーとなりました。これにより、ブランドコンセプトを「日常を贅沢に飾る」として合理的な素材づかい、斬新なデザインの作品を作り続け、世界中でプラダのブームが起こりました。
肌を見せる機会が増える夏には、ムダ毛を見せないために、ムダ毛の処理を始める女性が増えるものです。施術した後には、露出して恥ずかしくない肌になるわけではないので、ずっと通い続けることが必須で、脱毛されてキレイな肌になるまでは、おおよそ2年くらいかかってしまいます。それまでは2ヶ月から3ヶ月ごとに通い続けていく必要があるため、途中で店舗を変えることができる脱毛サロンを選ぶことが先々のことを考えても重要なポイントです。

おすすめサイト⇒てんねきシースリー熊谷店たけれ

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

Programando un juego con Arduino (Curso)

Lo bueno de poder tomarse unas semanas de vacaciones en verano es que tenemos la oportunidad de emplear nuestro tiempo en aquello que más nos gusta. En mi caso, cacharrear y buscar tutoriales para dar forma a mis proyectos. Youtube ofrece una excelente plataforma para encontrar contenido de calidad y no hace falta recurrir a grandes canales. Por ejemplo, esta semana descubrí el pequeño canal de  Guillermo Sampallo donde nos explica un poco de todo, acorde a sus intereses que van desde la programación, Arduino, Raspberry hasta la carpintería.

Desde hace unas semanas en su canal podemos encontrar un interesante curso en donde nos muestra las capacidades de Arduino para programar nuestro propio videojuego al más puro estilo de los juegos arcade retro de los 80.  Lo cierto es que lo que estoy viendo y aprendiendo me anima a volver a retomar viejos proyectos. Arduino es una plataforma opensource que nos permite dar vida a nuestras ideas con unas nociones básicas de programación invirtiendo muy poco y con unos resultados asombrosos.

Bueno, no me enrollo más. Aquí comparto el curso esperando que os resulte interesante.

Lunes 16 de julio de 2018

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

Cómo exprimir al máximo el Amazon Prime Day sin poner en riesgo tu seguridad

Hoy y mañana Amazon celebra su esperado Amazon Prime Day; una iniciativa que permitirá a los adeptos de esta plataforma beneficiarse de descuentos durante 36 horas y que, como el Blue Monday y el Black Friday, disparará las ventas de la entidad -a pesar de la huelga convocada en el centro logístico de San Fernando de Henares-. Y es que, según los datos de Acierto.comson cada vez más los usuarios que compran a través de Internet -17 millones de personas, según sus cálculos, un 56% de las cuales lo hace mediante su smartphone-. En concreto y solo en un año, el comercio online se ha incrementado más de un 25%. De hecho este negocio mueve más de 30.000 millones de euros. ¿La principal razón? Lo sencillo y cómodo que resulta comprar desde casa y los descuentos.

En todo caso, no es oro todo lo que reluce, sino que a este crecimiento comercial también le han seguido otras acciones fraudulentas. Nos estamos refiriendo a los timos online, estafas y ciberataques en general. De hecho, estos últimos han crecido un 140% en estos dos últimos años. Además, las estafas son cada vez más sofisticadas, y las víctimas también están cambiando -las pymes se encuentran en el punto de mira de estos delincuentes-. Sin embargo, tanto consumidores como ecommerce pueden protegerse poniendo en marcha una serie de pautas básicas.

Compra online con seguridad: sí, se puede

– Lo primero que tendrás que comprobar antes de realizar cualquier compra online es que tus dispositivos se encuentran correctamente actualizados. Estas updates se lanzan con el fin de parchear errores y mejorar características de la versión anterior. También sería interesante que te hicieras con un antivirus y antispyware. Y si puedes usar cortafuegos, mejor.

– Recuerda que la conexión a través de la que hagas la compra debería ser segura. A efectos prácticos esto quiere decir que no conviene que te conectes a través de la biblioteca, en una cafetería, u otras WiFis públicas. Sí, aunque sea muy tentador ahorrar en tu tarifa de datos. La razón es que tus datos pueden ser interceptados de forma relativamente sencilla.

– Establece claves seguras y no dejes que el sistema las guarde. Si no tienes buena memoria, usa un gestor de contraseñas. Por desgracia, y tal y como apuntan los datos de Acierto, el 90% de los usuarios desconocen cómo crear una contraseña segura, y hasta 4 de cada 10 han tenido dificultades para restaurarla. Algo que les ha acabado pasando factura: más de la mitad de los españoles se han visto afectados por un virus informático. Lo peor es que solo el 8% es consciente de su ignorancia.

– Dejando a un lado las acciones que nos atañen a nosotros mismos, lo primero será comprobar a quién se está comprando. Y es que en Amazon encontramos numerosos vendedores externos. Aquí las reviews nos ayudarán. Fíjate en si tienen fotos de producto, si son todas demasiado buenas o poco realistas, si cuenta con cierto prestigio y tiempo en la plataforma, etcétera. Acude a foros especializados en caso de duda.

– Otro punto interesante es comprobar la url de la página, sobre todo si, por ejemplo, hemos accedido a la web a través de un correo electrónico con jugosos descuentos. Y es que las suplantaciones de identidad se encuentran a la orden del día. Algunos rasgos que pueden ayudarte a identificarlas son los logos antiguos, una letra cambiada de sitio, etcétera. El site debería contar con el protocolo de seguridad HttpS, si existe información sobre él online, etcétera. Los mensajes masivos con chollos difundidos a través del WhatsApp son otro medio frecuente de difusión de esta clase de estafas. Para comprobarlo un método sencillo radica en introducir el nombre de la promoción o acudir al sitio oficial.

– Revisa siempre las políticas de devoluciones, reembolsos y entrega de los vendedores, especialmente ahora, en plena huelga. Principalmente qué ocurre en caso de incumplimiento. 

– Si hablamos de suplantaciones, otro correo frecuente es el que simula el seguimiento de un pedido e incluye un archivo adjunto sembrado de malware. Algunos delincuentes incluso llegan a solicitar los datos de la tarjeta en estos mails.

– Otras recomendaciones más allá de Amazon tienen que ver, por ejemplo, con las apps. Si compras a través de alguna de ellas, vigila que te has descargado la oficial (y siempre bájala desde las tiendas oficiales), que no requiere de permisos sospechosos, etcétera.

– Los medios de pago también pueden ser indicativos: si puedes, opera a través de plataformas tipo PayPal o similares, y desconfía de las transferencias y similares. Lo mejor, en todo caso, es que te hagas una cuenta únicamente para transacciones online y que revises los movimientos con regularidad para evitar sorpresas.

– Y si las ofertas te chirrían o piensas que no son tan jugosas como parecen, instala una extensión tipo Keepa o Camelcamelcamel que te permita monitorizar el historial de precios de un producto en la plataforma. Incluso es recomendable que compares en Google Shopping para cerciorarte antes de hacer la compra.

¿Qué pasa si compran con tu tarjeta?

 

Si ya es demasiado tarde y han, por ejemplo, comprado con nuestra tarjeta, también podemos ponerle remedio. En primer lugar informaremos al banco para que la bloquee o lo haremos nosotros mismos. Algunas entidades se responsabilizan de este tipo de delitos, aunque con ciertos límites temporales o de cantidad.

Lo primero será informar al banco de los cargos fraudulentos que hayamos detectado para que la bloquee. Es posible que podamos hacerlo nosotros mismos online, incluso de forma temporal.
La Visa Barclaycard, la Visa oro ING Direct y la Tarjeta bancopopular-e son algunas. “
Ciertos seguros de hogar, también se hacen cargo, incluso si el fraude se ha producido porque nos han robado la mochila del asiento del coche, por ejemplo”, explica Carlos Brüggemann, cofundador del comparador de seguros Acierto.com.

¿Cómo protejo mi ecommerce?

Y los comercios online, ¿cómo pueden protegerse estas empresas? “De la misma forma que los negocios tradicionales son conscientes de la importancia de contar con un seguro que se responsabilice de cualquier percanceson cada vez más las empresas online que contratan ciberseguros”, explica Brüggemann. España es el país con mayor porcentaje de contratación de pólizas de este tipo. En concreto, 1 de cada 3 entidades tienen uno.

Y es que se encuentran expuestas a riesgos como la triangulación nociva, phishing, account takeover, el robo de identidad, los fraudes “amistosos”, el reshipping, etcétera. Este seguro suele cubrir la responsabilidad civil por daños a terceros, gastos de reparación y restauración de datos borrados, cobertura contra reclamaciones por violar los derechos de propiedad intelectual, responsabilidad por pérdida de datos personales o riesgos de privacidad, defensa jurídica, protección frente a reclamaciones por malware, cobertura por pérdida de ingresos fruto de un ataque informático o vulneración de seguridad, cobertura de fraudes cibernéticos y asistencia técnica.

Domingo 15 de julio de 2018

Usar AVA para tests en una API hecha en Node.js y Express

Testear nuestras aplicaciones es algo fundamental si queremos garantizar un mínimo de calidad. En este breve post, explicaré como he usado AVA para crear tests para mis APIs: tanto unitarios como de integración con AVA.

AVA es una herramienta de testing, que nos permite describir los tests de forma muy sencilla. De todas las herramientas que he probado, AVA es muy preferida. Es muy sencilla, ejecuta los tests en paralelo y permite escribir código en ES6 (usa Babel por debajo). Además tiene bastante soporte siendo el framework de testing usando por muchos proyectos ya.

Instalamos AVA de la forma típica:

npm install ava --save-dev

A continuación creamos un fichero cuya terminación sea .test.js, por ejemplo, suma.test.js. El lugar da igual.

Una opción de diseño es poner los test unitarios al lado de las funciones en sí, otra opción es crear una carpeta para todos los tests, ya que los de integración van a ir casi siempre ahí. Para ejecutar los tests, simplemente:

ava

El interior de suma.test.js debe importar la función test de AVA y las funciones que quiera probar.

Los tests se definen como una llamada a la función test con la descripción del test y a continuación un callback (asíncrono si queremos) con el objeto que controla los tests (llamado t normalmente). Veamos un ejemplo simple:

import test from "ava";
import {suma} from "./operaciones";

test("Suma",t => {
    t.is(suma(1,2),3);
});

El objeto t soporta múltiples operaciones, siendo is la más básica. Is pide que sus dos argumentos sean iguales entre sí, como Assert.Equal de xUnit.

Veamos que más soporta Ava.

  • t.pass(): Continúa el test (sigue)
  • t.fail(): Falla el test (no sigue)
  • t.truthy(val): Continúa el test si val es verdaderoso (usando la lógica de JavaScript) o falla el test
  • t.true(val): Continúa el test si val es verdadero (más estricto que el anterior) o falla.
  • t.is(val1,val2): Continúa el test si val1 y val2 son iguales (superficialmente) o falla.
  • t.deepEqual(val1,val2): Continúa el test si val1 y val2 son iguales (profundamente) o falla.
  • t.throws(funcion): Ejecuta la función especificada esperando que lance una excepción. Si no lo hace, falla el test. Se puede especificar el tipo de excepción que esperamos en el segundo argumento.
  • t.notThrows(funcion): Exactamente lo contrario que la anterior.

Y algunas más, pero estas son las esenciales.

import test from "ava";

function sum(a,b){
    return a+b;
}

function login(username,password){
    if(username === null || password === null){
        throw new Error("Missing username or password");
    }
}

test("Test example: Sum",t => {
    t.is(sum(1,2),3);
});

test("Login fail username null", t => {
    t.throws(()=>{
        login(null,"123456");
    });
});
test("Login fail password null", t => {
    t.throws(()=>{
        login("username",null);
    });
});

También podemos definir funciones que se ejecuten antes y después de nuestros tests, y una sola vez o con cada test. Podemos usar test.before, test.beforeEach, test.after y test.afterEach en vez de test. Por ejemplo, si tienes una base de datos que necesita inicialización, puedes definir ese código en test.before y la limpieza en test.after.

import test from "ava";
import db from "../db";

test.before(async () => {
    // Iniciar el ORM Sequelize
    await db.sync();
});

 

Con esto ya podemos hacer tests unitarios, pero no podemos probar la aplicación web al 100%. Entra en acción supertest que nos permitirá tener un servidor Express simulado para que los tests puedan probar la aplicación al completo.

Supertest

Instalamos supertest

npm install supertest --save-dev

En el fichero de test necesitamos crear un objeto de tipo aplicación de Express. Este objeto puede ser el mismo que usas en tu aplicación real o ser una versión simplificada con lo que quieras probar.

import test from "ava";
import request from "supertest";
import auth from "http-auth";
import express from "express";

function setup(){
    const app = express();

    let basic = auth.basic({
        realm: "Upload Password"
    }, function (username, password, callback) {
        callback(username === "admin" && password === "123456");
    });

    app.get("/upload",auth.connect(basic),function(req,res){
        res.sendFile("upload.html");       
    });
    return app;
}

test("Página upload requiere autenticación HTTP Basic", async t => {
    let res = await request(setup())
        .get("/upload")
        .send();
    t.is(res.status,401);
    t.true(res.header["www-authenticate"] !== undefined);
});

Aquí la función de test es asíncrona, AVA es compatible con ambos tipos. Supertest es muy completo y permite probar APIs enteras con su sencilla interfaz que junto con AVA, se convierte en algo casi obligatorio para una aplicación que vaya a producción.

La entrada Usar AVA para tests en una API hecha en Node.js y Express se publicó primero en Adrianistán.

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Mi Libro de programación en C ahora es gratuito

A partir de hoy, 16 de Julio de 2018, mi libro de programación en C para principiantes estará disponible de manera gratuita. Hace ya tiempo que lo escribí y considero que ya he ganado lo suficiente con él. Así que he decidido regalarlo.

Por ahora estará disponible gratuitamente en Amazon. Como Amazon no me deja ponerlo a precio cero hasta septiembre lo voy a deshabilitar y crearé uno nuevo esta vez gratuito y sin drm (esa cosa que no te deja copiarlo ni nada).

Ahora voy a maquetarlo de nuevo en formato PDF y, posiblemente en epub o algo así. Cuando termine lo pondré disponible gratuitamente para descarga en el Rincón del C.

Si quieres me puedes echar una mano maquetando el libro. Voy a ir poniendo el código fuente del libro disponible en GitHub para que todo el mundo pueda colaborar.

Si lo ves a la venta en algún sitio avísame, que se trata de un timo.

Sábado 14 de julio de 2018

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Las dificultades de conectarse a AWS desde un terminal Linux

Conectarme a una máquina (instancia) con AWS sieeeempre me da algún problema. Así que voy a publicar la lista de dificultades habituales con los que me suelo encontrar y cómo resolverlas.

Ten en cuenta que mi método de conexión es a través de un terminal Linux.

Esta no es una guía paso a paso, para eso, los de Amazon AWS ya tienen su propia guía. Este post es para resolver los problemas que yo me suelo encontrar.

El comando que uso para comentarte es algo así:

ssh ubuntu@ec2-35-156-22-215.eu-west-4.compute.amazonaws.com -i mi-clave-privada-aws.pem

Nota: no copies y peques esto porque no te funciona seguro (de hecho la IP es ficticia).

Too many authentication failures

En mi caso suele ser por esta razón:

Yo tengo una carpeta .ssh donde tengo un montón de llaves ssh. Al intentar conectarse, ssh va probando todas esas llaves. Supongo que después de todas probará con mi-clave-privada-aws.pem. Como tengo tantas claves privadas se alcanza el número máximo de intentos de conexión (que no se cuántos intentos son ni me he molestado en cambiarlo).

El problema es que la opción -i de ssh que te recomienda AWS no hace que se use esa llave en lugar de las que ya tienes. En lugar de eso usa todas las que tienes en la carpeta .ssh y, además, la que indiques con la opción -i.

Solución:

Añade la opción:

-o "IdentitiesOnly=yes"

Con lo que te quedaría algo como ésto:

ssh ubuntu@ec2-35-156-22-215.eu-west-4.compute.amazonaws.com -i mi-clave-privada-aws.pem -o "IdentitiesOnly=yes"

Permission denied (publickey)

Esto puede ser por varias razones:

1) Te has equivocada con el nombre de usuario. Cada tipo de instancia suele venir con un usuario por defecto. En su guía han puesto una lista (echa un vistazo a la lista de AWS que puede cambiar):

  • Para Amazon Linux 2 or the Amazon Linux AMI -> ec2-user.
  • Para Centos AMI, -> centos.
  • Para Debian AMI, -> admin o root.
  • Para Fedora AMI,-> ec2-user o fedora.
  • Para RHEL AMI, -> ec2-user o root.
  • Para SUSE AMI, -> ec2-user o root.
  • Para Ubuntu AMI, -> ubuntu.

2) Te has olvidado de indicar tu llave privada (el fichero .pem). Sí, a veces pasa.

Connection timed out (el servidor tarda un montón de tiempo en contestar)

Aquí es posible que sea porque te falte alguna regla “inbound” (de tráfico de entrada) en la configuración de la instancia. Si es así sigue las instrucciones para crear una regla de éstas.

También es posible que te estés conectando desde una IP no indicada en ninguna de las reglas de tráfico de entrada. Puedes añadir tu IP a una regla o puedes usar la IP 0.0.0.0/0 (para IPv4) o ::/0 (para IPv6). Ten en cuenta que si usas estas dos se pueden intentar conexiones a la instancia desde cualquier IP.


Espero que te haya sido de utilidad y hayas podido solucionar el problema. Si es así añade un comentario y si no es así escribe a ver si podemos ayudarte entre todos.

 

Jueves 12 de julio de 2018

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

HeyPhone, cuando el Open Hardware salva vidas

Cómo el código abierto el concepto del Open Hardware es bastante interesante.  A grandes rasgos se basan en los mismos principios. La capacidad de poder consultar la información técnica de un determinado hardware y reproducir aquellas características que nos sean útiles de una manera mucho más práctica que la engorrosa marea de licencias  y derechos que de otro modo estaríamos obligados a cumplir.

Gracias al Open Hardware podemos por ejemplo disponer de muebles de diseño en cualquier lugar del mundo solo con descargarnos los planos, repuestos médicos o dispositivos que pueden ayudar a salvar vidas.

Esta semana viendo las noticias conocí el caso de los 12 estudiantes y su instructor atrapados en una cueva en Tailandia. Afortunadamente todos ellos fueron salvados con vida pero de lo que no se ha hablado mucho es cómo la ingeniería ayudó en el proceso.

 

HeyPhone es una radio diseñada por un radioaficionado británico llamado John Hey (G3TDZ), fallecido en 2016, que publicó su diseño y especificaciones con una licencia Open Source. Esta radio de comunicación utiliza la banda de baja frecuencia de 87 kHz y toda la documentación, esquemas e información para construir el dispositivo está disponible públicamente.

Sin entrar en detalles técnicos, este diseño permite comunicaciones a grandes distancias en condiciones extremas usando el propio suelo como antena gracias a un sistema de antenas dipolo.  No es lo último en tecnología ya que este principio es más viejo que “matusalem” y podemos olvidarnos de consultar nuestro perfil en Facebook para comunicarnos con el exterior pero sin duda ha resultado más que efectivo.

John Hey (G3TDZ) ya no está con nosotros pero gracias a su altruista aportación la historia de Tailandia, como seguramente muchas otras, ha tenido un final feliz.

Vía | Phil Karn en Facebook
Más información | HeyPhone

Qué es y cómo protegerse de Wellmess

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} span.s1 {font-kerning: none} Cuando hablamos de seguridad dentro de sistemas operativos, asumimos que Linux es el que más seguridad

Martes 10 de julio de 2018

La perlificación de Python

You know, FOX turned into a hardcore sex channel so gradually I didn’t even notice

Marge Simpson, Los Simpson

Recientemente ha salido Python 3.7, con interesantes novedades. También han salido los primeros artículos hablando de las novedades que podrá traer Python 3.8. Como muchos ya conoceréis, y si no es así explico, Python funciona a base de PEPs (Python Enhancement Proposal). Cualquier persona puede abrir un PEP, que es un documento que describe la funcionalidad que se quiere añadir/modificar/eliminar. Estas PEPs se discuten y finalmente Guido, creador de Python, las aprueba y se codifican.

Dentro de las PEP relacionadas con Python 3.8 hay algunas bastante controvertidas que han hecho saltar la voz de alarma. No ha faltado gente que ha opinado que cada vez Python se parece más a Perl. Este proceso habría empezado con Python 3 pero se habría ido haciendo más evidente hasta llegar a hoy. Cada vez con más sintaxis poco utilizada, con más elementos, más cómodo de escribir para el experimentado aunque menos legible si no dominas el lenguaje.

Y resulta curioso, porque Python es en parte una respuesta a la excesiva complejidad que podían tener los programas hechos en Perl. Su popularidad se debe a que es fácil de aprender y eso parece que ya no está tan claro.

Con la introducción de operadores como := o ?? o anotaciones como @dataclass se va, en cierta medida, perdiendo el espíritu original de Python. Y es cierto que otros lenguajes tienen algo similar, pero precisamente Python había sido muy selecto en incluir un conjunto bastante reducido de características, que todo el mundo pudiese dominar. Al final se sacrifica legibilidad y facilidad de aprendizaje por una ergonomía que beneficia a unos pocos en unos casos concretos.

Lenguajes de programación barrocos

Universidad de Valladolid, ejemplo de barroco civil. Foto: https://artevalladolid.blogspot.com

Python lleva un tiempo entrando en un proceso de perlificación pero en mi opinión no es el único lenguaje que ha entrado en una espiral parecida. Cada vez más lenguajes han pasado del renacimiento, donde se buscaba la consistencia, la simetría, la sencillez sin perder la funcionalidad, hacia el barroco, donde los lenguajes son más recargados, con más elementos sintácticos, que cubren mejor casos concretos, pero que de por sí no son tan esenciales, no cambian aspectos fundamentales del lenguaje y normalmente introducen diversas formas de hacer algo en un mismo lenguaje.

Veamos más ejemplos: en C++20 se propuso añadir funcionalidad de dibujado 2D a la librería estándar (propuesta que fue rechazada en una historia bastante larga para este post) y se han propuesto conceptos, módulos, comparación de tres vías, reflexión, metaclases,… En C# 8.0 se han propuesto también bastantes cosas como records, tipos non-nullable, interfaces con métodos ya implementados (traits) y rangos. Y eso sin contar con las características que estos dos lenguajes ya tienen, que son bastante más extensos que Python.

Retablo lateral de la Iglesia de San Miguel y San Julián (Valladolid). Barroco puro. Foto: https://commons.wikimedia.org/wiki/File:San_Miguel_-_retablo_relicario.jpg

Hay un horror vacui, horror al vacío, a funcionalidades. Siempre se añade y casi nunca se elimina. ¿Pero es realmente necesario? Es evidente que durante mucho tiempo, los lenguajes evolucionaban de forma muy lenta y muchos de los cambios que han hecho eran necesarios. Desde hace unos años, se ha aumentado la velocidad de los cambios, pero esto no puede seguir así eternamente, porque el ritmo que llevan muchas veces es superior al de los avances en lenguajes de programación y la retrocompatibilidad impide ir quitando cosas al mismo ritmo que se añaden. De este modo, todos los lenguajes que entran en esta espiral crecen y crecen. No se llegan a pulir, simplemente crecen.

La perfección no se alcanza cuando no hay nada más que añadir, sino cuando no hay nada más que quitar

Antoine de SaintExupéry

Uno podría comparar esto con lenguajes naturales, como el español o el inglés. En estos idiomas, pese a existir reglas, existen numerosas excepciones. Es posible que lenguajes como Python se estén viendo influenciados por las mismas mecánicas humanas que rigen los lenguajes naturales y que han hecho que existan excepciones. Tendría bastante sentido que ocurriese así. Pero personalmente, me gustaría que aprender Python no costase tanto como aprender alemán o francés.

Los procesos comunitarios

Para mí, gran parte de esta sobrecarga viene dada por los procesos comunitarios. En un proceso comunitario como PEP, comité de C++ o similares es mucho más fácil añadir que eliminar. En C++ la situación ha llegado a un punto en el que Bjarne Stroustrup, creador de C++, ha pedido que se relajen con las propuestas en Remember the Vasa!, en honor a un bonito barco sueco que se hundió por exceso de carga. No tanto por su peso, sino por su disposición y las reformas que hubo que hacer para que todo encajase.

El Vasa fue recuperado después de su naufragio y se expone en Estocolmo. Foto: https://rachelannsblog.wordpress.com/2016/08/03/set-sail-set-at-the-bottom-of-the-sea/

Es por ello que las personas encargadas de elegir que se añade al lenguaje o no deben de ser muy conscientes de lo que supone, ya que una vez se introduzca, va a ser casi imposible eliminarlo.

No estoy en contra de añadir nuevas características (¡al contrario!) pero se debe respetar la visión de conjunto del lenguaje, que todo cuadre y esté cohesionado. No siempre tener más es mejor.

¿Te ha gustado el artículo?

Si es así, puedes ayudar al blog. Dentro de unos días es el Amazon Prime Day. Como muchos de vosotros seguro que os compraréis algo, no quiero dejar la oportunidad de deciros que este blog tiene enlace de referidos y que por cada cosa que compréis con el enlace, me llevo una pequeña parte (a vosotros no os va a costar más caro).

Enlace Amazon.es

Será muy bien recibido

 

La entrada La perlificación de Python se publicó primero en Adrianistán.

Lunes 09 de julio de 2018

Instala Deepin en tu distribución de Linux.

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} span.s1 {font-kerning: none} Aún hoy en día, son muchos los usuarios que cuando piensan en Linux creen que es un sistema operativo

Domingo 08 de julio de 2018

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: Ver usuarios conectados

Existen varias formas para ver los usuarios conectados a un equipo Linux. En este post, veremos algunas de ellas.  Haremos uso de los comandos: w, who, users, last, finger, lastlog Linux: Ver usuarios conectados: Comando w Con el comando w, podemos ver los usuarios conectados. El comando w, interpreta la información del fichero:  /var/run/utmp En la salida del comando, podemos

ストレスは不妊と切っても切り離せない問題

ストレスは不妊と切っても切り離せない問題です。体内のホルモンバランスを崩すだけでなく、ストレスは不妊につながる冷えや血行不順、排卵障害などを招きます。妊娠を望む家族の声や、過度な緊張感が不妊治療に通ううちに高じてくるというケースもしばしば見られ、ますます追い詰められるという繰り返しも、ないわけではありません。神経質にならないよう周囲や本人が気分転換することが、大切です。

ブランド品買い取りの際に、業者が商品につける買取価格というのは、価格が動く理由は色々あるものの、まず新しい物か古い物かで、はっきり高低が出ます。使った形跡が見あたらないような新品の方が、高い値段がつくというのはまったく普通のことで、逆はほぼ皆無と考えてください。使い込まれた感じが少しくらいあったとしても極端に古いものでない限りは、買い取ってもらえることが多いのですが、新品同様とはいかなくても、できる限りこざっぱりきれいにしておく必要があるでしょう。最低限、見える範囲の汚れを拭いておく位しておき、靴や鞄でしたら中のほこりも除去し、多少なりとも高めの査定額がつくよう少しの努力をしておくと良いですね。
インプラントという治療法を聞いたことのある方も多いでしょう。これは、歯の土台となるアゴの骨に穴をあけ、金属製の人工歯根を埋め込み、そして専用のパーツを用いて義歯を固定するという手術です。旧来の入れ歯と比べた場合、審美性は高く、また食べ物の咀嚼も自然に行うことができます。この治療法には、歯科医は勿論のこと、インプラントのパーツを作る歯科技工士の極めて高い医療スキルが物を言うといわれています。患者さん一人一人の口腔内の状況に合わせた高度な施術で、勿論それだけ治療費は高額になりますが、効果もまた高いと言えます。

あまり評判の良くない探偵業者にひっかかってしまうと、大事なお金を棄てるようなことになりかねません。相談に行っただけなのに事務所に足止めし、碌な説明もなしに契約を促したりする業者は用心してかかるべきです。断ったり、返事を保留にして帰ったあとで、再三にわたり電話をかけてくるのは、悪質な業者だと思ったほうが良いでしょう。まともな探偵社や興信所であれば、人を不安にさせるようなことはしないはずです。
体の複数の場所を脱毛したいと思う人たちの中には、複数の脱毛エステで処理してもらっている人がよく見られます。一箇所のエステですべて脱毛するよりも、少ない金額で済ませられることが多いためです。それでも、掛け持ちの面倒くささは無視できませんし、お金の節約になると限ったわけでもありません。費用を計算し、施術の結果をきちんと比べて、失敗のない掛け持ちを目指しましょう。どの脱毛サロンでもカウンセリングでお願いしていることですが、予約日に脱毛サロンに行く前にムダ毛を自己処理で剃っておくのがお約束になっています。ムダ毛の伸びた状態で施術すると論理的に光脱毛の効果が得られないからです。電気シェーバーの使用が事前処理には向いているので、安い普及品で黒いポチポチが残る程度でも全然構わないです。剃刀は駄目なのかと聞かれることもありますが、もし傷をつけたり肌の表面を傷めると施術ができない場合もあるので気をつけてください。
着なくなった着物を買い取ってほしいけれど自分が持っている着物が、いくらで売れるのかわからなくて不安。そう思うのもわかります。振袖、訪問着、付け下げなど着物には多くの種類があります。また素材や技法によって価値が変わるので、着物鑑定のプロでないと、買取価格は見当がつきません。ただし、もし有名作家の作品だったり、有名ブランドの着物だったりするなら、結構な値段で売れることも珍しくありません。あまり古くなっていないブランド着物なら昔の着物に比べると裄丈が長く、大柄な人でも着られるので仕入れておけばすぐに売れるからです。

つい最近、祖母の形見だった着物を専門の業者の査定を受け、買い取っていただきました。今後、私たちが着物を着る機会は少なく私がこのまま保管しておくのも祖母の本意ではないでしょうし、次に着てくれる人に譲りたいと思うからです。念には念を入れて、何軒かのお店に持って行きました。一点で高値がつくようなものはなく、全部まとめてこの値段と、どこでも言われました。最終的に、条件もよく、満足できる価格をつけた業者に引き取ってもらいました。
車査定は中古車市場での流行りや人気にかなり影響されるので、評判の良い車であればあるほど高値で売ることが出来ます。なおかつ、プラスの部分をどんどん点数を加えていく査定の方法を取っていることも多く、高く売ることができる確率が高いです。こうしたことから、下取りよりも車査定業者での売却を検討したほうが良いといえます。
誰もがスマホをもつ昨今、車の査定もスマホから手続きを行なうことができるのです。パソコンを起動させなくてもネット上にあるオンライン一括査定のサービスを使えるということですから、大変便利ですね。ちょっとでも高く買い取ってくれる理想の買取業者を探すため、おすすめは一社単独に査定を頼まずにいくつかの会社で査定を受けてみることです。車査定用の優れたアプリもたくさんありますので、それらを利用してもっとスピーディに業者が見つかるようになるかもしれません。購入はこちら⇒みんずりシースリー津田沼店たい

Jueves 05 de julio de 2018

Mayúsculas iniciales en WordPress

Ciertamente si tenemos un sitio propio, con dominio propio y acceso como administrador a sus «entrañas» podremos crear nuestros propios estilos CSS y con ellos construir cualquier formato que queramos en nuestras páginas. Pero eso solo si «tenemos el poder» (y queremos utilizarlo). Ahora bien, esto no quiere decir que no podamos hacer «cosas extrañas» … Sigue leyendo Mayúsculas iniciales en WordPress

Miércoles 04 de julio de 2018

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Píldora: Utilizar arrays con nombre dinámico en Bash

Arrays con nombre dinámico en Bash

Una de las grandes ventajas de los lenguajes interpretados es que podemos almacenar en una variable el nombre de otra variable y trabajar con su valor. ¿Punteros? Bueno, al final es parecido a la utilización de punteros en C, aunque aquí podemos hacer referencia por el mismo nombre de la variable incluso, previo filtrado y con mucho cuidado, preguntarle al usuario el de la variable para trabajar con ella.

Esto nos puede dar mucha flexibilidad en nuestro código. Por ejemplo, yo lo he utilizado para perfeccionar mi script de lectura de ficheros de configuración al que le podemos pasar también el nombre de la variable donde almacenar la configuración.

Arrays con nombre dinámico

En Bash, acceder a una variable cuyo nombre está contenido dentro de otra variable es sencillo, podemos hacerlo llamando a ${!NOMBREDEVARIABLE}. Podemos ver un ejemplo en el post referenciado.
El problema es que cuando son arrays no es tan inmediato. El objetivo es que, teniendo una variable que contiene el nombre del array podamos acceder a su información de una forma sencilla. Y El problema aquí viene en la versión de Bash que estemos utilizando. En este caso debemos hacerlo de una forma u otra dependiendo de si utilizamos una versión inferior a la 4.3 (más o menos salió en 2014) o si tenemos una versión posterior.

Ejemplo para Bash < 4.3

Lo siento, mira que no me gusta utilizar eval, pero claro, para estas versiones del intérprete necesitamos crear una cadena de caracteres con la llamada que vamos a hacer y luego evaluar dicha cadena de caracteres. Esto nos dará el valor que buscamos. Por ejemplo:

1
2
3
4
5
6
MIARRAY=("cero" "uno" "dos" "tres")
REFERENCIA="MIARRAY"

# Lo que necesitamos es acceder a cada uno de los elementos de MIARRAY a través de REFERENCIA.

eval echo \${$REFERENCIA[2]}

Si os fijáis, al construir la cadena. El primer símbolo de dólar ($) lo escapamos con la barra para que no se interprete. El que sí tiene que interpretar es el segundo, para que $REFERENCIA se transforme en el nombre del array.

Lo podemos hacer con arrays asociativos también sin problema, pero es algo complicado y realizamos demasiadas tareas para hacer referencia a una variable. Además no queda muy elegante o intuitivo tener que escapar un dólar y otro no.

Ejemplo para Bash >= 4.3

Para estas versiones, disponemos de un modificador en la orden declare (también llamada typeset) a través del cual podemos crear una variable de referencia que se comportará exactamente igual que nuestro array:

1
2
3
4
MIARRAY=("cero" "uno" "dos" "tres")
declare -n REFERENCIA="MIARRAY"

echo ${REFERENCIA[2]}

Además, de esta forma, el nombre de la variable puede venir dado en otra variable, con lo que podemos permitir que el usuario especifique el nombre de variable. Eso sí, con mucho cuidado.

Foto principal: unsplash-logoRuben Ortega

The post Píldora: Utilizar arrays con nombre dinámico en Bash appeared first on Poesía Binaria.

BlogDRAKE: Soporte para dnf en Repositorios de BlogDrake

Jueves 28 de junio de 2018

“El paciente” a descompilar es un exe de msdos en formato MZ

Posts in this series
  1. Compilar C en m$dos en nuestros tiempos
  2. "El paciente" a descompilar es un exe de msdos en formato MZ

Aunque voy despacio, voy a ir poniendo mis avances, que supongo que es poquito, pero bueno por seguir la Método de depuración del patito de goma o el refrán oriental que dice “El que enseña aprende dos veces.” .

La verdad es que en los primeros palos de ciego y análisis creí que “el paciente” era un ejecutable de tipo COM o algo así, pero ahora volviendo a analizarlo he encontrado el famoso:

MZ

0x4D 0x5A

Eso ayuda un montón porque si queridos mios, los ejecutables también tienen formato y no es estándar, hay muchos muchos estándares (en m$-dos hablamos…en otros sistemas operativos…pues habrá los suyos).

Como dice en el foro de ubuntu: Learning how to disassemble dos binaries

If actual DOS executables disassembly is the thing you are searching for, then search for disassemblers, that can handle the MZ magic [$4D 5A] (the default DOS 16bit header) or elf, coff, xcoff, ecoff, mach and such …

Bueno pues ahora entender la estructura de fichero de el formato DOS MZ .

Si alguno tiene alguna pista, estaré agradecido.

KDE-Plasma: Agregar una plantilla al menú «Crear nuevo»

Cuando hacemos clic derecho en Dolphin, tenemos la opción «Crear nuevo» lo que nos permite crear una carpeta, un archivo de texto, enlace a aplicación, etcétera. Hoy veremos cómo agregar una nueva entrada a ese menú. Usaré como ejemplo el crear un documento Writer con una plantilla definida por nosotros. Primero, claramente, tenemos que crear … Sigue leyendo KDE-Plasma: Agregar una plantilla al menú «Crear nuevo»

Videojuegos libres que se han ido de github después de ser fagocitada por Microsoft

Después de la mala noticia (gracias capitalismo) de el canibalismo salvaje de Micro$oft comiendose a github. Ya hablamos por los tomates de eso en Github ha muerto…bueno lo han asesinado.

Muchos proyectos de software libre han migrado a otras forjas/repositorios de software, y de entre estos tenemos los videojuegos libres…junto con respirar, una de las cosas que mas me ocupa la cabeza…me gustaría algún día intentar conseguir vivir de hacer videojuegos libres…pero bueno…

Bueno pues conocidos por mi, he encontrado los siguientes videojuego libres que se han ido de github:

Solarus, un clon libre del Zelda de SNES/GBA/GB con editor de mapas y todo en plan RPGmaker. Solarus has moved to Gitlab

Y OpenMW que es un clon libre del videojuego de rol en 3D Morrowin. OpenMW code, bug tracker, and wiki are now on GitLab!

Y seguro que hay mas. Amable lector…¿Conoces algún otro videojuego libre que se haya pirado de github?

Domingo 24 de junio de 2018

Compilar C en m$dos en nuestros tiempos

Posts in this series
  1. Compilar C en m$dos en nuestros tiempos
  2. "El paciente" a descompilar es un exe de msdos en formato MZ

La verdad es que para escalar una montaña, primero hay que tener la montaña.

Mi montaña es descompilar un videojuego (de momento uno)  y liberarlo, pese a la polémica que hay con esta forma de liberar videojuegos como podéis leer en: Devilution – Decompiled Diablo 1 en el subreddit de videojuegos libres.

El juego en cuestión, ya os lo contare si lo consigo, pero como ya he empezado con los problemas, he querido ir paso a paso, y me he buscado un montecito, descompilar un C de un hola mundo.

Todo este gusanillo viene los articulos del Fanta: mierda.tv (cosas de dosbox que no tiene tags y hay que tirar de busqueda).

A ver, quiero ser perro mordedor y poco ladrador, por eso no voy a ponerme grandes metas y voy a ver hasta donde llego.

Y lo primero que hay que hacer es tener un m$-dos entre manos, como no me apetece llamar al tito Gates y decirle que me venda unos disquetes de su apestoso sistema operativo, he encontrado el viejo y querido dosbox  (no os asustéis con ese web de los dosmiles).

En casi todas las distribuciones de GNU/Linux viene en el repositorio de paquetes oficial por lo que no sera difícil instalarlo. Aunque cosa distinta es si queréis ver la matrix de m$-dos que hay que seguir el tutorial que hizo Fanta para poner el debug heavy.

Una vez instalado hay que descargar el djgpp, que es la versión del compilador libre por excelencia el Gcc para m$-dos, el proyecto tiene un formulario web para darte una lista de crípticos ficheros zip para tener el gcc funcionando según gustos personales, básicamente tienes que seleccionar:

  • compilar y ejecutar programas
  • C y ensamblador
  • Por frikeo el Rhide
  • Depurador gdb

Como podéis ver en la captura de pantalla:

 

Y tendrás de la descarga los siguientes ficheros zip con nombres bastante crípticos, pues tienes que descomprimirlos a una misma carpeta todos, en mi caso le puse el nombre tan original como djgpp y tendrás algo tal que así (donde todos las carpetas bin de cada zip estarán fusionadas y el resto de tipos de carpetas al igual con sus respectivos nombres):

Ahora como enganchamos el dosbox para que coja ese directorio en el path de ejecutables (si, por si no lo recordabais m$-dos tenia un invento parecido a los Unix), pues aunque se puede cambiar la configuración de dosbox para hacerlo, voy a enseñaros vía parámetros de la shell…porque así explico una parte el señor Fanta y seguir el hilo de su trabajo.

$ dosbox -c "keyb sp" -c "mount c: ." -c "C:" -c "set PATH=C:\DJGPP\BIN;%PATH%" -c "set DJGPP=c:/djgpp/djgpp.env"

Y después puedes probar cosas tan frikis como usar rhide para editar un fichero c con un hola mundo.

Recuerda, para sacar al ratón del dosbox es: ctrl + F10

Y aquí tenéis el holamundo en C para m$-dos:

En cuanto puedo os sigo mostrando los siguientes paso hasta escalar mi montaña personal.

Jueves 21 de junio de 2018

DAE-18: El texto ya está en su lugar (mayormente)

Bueno, parece que después de todo es posible que la edición 2018 de «domando al escritor» no se convierta en la edición 2019… El texto está, mayormente, «en su lugar». De hecho el índice ya ha llegado a las siete páginas. No hay aún diagramas ni capturas de pantalla, solo texto y dos tablas. Hay … Sigue leyendo DAE-18: El texto ya está en su lugar (mayormente)

Martes 19 de junio de 2018

Bruno Exposito

Bruno Exposito
The Linux Alchemist

Diferencia entre ruta relativa y absoluta

Para acceder a un fichero o carpeta (ya sea en Windows, Linux o Mac) utilizamos lo que se llama una ruta, una ruta es algo así como la dirección de una casa.

Hay dos tipos de rutas:
– Relativas
– Absolutas

La diferencia entre una ruta relativa y una absoluta radica en que la relativa depende del directorio en el que te encuentras actualmente, mientras que la absoluta no.

 

Pongamos un ejemplo, imagina que estás en un pueblo llamado Villa Bug, en la calle Null Pointer Exception N° 16 y quieres llegar a la calle Internal Error N° 32. Hay dos modos de llegar a esa dirección:

– Desde tu posición actual, girar la primera calle a la izquierda y luego a la derecha (ruta relativa). El problema de seguir estas indicaciones es que solo sirven si estás en la calle “Null Pointer Exception N° 16”, si estás en otra ya no llegarás a tu destino con las indicaciones recibidas.

– Ir a la entrada de Villa Bug (¡teletransportación!) y atravesar de manera ordenada la lista de calles hasta llegar a tu destino (ruta absoluta).

 

Volvamos a Linux. Suponiendo que estás en tu carpeta home (cd ~) y que quieres mostrar el contenido de un fichero txt, puedes usar:

cat Documentos/informe.txt (relativo)
cat /home/bruno/Documentos/informe.txt (absoluto)

 

¿Cuando usar uno u otro? Depende de lo que estés haciendo.

Por ejemplo, tengo un script que ejecuto usando un alias que está en el fichero ~/.bashrc y que uso para compilar varios proyectos con maven.

El script lo ejecuto desde la primera terminal que tenga a mano, independientemente del directorio en el que esté la terminal en ese momento.

En este caso el script usa la ruta absoluta hacia la carpeta con el código, pues no puedo confiar en estar en el directorio correcto.

 

Otro ejemplo, estoy desarrollando una web en HTML y quiero enlazar una imagen.

En este caso tengo que usar una ruta relativa, ¿por que? Porque si uso una absoluta solo va a funcionar en mi ordenador, si le paso el código a otra persona la imagen no se verá a menos que tenga la imagen exactamente el mismo sitio.

Dentro del directorio hay una carpeta llamada imgs y dentro la foto. Es correcto.
<img src”imgs/foto.jpg” alt=”foto”>

En el directorio padre del actual (../) hay una carpeta llamada imágenes y dentro la foto. Correcto también.
<img src”../imagenes/foto.jpg” alt=”foto”>

En mi carpeta imgs que esta en mi home tengo la foto. Incorrecto.
<img src”/home/bruno/imgs/foto.jpg” alt=”foto”>

Yo me voy por mi izquierda…

Lunes 11 de junio de 2018

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Programación de tareas en segundo plano para nuestras aplicaciones web (Introducción. Parte 1 de 3)

Tareas programadas en segundo plano

Las aplicaciones web se van complicando cada vez más. Es un hecho y es algo bueno. Los ordenadores tienen más potencia, y los creadores cada vez más opciones e imaginación para destacar sobre la competencia. Una práctica interesante es la posibilidad de realizar tareas en segundo plano o en un momento concreto del tiempo sin que exista una mediación por parte del usuario.

Tenemos varias posibilidades y en estos posts vamos a centrarnos en cada una de ellas. Por otro lado, aunque este post es más general e independiente del lenguaje, quiero centrarme en PHP. Por un lado, es un lenguaje con el que he trabajado mucho, por otro, aunque es posible que diferentes partes de un proyecto estén realizadas en diferentes lenguajes, y PHP no sea un lenguaje pensado a priori para esto, en ocasiones, es más fácil y barato para una empresa pequeña recolocar a alguien en otro módulo de la apliación si todo está desarrollado en el mismo lenguaje. Como quiero hacer este post más o menos completo y relatar mi experiencia en cada uno de los puntos, se me ha alargado mucho, por eso he decidido dividirlo en tres partes, incluso puede que algún ejemplo dé para una cuarta.

¿Qué podemos hacer con estas tareas?

Bueno, ¿para qué vale todo esto? Es cierto que una web que tenga sus usuarios, envíe correos y sirva cierta información al usuario no tiene por qué ejecutar nada en segundo plano. Todo se servirá y se realizará al ritmo que los usuarios lo pidan. Eso está bien, en principio. Pero claro, imaginad que la web empieza a ganar visitantes. Lo primero que puede darnos problema es el envío de correo.

Puede que si se registran 10 usuarios por hora no pase nada pero, ¿10 usuarios por segundo? A los que debemos enviar confirmaciones de registro (no son muchos), pero luego enviaremos alertas para ciertos eventos, recordatorios de contraseña, avisos de que están intentando entrar con esa cuenta de correo… en definitiva, nuestra aplicación deberá establecer varias conexiones por segundo con el sistema de correo, sistema que muchas veces es externo y seguro que se cabrea (y nos expulsa por establecer tantas conexiones). Seguro que estaría bien coger cada 10, 15 o 20 segundos, y ejecutar una tarea que envíe todos los mensajes que tenga pendiente, lo que se llama un spool de correo, incluso enviar todos los correos pendientes aprovechando una misma conexión al servidor de correo, de manera mucho más eficiente y ordenada.

Supongamos que queremos tener un control de la llegada de dichos mensajes, o al menos comprobar que el e-mail sigue siendo válido para determinar si nuestros usuarios son legítimos o tenemos algún problema con sus datos. En este caso, cuando el servidor de correo de destino está recibiendo el mail normalmente contestará. Puede que el correo se entregue bien, o puede que estemos en una lista negra, el servidor de destino puede aplicar listas grises, nuestro correo puede ser tachado como Spam, o incluso que el servidor de destino no funcione ahora mismo. En caso de fallo, nuestro servidor de correo nos enviará un mensaje con el motivo por el que no se ha podido entregar el correo. Dichos mensaje podemos leerlos periódicamente y asignar un código de estado a los mensajes que hemos enviado a modo de diagnóstico, o para hacer un reintento pasados unos minutos, desactivar usuarios, etc.

Una web actual, normalmente también descarga contenidos de otros lados, y los procesa. Puede que descarguemos tweets, una captura de una web, extraigamos una imagen o una descripción de un post, la cotización del euro o de alguna criptomoneda. Esto son tareas que no dependen de nosotros. Así que no podemos controlar que el tiempo que tardamos en ellas sea fijo, o que nos pueda echar por tierra una página. También tenemos que pensar en que si cada vez que un visitante requiere alguno de estos datos desde nuestro sitio tenemos que acceder a otro lado para sacarlo, tal vez el otro lado se harte de nosotros, o que no responda en algún momento debido a una caída. Lo que podemos hacer es acceder periódicamente a esos sitios sin que exista mediación por parte de nuestros usuarios y guardar esos contenidos en una memoria o base de datos, de modo que nosotros podamos acudir a esos datos de forma muy rápida. Nuestro dato tal vez no sea el más actualizado, en el caso de las cotizaciones, tal vez tengamos un cierto desfase (aunque podemos aplicar otras técnicas), pero si se trata de tweets, posts y demás, esos contenidos no van a variar con el tiempo.

Otro uso muy útil es la importación, exportación y cálculo de datos. En sistemas de estadística, puede que nuestra aplicación deba importar gran cantidad de datos procedente de diversas fuentes (webs externas, ficheros de usuario, APIs, etc). Esta tarea puede ser muy rápida o llegar a ser muy lenta en su ejecución. ¿Por qué no hacerla en segundo plano y avisar al usuario cuando terminemos? Por un lado, evitamos que el usuario esté eternamente esperando una respuesta (y que se estrese poniéndose a pedir los mismos datos una y otra vez), por otro, si la tarea hace un uso muy intensivo de CPU, podemos limitarlo (la tarea puede realizarse de forma más lenta, pero al menos no nos tira el servicio). Tanto si estamos introduciendo datos, generando un fichero de reporte, realizando cálculos, que también puede ser convirtiendo un vídeo u obteniendo una miniatura de un vídeo, son tareas que pueden estresar al usuario y no deberían influir en la carga de nuestras páginas.

También puede que nos interese eliminar sesiones de usuarios inactivos, invalidar o generar cachés de contenidos complicados. El objetivo es que el usuario final de nuestra página tenga que esperar lo menos posible para la realización de las tareas antes de ver un resultado en la página web. Por supuesto, luego podemos consultar por Ajax si una tarea ha finalizado para avisar al usuario o, como es el caso del envío de correos, es algo que al usuario no le importa, pero a nosotros sí.

Escalabilidad

Algo que tenemos que tener en cuenta cuando estamos inmersos en un proyecto es su escalabilidad. En un primer momento, y si no nos queda otra, cuando empezamos a tener visitas a nuestros servicios podremos optar por una escalabilidad vertical. Es decir, utilizar máquinas más potentes para servir nuestros contenidos. Aunque pronto empiezan a surgir más problemas si hacemos de esta práctica algo común. Los costes suelen dispararse, es más barato comprarse 4 ordenadores pequeños que uno cuya potencia englobe a los cuatro. Vale, no siempre es así, pero si nos ponemos a mirar presupuestos de ordenadores llega un momento en el que sí se cumple. Por otro lado, si tenemos nuestro servicio alojado únicamente en una máquina, sólo hace falta que se rompa una máquina para echar todo al traste. Parece una frase tonta pero es así, mientras que si tenemos nuestro servicio replicado en cuatro máquinas, si se rompe una nos fastidia, pero no nos pillamos los dedos. Bueno, tras todo esto tendríamos que pensar qué parte debemos escalar y cómo, porque puede que escalar toda una aplicación mastodóntica no sea la solución, debemos analizar los cuellos de botella y optar por una solución inteligente.

El caso es que muchas veces este tipo de tareas pueden pasarse a otra máquina. Es decir, nuestra máquina principal (o máquinas), como punto de entrada servirán webs y punto. Pero para las tareas programadas, que puede que algunas requieran mucha CPU vamos a utilizar otra máquina, que incluso será privada y funcionará de forma independiente, incluso si vemos que las tareas son muy exigentes podemos dividirlas en varias máquinas a nuestro gusto. De esta manera podremos hacer crecer nuestra aplicación.

Informes de errores

Aunque muchos programadores dejan esto para el final, en mi opinión es lo primero que deberíamos implementar. Cada vez que ejecutamos una de estas tareas deberíamos escribir en algún lado (base de datos, fichero log, servicio de logs externo, etc) que estamos empezando a realizar la tarea. Deberíamos escribir los errores que nos encontramos y los pasos que damos a la hora de ejecutar tareas, así como su finalización. Con esto tendremos un seguimiento que nos puede ayudar a corregir errores o saber si alguna tarea se ha quedado bloqueada. Más tarde podremos desactivar mensajes para que solo muestre inicio de tarea, fin de tarea y errores, así sabemos que nuestro programa hace su trabajo.

Tareas tras la carga de la web

Una técnica que se ha utilizado durante mucho tiempo es que tras la carga completa de la web se ejecute cierto código de mantenimiento. Es cierto que durante mucho tiempo, una vez se ha cargado la web, se comprueba si se deben realizar tareas y se realizan en caso afirmativo. Muchos sitios lo hacen cuando carga una web, otros sitios hacen una petición Ajax para ejecutar tareas… el problema es que en cualquier caso, estamos haciendo que el usuario intervenga en el disparo de dichas tareas. Eso puede causar que la página cargue más lenta, que haya demasiadas peticiones innecesarias al sistema de tareas, que si la tarea tarda mucho en ejecutarse se cancele debido a los timeouts de PHP o del servidor web, o que, si ningún usuario entra a la web en un tiempo, no se lance ninguna tarea. En cualquier caso, yo soy de la idea de que “son cosas que al usuario no le interesan“, incluso en algunos sistemas, podemos ver tras la petición (sobre todo las Ajax), si se ha ejecutado la tarea y cómo ha ido dicha ejecución, cosa que interesa mucho menos al usuario.

El origen de todo esto es porque muchos servidores (sobre todo los compartidos), históricamente no nos dejaban hacer llamadas a otras aplicaciones de gestión de tareas o incluso la creación de tareas programadas (cron jobs). Actualmente, hasta los hospedajes compartidos nos dejan hacer cosas así, de todas formas, yo te recomiendo montarte por lo menos un VPN para tener más libertar con estas cosas. Aún así, las necesidades de ejecución de tareas en nuestras aplicaciones están creciendo.

Cron jobs

Reloj
Son las tareas programadas de toda la vida, de esta forma le podemos decir al sistema ejecuta este programa cada x días, h horas y m minutos. Normalmente un servidor ejecuta muchas tareas en segundo plano como pueden ser mantenimiento de logs, sincronización del reloj, comprobación de actualizaciones, envío de informes de salud, generación de estadísticas y algunas más. Así que, ¿por qué no introducir nuestras propias tareas?

Por un lado podríamos utilizar un script para cada tarea, por ejemplo invalidación de cachés o limpieza de base de datos, consulta de webs externas y envío de e-mails incluso introducir diferente periodicidad para cada una de ellas. Pero en muchas ocasiones podemos incluso centralizarlo todo en una única llamada. Si hablamos de PHP, podremos ejecutar un único archivo PHP o Python, o Java y que éste se encargue de revisar las tareas pendientes y ejecutar las que crea pertinentes. Habrá ejemplos en PHP en el siguiente post. Incluso si lo hacemos de forma centralizada, podremos introducir tareas que solo deban lanzarse una vez en el juego. Por ejemplo cuando exista una tarea que no tiene por qué ser periódica, como puede ser la obtención de los últimos posts de un blog que acaban de introducir en nuestra web (no es periódico, se realiza cuando un usuario da de alta su blog). Luego este cron job lo podemos ejecutar cada minuto o cada dos minutos, como lo creamos necesario. Basta con ejecutar:

crontab -e

Y luego añadir
1
2
# m h  dom mon dow   command
*/2 * * * * php /ruta/del/archivo/archivo.php

Con esto ejectaremos la tarea cada dos minutos. Seguro que buscando por la red encontramos mucha información sobre los cron jobs.

En nuestro script podremos hacer una consulta a base de datos para determinar las tareas que hay pendientes (periódicas o no) y ejecutar la que toque, incluso cada tarea podrá realizar llamadas a otros procesos, y todo sin que el usuario tenga que intervenir y sin costarle tiempo a él.

Lo malo es que los cron jobs de Unix no pueden alcanzar una resolución de segundos por lo que si queremos lanzar una tarea cada segundo, cada dos, o cada quince segundos tenemos que andar ejecutando tareas con sleep delante, aunque podríamos tener problemas si una tarea tarda más de lo normal en ejecutarse.

Programador de tareas en ejecución

Otra opción es crear nosotros un programador de tareas en el lenguaje en el que estemos trabajando. Por un lado, si utilizamos una base de datos para el control de nuestras tareas no tendremos que iniciar conexiones cada vez que ejecutamos la tarea, lo que gasta tiempo y recursos, sino que podremos tener una conexión abierta todo el tiempo. Y, por otro lado, podemos mirar si tenemos una tarea pendiente cada menos tiempo, por ejemplo cada dos segundos. En este caso, si, en el caso de una tarea de envío de correo electrónico, comprobamos si tenemos que enviar e-mails cada minuto, en el peor de los casos, el mensaje tardará un minuto (más o menos en salir). Mientras que si comprobamos cada dos segundos, al usuario prácticamente le da tiempo a cambiar de ventana, acceder a su correo y comprobar si tiene algo nuevo cuando ya ha recibido el mensaje. Parece que no, pero da una mejor sensación a los usuarios.

Por otro lado, si utilizamos un programador de tareas de este estilo podremos tener varias instancias del programador corriendo en una misma máquina. En caso de que no sean tareas muy intensas computacionalmente, como son enviar e-mails, descargar información de webs externas, etc podríamos tener varias tareas en ejecución a la vez. Eso sí, deberíamos controlar muy bien que no se lance la misma tarea por dos programadores a la vez, lo que puede ser un problema. Así como determinar qué tareas pueden ejecutarse en varios sitios a la vez y cuáles no.

Como el artículo me ha quedado muy largo, he decidido dividirlo en tres. Así que para el próximo incluiré ejemplos de código fuente. La segunda parte estará disponible el día 18 de Julio.

Foto principal: unsplash-logoEstée Janssens

Foto (reloj): unsplash-logoÁlvaro Bernal

The post Programación de tareas en segundo plano para nuestras aplicaciones web (Introducción. Parte 1 de 3) appeared first on Poesía Binaria.

Martes 05 de junio de 2018

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Ejecutando tareas desde consola simultáneamente con GNU Parallel


Los ordenadores cada día son más potentes. Y una de las formas de poder ejecutar tareas de forma más rápida, es simultanearlas. Por un lado, es lógico que si una tarea está esperando un dato (ese dato puede venir del disco, del usuario por medio del teclado o el ratón, o descargándoselo de Internet), es normal que el ordenador decida ejecutar otras cosas para no perder el tiempo. Y de hecho se ha aprovechado esto para tener varios programas en ejecución, constantemente dando y quitando el acceso al procesador. Aunque, con la evolución en el mundo del hardware, ahora es común tener ordenadores que comprenden varios núcleos de procesador y son capaces de disponer de varios hilos de ejecución simultáneos. Lo que quiere decir, que pueden hacer realmente varias cosas a la vez, por lo que tiene más sentido incluso ejecutar tareas en paralelo.

Ejecución concurrente en la shell

Normalmente, si queremos ejecutar varias tareas al mismo tiempo, o concurrentes desde una terminal Unix. Basta con ejecutar un programa de la siguiente manera:

programa &
19238
… ejecuto más cosas …

Con un ampersand (&) al final. De esta forma, el terminal nos devolverá el control a nosotros como usuarios, permitiéndonos ejecutar otras cosas mientras la tarea que le hemos pedido que ejecute lo hace de fondo (en background). Es conveniente que la tarea no escriba muchas cosas en pantalla, porque si no va a ser un jaleo.
También podemos ejecutarla de forma normal, y en mitad de la ejecución pulsar Control+Z (Representado por ^Z). Control+Z enviará una señal SIGSTOP al programa en cuestión, por lo que la ejecución se detendrá, permitiéndonos ahora ejecutar otras cosas, y luego continuar la tarea anterior tanto en el frente (foreground), escribiendo fg o, de fondo (como hacíamos antes, en background), escribiendo bg.
programa
^Z
[1]+ Stopped   programa
… ejecuto más cosas …
fg
programa
… programa sigue ejecutándose …
^Z
[1]+ Stopped    programa
bg
[1]+ programa &
… puedo ejecutar lo que quiera …

Generalmente, si tenemos un ordenador con varios núcleos y capaz de ejecutar varias tareas al mismo tiempo. El núcleo del sistema operativo se encargará de repartir estas tareas entre los núcleos disponibles para que la ejecución global sea más rápida. Si tenemos 2 tareas que se ejecutan en un solo hilo y nuestro ordenador puede ejecutar dos hilos de forma simultánea, ¡vamos a ejecutar los dos al mismo tiempo y terminarán antes!
Concretamente, si tenemos dos programas:

  • pi : Calcula el número PI con 4000 decimales, y tarda 10 segundos.
  • color : Corrige el color de una imagen jpg enorme, y tarda 14 segundos.

Si ejecutamos los dos programas de forma secuencial (primero uno y luego otro), tardaremos 24 segundos en realizar las dos tareas. Pero si las ejecutamos a la vez, como nuestro procesador tiene dos núcleos y no está haciendo nada más, tardaremos en completar las dos tareas 14 segundos (lo que tarda la más lenta de las dos).

Cuando se nos queda corto…

Cuando hablamos de paralelizar tareas, podemos hacerlo en casi cualquier lenguaje o entorno. Es más, justo con la información de antes podemos aprovechar para lanzar varias tareas. Incluso con algo de programación, establecer algún que otro bloqueo para guardar el orden de las ejecuciones. O incluso para poder ejecutar las tareas de dos en dos, o de tres en tres… aunque tratándose de Bash puede ser un poco duro programar ciertas cosas, sobre todo cuando tenemos prisa.

GNU Parallel nos permite ejecutar tareas de forma simultánea, agrupar tareas, ordenar la salida, e incluso nos evita tener que pelearnos con aquellos conceptos de concurrencia que a más de uno nos han traído de cabeza. Como extras, nos permite jugar con los argumentos de entrada de los programas de forma muy divertida a la par que útil.

Instalación

GNU Parallel suele venir en los repositorios de las distribuciones de GNU/Linux más populares, así que podemos hacer:

sudo apt install parallel

En caso de Debian/Ubuntu y derivados

dnf install parallel

Si estamos en Fedora.

pacman -S parallel

El programa no tiene muchas dependencias y es totalmente multiplataforma, ya que está escrito en Perl. Podremos ejecutarlo en nuestro ordenador, un servidor, un móvil, una Raspberry PI o cualquier cacharro que corra GNU/Linux.

Es importante saber la versión que tenemos instalada. Podemos averiguarlo con:

parallel --version
GNU parallel 20161222

Aunque casi todos los ejemplos del post corren con versiones anteriores, para algunas cosas necesitaremos como mínimo la versión 20161222. Si tu distribución no la tiene por defecto, siempre podemos descargarlo de la página oficial.

Calcular el número PI

Un programa que suelo utilizar para este tipo de ejemplos es el cálculo del número Pi. Sobre todo porque es una tarea que tarda un rato y utiliza intensamente el procesador. Sólo necesitamos tener bc instalado. El script es muy sencillo y lo he llamado pi:

1
2
#!/bin/bash
echo "scale=4000; a(1)*4" | bc -l

Ahora debemos dar permiso de ejecución a dicho archivo:

chmod +x pi

Y podemos hacer una prueba sin concurrencia ni nada para ver lo que tarda en ejecutarse en nuestro ordenador:
time ./pi
3.141592653589793238462643383279502884197169399375105820974944592307\
….
66983895228684783123552658213144957685726243344189303968642624341077\
3226978028073189154411010446823252716201052652272111660396
real 0m10.800s
user 0m10.792s
sys 0m0.008s

Si quieres seguir esta guía y ves que la ejecución de pi tarda mucho, puedes bajar el número de dígitos (donde pone scale=4000, puedes bajar el número). El objetivo es no eternizarnos, pero darnos cuenta de cómo se está ejecutando todo.

Varias ejecuciones de un programa

GNU Parallel está diseñado para pasar argumentos de forma variable a cada una de las instancias que ejecutemos del programa. Siempre tendremos que pasar argumentos al programa a ejecutar aunque, en este caso, solo queremos ejecutar varias veces pi, sin argumentos. Una forma fácil es generar una secuencia de números del 1 al total de veces que queremos ejecutar el programa, lo podemos hacer con seq (por ejemplo con 10):

seq 10
1
2
3
4
5
6
7
8
9
10

Una vez que tenemos esta entrada, se la podemos pasar a GNU Parallel. En este caso, le diremos que a pi no le pase argumentos (-n0):
seq 10 | parallel -n0 ./pi

Esta ejecución tardará un tiempo. Eso sí, mientras se ejecuta, estaría bien que investigáramos un poco qué está haciendo el programa. En mi ordenador, puedo ejecutar hasta 8 hilos de forma simultánea. Eso quiere decir que, como pi es una tarea que tira mucho de CPU, ejecutar las 10 instancias del programa al mismo tiempo no haría que la ejecución global fuera más rápido que una ejecución secuencial puesto que dos procesos se pelearían por utilizar la CPU y el sistema operativo tendría que dar y quitar el paso a CPU de los procesos. La situación se agravaría si en lugar de 10 ejecuciones hiciéramos 100 o más, incluso podríamos tener otros problemas si intentamos ejecutar una tarea muy complicada demasiadas veces al mismo tiempo.

Podemos ver qué está haciendo la CPU en cada momento ejecutando top, un gestor de tareas o un monitor de CPU.
Uso de CPU
Lo que quiero que observemos es el número de procesos que estamos utilizando en cada momento. En este caso, la ejecución se hará de 8 en 8 porque GNU Parallel ha detectado que mi sistema puede correr 8 hilos simultáneamente. Podemos comprobarlo si mientras ejecutamos el comando anterior, en otro terminal ejecutamos:

pidof bc | wc -w
8

Veremos ese 8 todo el tiempo. Ya que parallel controla ese número de ejecuciones.

Alternativamente, podemos especificar nosotros cuántas ejecuciones simultáneas tendrá el programa con el argumento -j. De la siguiente manera:

seq 10 | parallel -j2 -n0 ./pi

En este caso, ejecutaremos las tareas de 2 en 2. Podemos especificar el número de tareas simultáneas que necesitemos. Incluso puede exceder el número de núcleos o hilos disponibles en nuestro sistema. El objetivo es que da igual lo que dure la ejecución de pi, mantendremos el número de ejecuciones que le digamos a parallel hasta que ya no haya más instancias por lanzar.

Cambiando los argumentos de entrada

La gracia de ejecutar tareas en paralelo es que podamos variar los argumentos de entrada de dicho programa. Es más, un programa podrá tener argumentos fijos y argumentos variables. Esto lo podemos poner en práctica ejecutando echo de forma concurrente con diferentes parámetros. Vale, ejecutar echo no es ninguna tarea intensiva, pero nos vale para ver cómo se están produciendo las ejecuciones y algunas cosas curiosas más.

Argumentos desde teclado (entrada estándar)

Una forma muy sencilla de pasar argumentos de entrada a parallel es de forma interactiva, escribiéndolos por teclado y pulsando Control+D al finalizar:

parallel echo
parallel: Warning: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
Jaén
Córdoba
Sevilla
Huelva
Cádiz
Málaga
Granada
Almería
Jaén
Córdoba
Sevilla
Huelva
Cádiz
Málaga
Granada
Almería

Argumentos desde pipe

Estos argumentos podemos pasarlos desde una pipe o desde un archivo, pero tiene que haber uno por línea. Podemos introducir las provincias en un archivo o hacer lo siguiente (con tr estamos convirtiendo los espacios en retornos de carro), además, estamos introduciendo un argumento fijo “Saludos desde”:

echo “Jaén Córdoba Sevilla Huelva Cádiz Málaga Granada Almería” | tr ‘ ‘ ‘\n’ | parallel echo “Saludos desde”
Saludos desde Jaén
Saludos desde Córdoba
Saludos desde Sevilla
Saludos desde Huelva
Saludos desde Cádiz
Saludos desde Málaga
Saludos desde Granada
Saludos desde Almería

Argumentos desde pipe en orden

Pero claro, no todos los programas aceptan los argumentos en el mismo lugar, imaginemos que queremos decir algo más tras el nombre de la provincia andaluza, para ello tendremos que introducir alguna cosa más:

echo “Jaén Córdoba Sevilla Huelva Cádiz Málaga Granada Almería” | tr ‘ ‘ ‘\n’ | parallel echo “Saludos desde” {}”, una bonita provincia andaluza.”
Saludos desde Jaén, una bonita provincia andaluza.
Saludos desde Córdoba, una bonita provincia andaluza.
Saludos desde Sevilla, una bonita provincia andaluza.
Saludos desde Huelva, una bonita provincia andaluza.
Saludos desde Cádiz, una bonita provincia andaluza.
Saludos desde Málaga, una bonita provincia andaluza.
Saludos desde Granada, una bonita provincia andaluza.
Saludos desde Almería, una bonita provincia andaluza.

Varios argumentos variables por ejecución

Ahora, vamos a crear un archivo, en el que introduciremos un número (el número de letras que tiene la provincia) y la provincia, de forma alternativa en cada línea. Lo llamaremos andalucia.txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4
Jaén
7
Córdoba
7
Sevilla
6
Huelva
5
Cádiz
6
Málaga
7
Granada
7
Almería

Con este archivo podríamos hacer lo siguiente:

cat andalucia.txt | parallel -n 2 echo “Dame {1} letras para {2}”
Dame 4 letras para Jaén
Dame 7 letras para Córdoba
Dame 7 letras para Sevilla
Dame 6 letras para Huelva
Dame 5 letras para Cádiz
Dame 6 letras para Málaga
Dame 7 letras para Granada
Dame 7 letras para Almería

Con -n2 estamos indicando que echo llevará dos argumentos, por lo que cada ejecución de echo tomará dos líneas del fichero como argumentos. Con {1} y {2} indicamos el número de parámetro que estamos colocando. También podríamos hacer lo siguiente:
cat andalucia.txt | parallel -n 2 echo “{2} tiene {1} letras.”
Jaén tiene 4 letras.
Córdoba tiene 7 letras.
Sevilla tiene 7 letras.
Huelva tiene 6 letras.
Cádiz tiene 5 letras.
Málaga tiene 6 letras.
Granada tiene 7 letras.
Almería tiene 7 letras.

Argumentos de parallel como argumentos del programa

Otra forma de incluir argumentos variables es la siguiente:

parallel echo ::: Ávila Burgos León Palencia Salamanca Segovia Soria Valladolid Zamora
Ávila
Burgos
León
Palencia
Salamanca
Segovia
Soria
Valladolid
Zamora

Argumentos y combinaciones

Cuando tenemos que lanzar muchas tareas, a veces es útil que los argumentos hagan combinaciones de parámetros. De esta manera no tendremos que generar un fichero que reúna las combinaciones y luego pasárselo a Parallel. Por ejemplo, si queremos hacer una operación lógica AND, podemos hacer lo siguiente:

parallel ‘echo -n {1} \&\& {2} = ; (({1}&&{2})) && echo 1 || echo 0’ ::: 0 1 ::: 0 1
0 && 0 =0
0 && 1 =0
1 && 0 =0
1 && 1 =1

O, mucho más sencillo, si queremos todas las combinaciones que podemos hacer con 3 bits, podemos hacer lo siguiente:

parallel echo ::: 0 1 ::: 0 1 ::: 0 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Un paso más, ahora queremos averiguar con bc su valor en decimal:

parallel echo -n {1}{2}{3} = \;’echo “ibase=2;{1}{2}{3}” | bc’ ::: 0 1 ::: 0 1 ::: 0 1
000 =0
001 =1
010 =2
011 =3
100 =4
101 =5
110 =6
111 =7

Datos desde un fichero separado por columnas

Podemos utilizar un archivo cuyo contenido pueda ser determinado por columnas, como un CSV (Comma Separated Values) o TSV (Tab Separated Values). Podríamos coger el archivo de provincias y hacer lo siguiente (andalucia2.csv):

1
2
3
4
5
6
7
8
4,Jaén,jiennense
7,Córdoba,cordobés
7,Sevilla,sevillano
6,Huelva,onubense
5,Cádiz,gaditano
6,Málaga,malagueño
7,Granada,granadino
7,Almería,almeriense

En este caso descartaremos el primer valor. No tenemos por qué utilizarlo si no queremos.

parallel --colsep ‘,’ echo “Un habitante de {2} se llama {3}” :::: andalucia2.csv
Un habitante de Jaén se llama jiennense
Un habitante de Córdoba se llama cordobés
Un habitante de Sevilla se llama sevillano
Un habitante de Huelva se llama onubense
Un habitante de Cádiz se llama gaditano
Un habitante de Málaga se llama malagueño
Un habitante de Granada se llama granadino
Un habitante de Almería se llama almeriense

El orden de ejecución

Como se lanzan varios procesos a la vez y no todos tienen por qué tardar lo mismo. El orden en el que vemos los resultados puede variar. Lo podemos comprobar de la siguiente forma:

parallel sleep {}\; echo {} ::: 4 8 2 6
2
4
6
8

De esta forma hemos ejecutado 4 procesos que generarán esperas de 4, 8, 2 y 6 segundos, eso sí, la salida se irá generando por el orden en el que los procesos lleguen al echo. Aunque el orden de salida no es el orden de los argumentos que le hemos pasado. Es más, si queremos, podemos hacerlo más enrevesado:
parallel -j2 sleep {}\; echo {} ::: 4 8 2 6
4
2
8
6

En este caso ejecutamos dos hilos de forma simultánea, por lo que se lanzan los procesos que tardan 4 y 8 segundos a la vez. El de 4 segundos termina, y se lanza el de 2 (ahora están trabajando el proceso que tarda 8 (que va por su cuarto segundo) y el que tarda 2. Lógicamente acaba primero el que tarda 2 segundos y se lanza el de 6, pero al de 8 le quedan 2 segundos, por lo que acaba antes que el de 6.
El caso es que puedo forzar a parallel para que muestre la salida en el mismo orden en el que le paso los argumentos de entrada con el argumento -k:
parallel -k sleep {}\; echo {} ::: 4 8 2 6
4
8
2
6

Da igual qué hilos esté lanzando y cómo termine, la salida generada me la mostrará parallel en el orden que yo le he dicho, lo cual es útil para nuestros scripts si necesitamos controlar la salida generada.

Ejecutando funciones de Bash

Como hemos visto parallel nos permite ejecutar echo, palabra reservada de Bash, pero también es posible crear nuestras propias funciones y ejecutarlas. De esta forma, no solo podemos ejecutar un programa, podremos crear funciones y ejecutarlas también. Solo tenemos que exportarlas:

1
2
3
4
5
6
7
8
function distancia() {
  local ORIGEN="$(echo -n $1 | jq -s -R -r @uri)";
  local DESTINO="$(echo -n $2 | jq -s -R -r @uri)";
  curl -s  "http://maps.googleapis.com/maps/api/directions/json?origin=${ORIGEN}&destination=${DESTINO}&sensor=false" 2>/dev/null | tee "${ORIGEN}_${DESTINO}.txt" | jq '.routes[0].legs[0].distance.text';
}

export -f distancia
parallel echo -n "De {1} a {2} =\> " \; distancia {1} {2} ::: "La Coruna" "Lugo" "Orense" "Pontevedra" ::: "Alicante" "Castellon" "Valencia"

Con este ejemplo sacaremos muchas distancias entre ciudades con la ayuda de la API de mapas de Google. Es un ejemplo donde podemos ver que cada petición tarda un tiempo diferente, los resultados salen en orden de llegada.

Reemplazos de argumentos

Parallel permite no solo pasar los argumentos a los programas que ejecuta tal cual, sino que podemos hacer alguna operación de reemplazo por si no queremos el parámetro tal cual nos lo pasan. Algunos parámetros comunes pueden ser nombres de archivo (a los que podremos quitarle rutas o extensiones), cadenas de caracteres (que podremos recortar), o incluso extraer información de las tareas. Incluso podremos cambiar las cadenas si nos resulta incómodo utilizar estos caracteres en nuestros scripts. Esto podría ser muy extenso, así que voy a extraer algunos ejemplos rápidos:

Convertir imágenes de JPG a PNG

Con esta orden podremos buscar todas las imágenes jpg que hay en el directorio actual y convertirlas a png. Eso sí, utilizando toda la potencia de nuestro ordenador, iniciando tantos procesos convert simultáneos como núcleos tenga nuestra CPU. Podemos ver que {} muestra el argumento tal cual, pero {/.} extrae la ruta y la extensión. Si queremos investigar, {/} solo extrae la ruta y {.} solo extrae la extensión. En este caso guardamos las imágenes convertidas en el directorio convertidas.

find -maxdepth 1 -name ‘*.jpg’ | parallel convert -verbose {} convertidas/{/.}.png

Slots y tareas

Podemos saber qué número de tarea estamos ejecutando en cada momento. Es muy útil si por ejemplo cada tarea tiene que repartirse un tamaño muy grande y estas deben saber qué trozo de tarea les corresponde. Pensad en una imagen, divididla en cuadros numerados secuencialmente y cada tarea que lancemos debe atacar a uno de los cuadros. En este caso cada una de las tareas debe saber a qué cuadro tienen que ir. Por otro lado, los slots son grupos, como si fueran “cajas” en las que se ejecutan las tareas. Es decir, si vamos a ejecutar 3 tareas simultáneamente, tendremos 3 cajas y una tarea en ejecución ocupará una caja. De tal forma que nunca tendremos dos trabajos corriendo al mismo tiempo en el mismo slot. Podemos ver cómo funciona esto de los slots así:

parallel -j2 sleep {} \; echo {%} {#} --- {} ::: 5 2 1 3 4
2 2 --- 2
2 3 --- 1
1 1 --- 5
2 4 --- 3
1 5 --- 4

Reemplazo con funciones

Parallel también soporta funciones (casi todas las funciones están disponibles a partir de la versión 20161222. Por ejemplo podemos decirle a una tarea el número total de tareas que vamos a ejecutar. Aunque {= ‘$_=total_jobs($_)’ =} podemos sustituirlo por {##}:

seq 100 | parallel echo Job {#} of {= ‘$_=total_jobs($_)’ =}

Aunque algo muy útil es la implementación de condiciones dentro de la propia ejecución, de la siguiente manera:

seq 50 | parallel echo Hola Mundo {%} ‘> {= $_= $job->seq() % 2 == 0 ? “/dev/tty” : “/dev/null” =}’

Con esto le decimos que la salida se produzca por /dev/tty si el número de la tarea (job->seq()) es par (si su división por dos da resto cero), y si no, mandamos la salida a /dev/null.

Hay muchos más reemplazos

Progreso

Como siempre, el usuario se desespera, y muchas veces necesita que le demos algo de información para que no se desespere. Una buena idea es mostrar un progreso para que sepa por dónde va la ejecución. Como parallel está pensado para ejecutar muchas tareas, puede medir el progreso mirando todas aquellas tareas que han finalizado y midiendo tiempos. Podemos utilizar el mismo ejemplo de antes para convertir fotos de la siguiente manera:

find -maxdepth 1 -name ‘*.jpg’ | parallel --progress convert {} convertidas/{/.}.png

O también podemos utilizar –bar. O incluso mejor, pasarle la salida del progreso a un programa como zenity, para ver la salida de forma bonita:
find -maxdepth 1 -name ‘*.jpg’ | parallel --bar convert {} convertidas/{/.}.png 2> >(zenity --progress --auto-kill)

También podemos utilizar –eta para que nos indique el tiempo estimado de finalización de la tarea.

Muchas más opciones

Las utilidades de este programa no han terminado. El propio parallel nos permite ejecutar tareas simultáneas en servidores desde nuestra máquina cliente. Además, junto con GNU Parallel encontramos utilidades para acceso a base de datos y para la realización de operaciones. Es un programa muy flexible que nos permite realizar multitud de operaciones muy útiles y muy interesantes.

Sobre GNU Parallel

El autor nos pide que le citemmos si utilizamos este programa para una publicación. Sólo hay que mencionar al autor, además, en el enlace encontramos un manual muy completo y actualizado:

Encontramos otras formas de mención muy útiles si estamos escribiendo en LaTeX:

parallel --bibtex

Foto principal: unsplash-logoJonathan Pendleton

The post Ejecutando tareas desde consola simultáneamente con GNU Parallel appeared first on Poesía Binaria.

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

Migración a LibreOffice 6.1 Base

Hace unos días se ha publicado la beta1 de LibreOffice 6.1.
He descargado el paquete y lo he instalado en Fedora 28.
Al ser una versión de desarrollo, al ejecutarse, crea sus propios directorios de usuario, distintos de los de la versión estable.

El motor de base de datos que viene implementado por defecto es Firebird, aunque HSQLDB sigue funcionando normalmente.

Al abrir una base de datos realizada con HSQLDB, que puede ser cualquier base realizada con una versión menor (salvo que se hubiera activado Firebird anteriormente) siempre solicita convertirla a Firebird.

Esto se puede obviar presionando el botón “latest” en vez de “yes”.

Para convertirla a la versión de Firebird hay que tener presente varias cuestiones, pues el sistema de conversión aún tiene fallos:

Realizar un copia de seguridad de la base de datos que queremos abrir y trabajar con la copia.

Comprobar si tenemos alguna vista de tabla. Es decir en el menú “tablas” están las tablas propiamente dichas y la vistas, que no son mas que una consulta, que puede ser de tablas combinadas.

En caso de que existan vistas de tablas hay que abrirlas y comprobar que no haya campos calculados o campos concatenados que no estén realizados de manera que puedan ser correctamente interpretados por la nueva versión, pues en caso contrario la vista se elimina en la conversión.

Si hay campos calculados o campos concatenados en la vista lo mejor es crear una nueva consulta en modo SQL, copiar la instrucción SQL que nos muestra la vista y guardar la nueva consulta que hemos realizado con esta instrucción SQL copiada.

El error mostrado venía dado por un campo concatenado, que no se ajustaba a Firebird. En la consulta cambié la instrucción y conseguí que funcionara.
Usaba: “Prenom” + SPACE( 1 ) + “Nom”
Rectifiqué: “Prenom” || ‘ ‘ || .”Nom”

A continuación tendríamos que comprobar todos las consulta que tenemos. En la que figure la vista de tabla habría que cambiar todos los datos por los de la consulta.

Un método puede ser con un editor de texto y la edición SQL de consultas.

En mi caso la vista de tabla de llamaba vMovimientos y la consuta creada con la misma instrucción c_vMovimientos. Copiaba el resultado de la salida de la consulta en un editor de texto (kate) y con buscar y remplazar ya tenía la nueva sintaxis. Volvía a copiar y pegar. Guardaba la consulta y la base. Resuelto parcialmente.


La consultas con parámetros, si en criterio se hace referencia a un campo de una tabla, poniendo <= [tabla].[campo] muestra error.

Los campos numéricos y con decimales dan problemas.
Tengo en una tabla “Movimientos” que tiene, entre otros, tres campos “DECIMAL” con dos decimales.
Al importar los campos INTEGER, DATE, VARCHAR Y BOOLEAN no han dado problemas, pero los DECIMAL sí.

Había cantidades que no daban problemas, pero en otras el resultado era desastroso.
Números positivos los convertía en negativos que no tenía relación alguna, las cantidades con decimales terminados en 00 las dividía por 100. 9000,00 pasaba a ser 90,00, un 9xx,xx lo pasaba a -16xx,xx.

Para solucionarlo copio desde la base guardada y, abierta con una versión antigua, la tabla en Calc:
Crear tres nuevas columnas,
Multiplicar el resultado por 100.
Cambiar a formato numérico y sin decimales.
Transponer a sus antiguas columnas.

Con esto ya puedo realizar la exportación de datos a la tabla Movimientos de la nueva base convertida.

Parece un proceso muy engorroso, pero si se hace con tranquilidad, en poco tiempo se ha finalizado.

Por ahora, en la comprobación que he realizado, tanto los datos de fecha como los numéricos están correctos, sin que haya diferencia entre una y otra tabla.

NOTA.- En una comprobración posterior, y en un campo calculado, el resultado del mismo es el que he importado de la hoja de cálculo, no de lo que figura en la tabla.

Es decir, está multiplicado por 100 con respecto a lo que figura en la tabla.

El bug ha sido reportado por Xisco Fauli @x1sc0    https://bugs.documentfoundation.org/show_bug.cgi?id=118043 .

 

Jueves 31 de mayo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

WordPress. El misterioso caso del cuelgue diario a las 9 de la mañana

icono de wordpress Los blogs están muertos. Por fin. Bueno, no todos. Hay alguno que resiste hoy y siempre a la invasión de las redes sociales. A ratos me gusta pensar que este es uno de ellos… pero si soy sincero conmigo mismo ciertamente está un poco desnutrido. No le presto mucha antención, no… Hace meses, por ejemplo, que se cuelga durante aproximadamente media hora todas las mañanas y ni siquiera me he preocupado de ver que le pasa. Bueno, ya no. Ya está arreglado. Los malos hados subestiman el poder de esas tareas tediosas y desagradables que hacen que hasta te den ganas de ponerte a planchar o a limpiar los baños. Bueno, yo me he conformado con arreglar por fin este problemilla. Los baños otro día. 🙂

¿Síntomas mi querido Watson? Apenas nada: la indisponibilidad se producía por un elevado consumo de CPU y mirando con htop resulta que la responsable es mariadb (aunque en el pantallazo aparezca mysql ya sabéis que son compatibles a nivel binario).

htop - mysql se come todo el tiempo de proceso de ambos cores

Alguna pista mas: conéctandome a mariadb observo que lo que se están ejecutando son consultas aparentemente bastante simples sobre la tabla wp_options:

MariaDB [unlugar]> show processlist;
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+
| Id    | User    | Host      | db      | Command | Time | State        | Info                                                                                                 | Progress |
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+
| 29462 | unlugar | localhost | unlugar | Query   | 1043 | Sending data | DELETE a, b FROM wp_options a, wp_options b
			WHERE a.option_name LIKE '\\_transient\\_%'
			AND a. |    0.000 |
| 29552 | root    | localhost | unlugar | Query   |    0 | init         | show processlist                                                                                     |    0.000 |
| 29559 | unlugar | localhost | unlugar | Query   |   40 | update       | INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('jetpack_nonce_15275779 |    0.000 |
| 29560 | unlugar | localhost | unlugar | Query   |   22 | updating     | UPDATE `wp_options` SET `option_value` = '1527578481.1030609607696533203125' WHERE `option_name` = ' |    0.000 |
| 29561 | unlugar | localhost | unlugar | Query   |    7 | updating     | UPDATE `wp_options` SET `option_value` = '1527578505', `autoload` = 'yes' WHERE `option_name` = 'jet |    0.000 |
| 29562 | unlugar | localhost | unlugar | Query   |    0 | updating     | UPDATE `wp_options` SET `option_value` = '1527578503.1177010536193847656250' WHERE `option_name` = ' |    0.000 |
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+

Así que le echamos un vistazo a esa tabla y resulta que tiene la friolera de más de 40.000 registros y consume cerca de 38 Megas de espacio ¿Qué tiene dentro?¿Los casos de corrupción del PP? Porque la estructura de la tabla también es bastante simplona:

MariaDB [unlugar]> describe wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(191)        | NO   |     | NULL    |                |
| option_value | longtext            | NO   |     | NULL    |                |
| autoload     | varchar(20)         | NO   |     | yes     |                |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

Un último dato: la exactitud en la periodicidad me escamaba también. Incluso uno de esos días de puentes con un tiempo maravilloso donde no queda ni el friki más irredento paseándose por algo donde no despachan cerveza el blog también se caía. Y a la misma hora, así que le eché un vistazo al cron del sistema y no había nada que se lanzara a esa hora. ¿Y? De repente recordé que wordpress viene con su propio planificador de tareas y que estas se pueden inspeccionar fácilmente. Por ejemplo a través del plugin WP Cron Cleaner. Bingo. Ahí la tengo: Justo a las 9.04 y todos los días hay una tarea que se llama delete_expired_transients. Y eso de “transient” ya era algo que habíamos visto por ahí arriba en la consulta que se estaba realizando en mariadb.

El proceso que se lanza diariamente alrededor de las 9 realiza una limpieza de transients

Tocaba googlear a ver que es eso de los transients pero ya teníamos datos suficientes para reunir en la biblioteca a todos los implicados y desvelar quien es el asesino.

Los transients, al parecer, son registros con información temporal que proviene de los plugins que tenemos instalados. ¿Sirven para algo? Pues una vez que caducan no, para nada. De hecho precisamente por eso está ahí esa tarea que elimina los caducados. ¿Qué es lo que ocurre entoces? Pues que es evidente que muy bien no funciona porque la mayoría de esos 40.000 registros son transients. Más de 35.000, de hecho. Y la búsqueda se realiza a través del campo wp_options que como vemos no está indexado. Fatal. La primera aproximación al problema pasa, pues, por crear un índice sobre esa columna:

MariaDB [unlugar]> alter table wp_options add index (option_name);
Query OK, 0 rows affected (3 min 47.86 sec)         
Records: 0  Duplicates: 0  Warnings: 0

Mano de santo, oigan. Al día siguiente a las 9.04 por primera vez en meses el blog no se colgó. ¿Lo dejo así?¿Con una tabla diez veces mas grande que el contenido de todo lo escrito en el blog?¿Hasta donde la dejo crecer entonces? Toca hacer otra búsqueda y por ahí me encuentro con mucha mas gente que ha tenido problemas similares y que asegura que se puede hacer tábula rasa y borrarlos todos. Así que hago un backup rápido, los elimino… y parece que todo va bien. Fantástico 🙂

¿Cómo eliminarlos? Pues a través de línea de comando es fácil:

MariaDB [unlugar]> DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%')

Puestos a buscar una solución más cómoda y permanente para no llegar de nuevo aquí dentro de 10 años encontré otro plugin (Transient Cleaner) que te permite borrarlos puntualmente y/o programar una tarea para hacer una limpieza mas efectiva que la de wordpress de forma periódica.

Y listo. O eso parece. Mañana los baños. Sin falta 🙂

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: WordPress. El misterioso caso del cuelgue diario a las 9 de la mañana || Hospedado en un Cloud VPS de Gigas.

Sábado 26 de mayo de 2018

VPS Windows o Linux GRATIS con LuisiBlog

Estos servidores se mantienen íntegramente gracias a la publicidad de esta página web (LuisiBlog). Si quieres tener un VPS con IP de España de forma totalmente gratis tan solo sigue estos sencillos pasos: Está prohibida su venta de terceros y al usar cualquiera de nuestros recursos estas aceptando nuestras condiciones de uso. Las características de […]

La entrada VPS Windows o Linux GRATIS con LuisiBlog aparece primero en Blog de Informática ✏ Luisi.

Martes 22 de mayo de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Cuenta oficial en Twitter de LXQt y LXQt 0.13.0

Con el nuevo lanzamiento de LXQt, ya van por la versión 0.13.0, el proyecto lanza su cuenta oficial en Twitter: https://twitter.com/LXQtOfficial Y luce así de bien:

¿Qué trae de nuevo LXQt? Pues según sus notas, muchas correcciones a errores: https://blog.lxqt.org/2018/05/release-lxqt-0-13-0/

Combinaciones de teclas útiles

Un par de combinaciones de teclas útiles que trae por defecto son:

  • Ctr + Alt + i  Abre el navegador web por defecto (¡utilísima!)
  • Ctr + Atl + e  Abre el explorador de ficheros
  • Ctr + Atl + t  Abre el terminal

Control de brillo y contraste

De entre la aplicaciones disponibles de LXQt, voy a hablaros de una que me ha hecho gracia, la posibilidad de controlar el brillo de pantalla.

¿Qué es lo que me gusta de esta aplicación? Permite cambiar el brillo de pantalla tanto por hardware como por software. En un portátil puedes cambiar el brillo de la pantalla modificando la intensidad luminosa de los LED que hay detrás de la pantalla. En un ordenador de sobremesa esto no se puede hacer, pero te permite cambiar el brillo de la pantalla por software y es algo muy agradable a la vista. ¡Sobre todo con pantallas excesivamente brillantes!

Aprovechando el espacio de la pantalla eliminando las barras de título

Otra curiosidad, si pulsáis sobre una barra de menús con el clic derecho del ratón y seleccionáis “Decorar”, se eliminan las barras de título. Muy útil para aprovechar todo el espacio disponible de la pantalla. Por ejemplo:

Es esta captura de pantalla, he puesto el panel a la izquierda y he eliminado la barra de título del terminal. Como se puede ver la pantalla se aprovecha mejor.

Para volver a decorar las ventanas, pulsamos Atl + espacio. Aunque, yo las gestiono pulsando con el botón derecho del ratón sobre su icono en el panel.

Y Wayland… ¿Para cuándo?

Los desarrolladores están teniendo ardientes debates sobre el tema: https://github.com/lxqt/lxqt/issues/1011

La postura que están adoptando es mantenerse independientes del gestor Wayland usado, de forma que se puedan usar las herramientas LXQt en cualquier gestor de composición Wayland. Parece que tienen claro que no van a reescribir otro compositor Wayland más habiendo opciones disponibles. Aunque hay voces que apuntan a que finalmente, por la estructura de Wayland, no va quedar más remedio.

Sábado 05 de mayo de 2018

Como Virtualizar un Servidor y crear un Cluster

Virtualizar un servidor es básicamente crear mediante software una aglomeración de los recursos para que posteriormente se crear instancias o entornos. Mi recomendación es que si eres una empresa o no tienes conocimientos de informática (Virtualización, redes y subredes) mandes un correo o llames a una empresa especializada. En este caso hay una empresa en […]

La entrada Como Virtualizar un Servidor y crear un Cluster aparece primero en Blog de Informática ✏ Luisi.

Viernes 27 de abril de 2018

Como cumplir las leyes Españolas para tú blog o página

Lo primero es evitar los contenidos con trabas legales como nombrar o usar marcas registradas sin permiso de esta o insultar por medio de nuestra página web, por ejemplo al Rey, o alabar al terrorismo. Así que lo primero es cumplir el Código Penal, aunque estemos en Internet. Si todo esto te resulta aburrido o […]

La entrada Como cumplir las leyes Españolas para tú blog o página aparece primero en Blog de Informática ✏ Luisi.

Martes 03 de abril de 2018

Ramón Miranda

Ramón Miranda
Ramon Miranda

A new dawn, alegory . The Making off


Hi all, today I am going to show you my latest painting done in Krita 4.0 while i was collaborating to provide resources like brushes, brushtips, and patterns.
I think Krita deserves a good promotional images (at least finished images) and this was also a good testing canvas for that. My 2 cents ;)
This image reflects the emotional state that makes me feel this new release. So here you have...
"A new dawn, alegory" i hope you like it.

The process. (click on the images to see big-res images)

Step 01. First i start with the background, the mood itself of the image. I focus my attention on color and overall emotion. You can see there is no texture but i define where the figure must be placed.

Step 02. Then i continue working with brushes and wet paint.Here i am testing how to get the Oil or at least the painterly effect on some brushtrokes and i remove some coldness on the background. I start to add a bit of glow, this is an easy way to get more corlors to play with. Also you can see some primitive structures on the BG.

Step 03. I feel i need more color, why not! and i start to define better the path of viewers eye. I use very often the contrast to catch the attention. You can see a lot of brushtrokes , some are from 3.3 brushes and others are testing brushes for 4.0. Not too much detail here but i feel i like the red color and movement on clothes

Step 04. After some crazyness, lot of fun and exploration, is time to define a bit the image, the message and planes. You can see now arcs, rocks and a more defined pose for the woman. But at the moment i have only big spots of color.

Step 05. Time for block stage defining more and more.  

Step 06. I sketch a better figure in paper with pen, I love strong characters and strong women so i decide to give her a powerful pose, dominant but a bit humble holding her clothes with bare hands.


Step 07. I change the scale of figure to emphasize the environment and movement on the folds. Now you can see the folds and better idea o what the final image is going to be.

Step 08. Is time to detail a bit more all the scene. Structures on background, the ruins in midplane, the ground, adding a bit of texture and the main arc in the foreground with the woman in focal point. The folds are well stablished and is time to see if everything works. I am not sure with the arm pose so i delete it for the moment.

Step 09. I redefine a bit the mood, to be not so pictoric but more actual looking. I focus my attention on bg and add glow to the gate, wich is the symbol of "how krita is seeing a new light and how reborns from the ruins. (you know the history) I block the main shapes of arm and detail lot of parts.

Step 10. So... what i miss oh yes! more details ;) . I left this image posted because you can see how i use temporary swatches (in this case for the folds) you can see also this for the hair and how the strands starts to appear more realistic.

Step 11. And now a dramatic light change because the lighting was not coherent. Final details in hair, texture, folds, folliage, and fx. All done with krita 4 brushes.

I  hope you enjoy this new release as I do. Remember Krita it can be amazing but you are the artist.
If you have qustions or want to know more about my work, check my social media.



Viernes 23 de marzo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Bootstrap 4. Primeros pasos

icono de php Bootstrap es una colección de elementos, plantillas y componentes HTML, CSS y Javascript para crear rápidamente páginas web con un aspecto moderno y “responsivo” (¡menudo palabro!) al tamaño de pantalla de cualquier dispositivo. Su versión 4 se liberó hace un par de meses y aporta algunos cambios significativos como, por ejemplo, la inclusión de Popper como librería javascript para “tooltips” y otros elementos emergentes y la eliminación de las tipografías Glyphicons para introducir símbolos y pictogramas.

Podemos trabajar con Bootstrap bien descargandonosla en nuestro propio servidor web, o bien usando sus librerías directamente desde los CDN que nos ofrecen. Aquí usaremos este segundo método por sus evidentes ventajas de cara a montar una primera plantilla para pruebas. Necesitamos incluir simplemente el siguiente tag en :

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />

Si vamos a usar los elementos javascript necesitamos incluir también las librerías correspondientes y, ademas, las de jquery y popper en nuestro proyecto las cuales también tienen disponible la posibilidad de enlazarlas directamente sin necesidad de descargarlas en local:

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

IMPORTANTE: los enlaces anteriores corresponden a las versiones estables más recientes en el momento de escribir esto. No suelen eliminar las versiones anteriores, pero conviene que te cerciores si llegas a este texto en un futuro lejano.

Con todo esto, la plantilla mínima de HTML para empezar a trabajar (incluyendo los enlaces correspondientes a las librerías javascript comentados) sería esta:

<!DOCTYPE html>
<html lang="es">
    <head>
    	<meta charset="utf-8" />
    	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    	<title>Plantilla Bootstrap</title>
  	</head>
  	<body>
		<h1>Plantilla Bootstrap</h1>

    
		<!-- Javascript opcional -->
		<!-- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    	     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
    	     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> -->
  	</body>
</html>

Sosa, verdad? Claro, aún no hemos empezado a trabajar… Si quieres ver algo más impactante, bootstrap dispone de plantillas con algo mas de chicha para tus diseños. Las tienes disponibles en este enlace. Si prefieres empezar desde cero, tienes disponible un montón de La documentación bastante fácil de seguir que incluye multitud de ejemplos prácticos para empezar a trabajar desde el primer minuto.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Bootstrap 4. Primeros pasos || Hospedado en un Cloud VPS de Gigas.

Jueves 22 de marzo de 2018

Ramón Miranda

Ramón Miranda
Ramon Miranda

Krita 4.0 ya está aquí


"Un nuevo amanecer, una nueva versión de Krita que cambia muchas cosas como la luz cuando va iluminando poco a poco lo que la rodea." Alegoría.

Hola, muy buenas. ¿Será la primavera? ¿será mi espiritu ñoño haciendo de las suyas? Pues no!
Es que hoy estamos de enhorabuena. Ya ha salido la nueva versión de Krita, la 4.0 donde vamos a poder encontrar muchas novedades. Y si no conoces este programa pues te estás perdiendo una muy buena herramienta que además es completamente gratuita gracias a ser software libre.

Durante la fase de desarrollo he podido colaborar aportando ideas, pinceles, y patrones para usar como texturas. En un post futuro puede que hable de la experiencia en general. Cómo lo he vivido a nivel personal, pero hoy me voy a centrar en Krita.

Lo primero de todo, dar las gracias por ese duro trabajo que hacen los desarrolladores. Y no pienses que Krita es sólo pinceles a nivel de código, es mucho más, y encima multiplataforma. Imagínate todo ese trabajo de depuración de código.

Pero ¿qué es lo que me ha gustado a mí personalmente? Como sabes, si me sigues en el blog o redes, soy un fanático de los pinceles y herramientas digitales. Así que allá voy.
  • Un Nuevo set mejor organizado y más versátil. Pero lo bueno es que se mantiene el set antiguo con lo cual si estabas muy acostumbrado a los pinceles de krita 3 pues no hay problema.
  • El set principal tiene su propia etiqueta así que se puede aislar.
  • Krita ahora soporta el multithread para las pinceladas, con lo cual deberiamos notar una mejora en el rendimiento de krita. Y eso siempre es bueno ¿no? con Shift+ L o desde el menú View/Instant preview mode.
  • Previsualización del trazo en el editor de pinceles. Eso hace más fácil la creación de pinceles. 
  • Krita te ayuda con un nuevo asistente al salvar un nuevo pincel donde puedes añadir imágenes prediseñadas e incluso cambiar cosas como el color de algunas partes del icono.
  • Masked brushes o dual brush como se llama en Photoshop. Permite a los pinceles tener una doble punta que le da más realismo. Fíjate como tenemos un trazo duro en el contorno pero hay utilizamos una doble punta que usa lineas para simular ese efecto útil para fondos o suciedad.
  • El tamaño máximo del pincel puede sobrepasar los 1000px. Pero ojo esto requiere potencia.
  • Curvas prediseñadas para no andar continuamente moviendo puntos en las curvas o simplemente para hacer pruebas.
  • Ahora se puede cambiar el tamaño de los iconos de pinceles más fácilmente con un slider.(Yo sigo usando el Ctrl+Rueda de ratón arriba o abajo.)
A parte de todo esto, muchas mejoras se producen bajo el capó o en funcionalidades no tan usadas. Algo muy bueno va a ser el uso de Python scripts. Y si no preguntádselo a Blender y todo su ecosistema de plugins. De momento hoy mismo ya he visto que alguien está haciendo un plugin para publicar en Mastodon a través de Krita. Pruébalo bajo tu responsabilidad que esto no es de los desarrolladores, que conste. https://github.com/spaceottercode/kritatoot

También si te interesan los videojuegos que seguro que sí ;)

  • Pixel grid si lo que haces se relaciona con el pixelart
  • Normal map si estás más orientado a cosas realistas.
Y luego cosillas que tengo pendiente de probar. 

  • Colorize mask tool para amantes del comic que necesitan dar un color plano a sus imágenes de manera más rápida.
Estabilidad
Personalmente no he tenido, si recuerdo bien, ningún cuelgue mientras pintaba. He notado un buen comportamiento con imágenes de 6000px de ancho, como la que encabeza este post. También tengo que decir que ahora uso tanto Windows 10 como Linux con kde neón o sea que es una gozada poder tener Krita en los dos sistemas.  
Al final del artículo te dejo 2 enlaces. 1º A la noticia oficial de lanzamiento donde puedes ver mucha más info y 2º un enlace las release notes o en spanish las "cosillas guenas que han metido en la saca"

Ahora la última palabra la tienes tú. Si te gusta y lo ves útil para tu trabajo pues dale duro y exprime Krita. Seguro que me dejo algunas cosas por enseñar :D. Y tú? ¿Para que vas a utilizar Krita 4.0? ¿Qué es lo que más te ha gustado de esta nueva versión?

Lunes 19 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Presenta tu charla para Akademy-es 2018 de Valencia

Hace tiempo que se anunció la sede y desde ese momento el blog va dando los detalles necesarios para ir abriendo boca.. Y es que en poco más de mes y medio se celebrará en Valencia la reunión anual en España de usuarios y desarrolladores de KDE, Akademy-es 2018. Concretamente se celebrará del 11 al 13 de mayo y es el momento de seguir preparando el programa. Como el evento es una celebración comunitaria se abrió en el momento del anuncio de la sede la posibilidad de que todo el mundo, además de acudir,  participara de forma activa. Así que presenta tu charla para Akademy-es 2018 de Valencia y muestra a toda el mundo tu proyecto personal o comunitario.

Presenta tu charla para Akademy-es 2018 de Valencia

Recordemos que en Akademy-es se realizarán las típicas charlas que presentan las novedades tanto de las aplicaciones como de las herramientas de programación, sin olvidar de los proyectos activos o de aquellos de los que se quieren lanzar en un futuro cercano.

En anteriores ediciones en estas charlas (extraído del programa de Akademy-es 2017 de Almería) descubrimos KDE,  nos pusimos a colaborar con KDE, conocimos la asociación KDE España, aprendimos más de Plasma 5, vimos pinceladas de un posible futuro de KDE, aprendimos como colaborar con KDE sin ser programador, conocimos mejor la relación de Slimbook co KDE, aprendimos a hacer aplicaciones para el móvil y recibimos las primeras leccions de Qt.

¿Y qué encontraremos en esta edición? Pues depende de ti, ya que si tienes algún tema que crees que interesará a la Comunidad KDE y sus simpatizantes, no lo dudes a y presenta tu charla para Akademy-es 2018. Estaremos encantados en escuchar tu propuesta.

Si quieres más información, basta con que leas el siguiente texto oficial o que visites la web oficial de Akademy-es 2018, no obstante aquí te lo puedo contar yo:
Para proponer actividades se deberá enviar un correo a akademy-es-org@kde-espana.es antes del 31 de marzo con un resumen breve de la presentación.

Presenta tu charla para Akademy-es 2018Es importante tener en cuenta las siguientes consideraciones:

  • Se puede elegir entre dos formatos de charlas:
    • Charlas de 30 minutos.
    • Lightning talk de 10 minutos.
  • Si la duración de las charlas propuestas no se ajusta a ninguno de estos dos esquemas (por ejemplo, si se necesita más tiempo), esto debe indicarse claramente en la comunicación.
  • Se permitirá a KDE España la distribución bajo una licencia libre de todo el material utilizado para la realización de la actividad, así como de la grabación de la misma.
  • La charla puede ser tanto a nivel de usuario como de nivel técnico.

Se trata de una gran oportunidad de darte a conocer en el mundo KDE y en el mundo del Software Libre en general.

Más información: Akademy-es 2018

¿Qué es Akademy-es?

Akademy-es (#akademyes, que es la etiqueta para las redes sociales) es evento más importante para los desarrolladores y simpatizantes de KDE, que se ha ido celebrando desde el 2006 con éxito creciente.

En general, las Akademy-es son el lugar adecuado para conocer a los desarrolladores, diseñadores, traductores, usuarios y empresas  que mueven este gran proyecto.

En ellas se realizan ponencias, se presentan programas, se hace un poco de caja para los proyectos libres (camisetas, chapas, etc) pero sobre todo se conoce a gente muy interesante y se cargan baterías para el futuro.

Podéis repasar las anteriores ediciones en estas entradas del blog:

Domingo 18 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Noticias linux 02, tercer domingo de marzo de 2018

Esta semana sigue la sección que inicié de forma no oficial ya hace más de un mes y que se dedica a mostrar las novedades del mundo GNU/Linux que no aparecen en el blog por falta de tiempo y que deberían aparecer. Así que os doy la bienvenida a Noticias linux 02, correspondiente tercer domingo de marzo de 2018 con Firefox, Kubuntu, Plasma 5.12.3 y editores multimedia GNU/Linux

Noticias linux 02, tercer domingo de marzo de 2018

La semana de las mil actividades ha llegado a su fin, dejándome a las puertas de otra un poco más relajada en cuanto a obligaciones laborales, pero llena de tareas que hacer para poder sobrevivir a este tercer trimestre que llega.

Así que aprovecho la tranquilidad de este domingo para seguir con la nueva sección de Noticias Linux, que llega a su segunda edición, compartiendo noticias que han aparecido en otros blogs o webs y que hubiera estado genial que aparecieran en éste.

Firefox lanza su versión 59

Mientras esperamos que madure Falkon, los usuarios de la Comunidad KDE podemos seguir utilizando Firefox, el gran explorador web, que sigue mejorando y evolucionando.

Según podemos leer en Genbeta, el pasado 13 de marzo fue lanzado Firefox 59, una nueva versión del excelente explorador (disponible ya en las principales distribuciones GNU/Linux) que nos ofrece las siguientes novedades:

  • Tiempos de carga de página más rápidos.
  • Posibilidad de arrastrar y soltar nuestros “sitios favoritos en Firefox Home (la pantalla que aparece si creamos una nueva pestaña)
  • Posibilidad de desactivar la notificación que indica que una web está intentando acceder a la cámara.

Más información: Firefox

Plasma 5.12.3 ya disponible para Kubuntu 17.10

Noticias linux 02Los usuario de Kubuntu 17.10 están de enhorabuena. Según leemos en Ubunlog, ya está disponible la versión de Plasma 5.12.3 para sus escritorios.

Para hacerlo debéis activar los repositorios backports, abriendo una konsola y escribiendo los siguientes comandos:

sudo add-apt-repository ppa:kubuntu-ppa/backports -y
sudo apt update && sudo apt full-upgrade
Pero alerta, como dicen en el Ubunlog “Si tenemos una versión anterior a Kubuntu 17.10, no solo se actualizará el escritorio sino también la distribución
Más información: Kubuntu

Los 10 mejores editores Multimedia

Y finalizo esta entrada de Noticias Linux 02, con otra mención a un blog que se ha convertido en imprescindible para cualquier simpatizante del Software Libre: Maslinux.

En esta ocasión nos ha obsequiado con un recopilatorio de los 10 mejores editores multimedia GNU/Linux:  A modo de resumen, los mejores editores en orden de aparición son: Shotcut, VidCutter, FlowBlade, Kdenlive, Blender, Openshot, Cinelerra, Pitivi, Ardour y Rosegarden.
Y como siempre digo, son todos los que están, pero no están todos los que son. ¿Qué noticia os ha llamado la atención esta semana? Ponedlo en los comentarios y mejores esta entrada.

 

 

 

 

Sábado 17 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Helium 8, un nuevo tema para Plasma

Volvemos a tema de diseño al blog con Helium 8, un nuevo tema para Plasma de tono grisáceo y ligero. Una gran creación de David Linares, conocido como @mcder3 que sigue ofreciéndonos diseños muy cuidados.

Helium 8, nuevo tema para Plasma

Los temas para el escritorio Plasma de la Comunidad KDE son sutiles pero importantes. La verdad es que todos se parecen mucho inicialmente, pero una vez instalados y tras un poco tiempo de uso ves las diferencias y decides si te gusta o no.

Y esto es así porque aunque los cambios son sutiles, abarcan a todo el sistema: iconos de la bandeja del sistema, pantalla de apagado, reinicio o cambio de usuario, animaciones al ejecutar aplicaciones, decoraciones de plasmoide, etc.

Es por ello, que me complace presentaros la nueva creación de David Linares (aka @mcder3) con la que tendremos un Plasma, como con todos sus diseños, elegante y ligero, con transparencias adecuadas y con un tono grisáceo.

Helium 8

 

También es de detacar su pantalla de salida y las animaciones con toques azulados cuando se ejecutan aplicaciones y se colocan en la barra de tareas. Todo muy sencillo pero visualmente muy atractivo.

 

Y como siempre digo, si os gusta el tema Helium 8 para Plasma podéis “pagarlo” de muchas formas, desde donaciones a mcder pasando por todo tipo de acciones en la página de KDE Store, que estoy seguro que el desarrollador lo agradecerá: puntúale positivamente, hazle un comentario en la página o realiza una donación. Ayudar al desarrollo del Software Libre también se hace simplemente dando las gracias, ayuda mucho más de lo que os podéis imaginar, recordad la campaña I love Free Software Day 2017 de la Free Software Foundation donde se nos recordaba esta forma tan secilla de colaborar con el gran proyecto del Software Libre y que en el blog dedicamos un artículo.

Más información: KDE Store

Martes 13 de marzo de 2018

TutorialesLinux.com: Herramientas de análisis de tráfico

Domingo 11 de marzo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios

icono de php Ya yenemos Laravel 5.6 instalado en alguno de los dos entornos que hemos visto antes. ¿Qué sigue? Lo primero, entender un poquito la estructura de directorios que nos ha creado composer. Sólo lo imprescindible. El resto lo iremos viendo a medida que avanzamos.

josemaria@valeria /var/www/html/prueba $ ls -la
total 236
drwxr-xr-x 12 root www-data   4096 mar  9 19:31 .
drwxr-xr-x  3 root www-data   4096 mar  9 18:29 ..
drwxr-xrwx  6 root www-data   4096 ene  3 17:52 app
-rwxr-xrwx  1 root www-data   1686 ene  3 17:52 artisan
drwxr-xrwx  3 root www-data   4096 ene  3 17:52 bootstrap
-rw-r--rw-  1 root www-data   1413 ene  3 17:52 composer.json
-rw-r--rw-  1 root www-data 143565 mar  8 07:37 composer.lock
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 config
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 database
-rw-r--r--  1 root www-data    612 mar  9 19:31 .env
-rw-r--r--  1 root www-data    565 ene  3 17:52 .env.example
-rw-r--r--  1 root www-data    111 ene  3 17:52 .gitattributes
-rw-r--r--  1 root www-data    146 ene  3 17:52 .gitignore
-rw-r--rw-  1 root www-data   1125 ene  3 17:52 package.json
-rw-r--rw-  1 root www-data   1040 ene  3 17:52 phpunit.xml
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 public
-rw-r--rw-  1 root www-data   3550 ene  3 17:52 readme.md
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 resources
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 routes
-rw-r--rw-  1 root www-data    563 ene  3 17:52 server.php
drwxrwxrwx  5 root www-data   4096 ene  3 17:52 storage
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 tests
drwxr-xrwx 36 root www-data   4096 mar  8 07:38 vendor
-rw-r--rw-  1 root www-data    549 ene  3 17:52 webpack.mix.js

El directorio public ejerce de DocumentRoot. Allí encontraremos el index.php que da entrada a nuestra aplicación web así como las hojas de estilos, etc. El fichero .env que vemos aquí arriba en el directorio raiz de nuestra aplicación es el fichero de configuración principal. De hecho, puesto que vamos a empezar a trabajar con bases de datos en este momento podemos aprovechar para editar las siguientes directivas:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secreto

Importante: aunque usemos mariadb la directiva DB_CONNECTION debe de ser mysql porque Laravel no entiende otra y, a fin de cuentas, ambas son compatibles a nivel binario. Para que Laravel sea capaz de hacer uso de esa base de datos debemos de crearla. A ella y al usuario que le hemos dicho que va a usar para manejarla. Entramos en nuestro gestor (mysql o mariadb) y ejecutamos lo siguiente:

CREATE DATABASE laravel;
CREATE USER laravel@localhost IDENTIFIED BY 'secreto';
GRANT ALL ON laravel.* TO laravel@localhost;

Vamos ahora a crear nuestro sistema de autenticación. Laravel viene ya con un módulo llamado User.php que reside en el directorio app. Para generar el resto de lo que necesitamos ejecutamos lo siguiente:

php artisan make:auth
php artisan migrate

La primera línea crea el código y rutas necesario para la gestión de usuarios. En particular, creará o modificará los siguientes ficheros:

routes/web.php
resources/views/auth/login.blade.php
resources/views/auth/register.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php

La segunda instrucción crea la estructura de tablas necesaria en la base de datos que hemos configurado previamente. Si ahora volvemos a cargar la web de nuestro aplicación veremos que en la esquina superior derecha tenemos dos nuevos enlaces correspondientes a las funcionalidades de Login y Registro:

Laravel 5.6 con la funcionalidad de login y registro

Las pantallas de registro y login por defecto son estas:

Pantalla de registro en Laravel 5.6
Pantalla de login en Laravel 5.6

Y una vez hecho login vemos que en la barra de menú se nos identifica con nuestro nombre de usuario y tenemos la posibilidad de cerrar sesión:

Logout en Laravel 5.6

Si le echamos un vistazo a “las tripas” vemos que nos ha creado dos tablas una de las cuales, la de usuarios, es la que guardará la información relativa a los registros de usuarios.
Tablas creadas por Laravel 5.6 para la autenticación de usuarios

Además, tal y como está mandado, vemos que no almacena las contraseñas en claro sino un hash de las mismas:

hash de las passwords en Laravel 5.6

La castellanización de los recursos es tan sencilla como editar alguno de los ficheros php que hemos indicado anteriormente. Por ejemplo, el fichero login.blade.php es el que contiene la ventana de login y register.blade.php la de registro. Con muy poco esfuerzo tendremos las ventanas anteriores en perfecto castellano. Pero eso ya os lo dejo a vosotros 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios || Hospedado en un Cloud VPS de Gigas.

Jueves 01 de marzo de 2018

TutorialesLinux.com: Vulnerabilidad en Memcached (DDoS), cómo solucionarla.

Martes 27 de febrero de 2018

BlogDRAKE: Caída de Blogdrake

Sábado 24 de febrero de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Viendo la degradación de la batería de un portátil

Las baterías de los portátiles, móviles y otros dispositivos van perdiendo capacidad con el tiempo. Esta pérdida de capacidad la podemos comprobar con diversas herramientas.

Por ejemplo, con la aplicación de gestión de la batería de LXQt se puede ver la siguiente captura:

En esta captura se puede comprobar que en el diseño original tenía una capacidad de 51.50Wh. Actualmente tiene 45.44Wh, por lo que su capacidad total se ha reducido, está al 88% de su capacidad inicial, es decir ha perdido un 12% en los 4 años que lleva en uso. Realmente si la batería estuviera totalmente vacía o totalmente llena se degradaría más rápido, por lo que la electrónica no debería dejar que la batería se llene o vacíe totalmente.

En siguiente parámetro es “Energy rate”. Muestra la energía que está entrando o saliendo de la batería en el momento actual. Según se ve, el portátil está consumiendo 10.22W en el momento de hacer la captura. Cuando el portátil está cargando, muestra la energía que está entrando en la batería y es fácil ver valores de 30W, aunque esta potencia que entra en la batería va bajando según se va llenando.

En la siguiente captura se puede ver que el “Energy rate” vale 0W:

En esta situación la batería está cargada y el portátil conectado a corriente eléctrica, por lo que no entra ni sale energía de la batería.

Consultar la degradación vía terminal

Usando el terminal del Linux es posible consultar la degradación de la batería y otras características visitando la carpeta /sys/class/power_supply/. Dentro de esta carpeta hay archivos que se pueden consultar para ver la capacidad, el voltaje o la intensidad eléctrica que está entrando o saliendo la batería.

Evolución de la degradación y tratando de evitarla

En teoría las baterías nuevas se degradan un poco, luego bajan linealmente para, finalmente, morir rápidamente. Más información se puede encontrar en el siguiente enlace:

http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries

La primera conclusión que se obtiene del artículo anterior es: no se puede evitar la degradación de la batería. Lo que sí se puede hacer es que esta degradación vaya más despacio.

Dentro de la batería se producen multitud de reacciones químicas. La mayoría de ellas interesan, pero hay otras que no. Se suele recomendar no cargar la batería más allá del 80% y no dejar que su nivel baje del 20%. Si se llena o vacía la batería completamente, comienzan estas reacciones químicas que no interesan. Es mejor pequeñas cargas y descargas que llenarla y vaciarla completamente. Si el fabricante ha sido responsable, habrá dejado un margen de la batería que no podréis usar, este margen es para evitar la degradación.

La temperatura es también un factor importante. Las temperaturas muy altas, degradan las baterías a mayor velocidad. Por esta y otras causas, siempre vais a leer que no hay que dejar los dispositivos electrónicos al Sol o bajo otras fuentes de calor.

Cuando la temperatura de la batería es baja, su desempeño empeora. Pero esta situación en un portátil va a ser difícil que se dé.

Curiosidades

En Internet se puede encontrar información de portátiles o teléfonos que han explotado. Esto ha sido investigado y se debe a que se forman dendritas dentro de la batería que acaban formando cortocircuitos y provocando que se incendien:

https://computerhoy.com/noticias/hardware/esto-es-que-provoca-que-exploten-baterias-metal-litio-52834

Otra curiosidad son las baterías de Ni-Fe que no sufren ningún tipo de degradación. Pueden llegar a durar más de 20 años y no sufrir ni el 2% de degradación. Y como extra su reciclaje es muy simple:

https://en.wikipedia.org/wiki/Nickel%E2%80%93iron_battery

Su punto débil, su peso y volumen. Pero se pueden usar para otros usos como instalaciones solares en los que los paneles recargan las baterías cuando hay Sol y se obtiene la electricidad cuando es de noche:

http://www.zappworks.com/battery_prices.htm

Como veis en el anterior enlace los precios son prohibitivos.

Ya se comienzan a escuchar otras tecnologías novedosas como las baterías de ánodo de grafeno, de electrolito sólido, Litio-azufre,…

Habrá que esperar para ver cuál de ellas acaba desarrollándose de forma definitiva.

Jueves 22 de febrero de 2018

BlogDRAKE: Dianara 1.4.1 en el repositorio de BlogDrake

Martes 20 de febrero de 2018

Lenin Hernandez

Lenin Hernandez
Leninmhs

Como enviar correos desde Perl usando Gmail

En esta entrada tendremos realizaremos el envió de correo desde el SMTP de Gmail usando el lenguaje de programación Perl para realizar esta tarea, específicamente usando el modulo Email::Sender. Perl es un lenguaje muy común para escribir scripts, por lo cual, es muy útil poder enviar de correos electrónico desde el. En Perl existen varias … Sigue leyendo Como enviar correos desde Perl usando Gmail

Lunes 19 de febrero de 2018

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

BITDEFENDER ANTIVIRUS SCANNER EN FEDORA 27

BitDefender Antivirus Scanner for Unices, un antivirus de BitDefender y que se puede utilizar gratuitamente.

La página de descarga es:

https://www.bitdefender.es/business/antivirus-for-unices.html

Después deberemos solicitar una licencia gratuita por un año, esta parte si que está visible desde el enlace Solicite licencia gratuita, que nos mandará una clave a nuestro email.

Una vez descargado, simplemente ejecutamos (sin olvidarnos de hacerlo ejecutable), como root:

sh BitDefender-Antivirus-Scanner-7.7-1-linux-amd64.rpm.run

Seguimos las instrucciones de la terminal, incluyendo escribir la palabra accept e indicando que queremos instalar también la interfaz gráfica.

El software ha sido discontinuado desde principios de 2016. Esta versión 7.7.1, data de noviembre de 2014, que en software antivirus es un mundo, las firmas siguen actualizándose diariamente, esencialmente son las mismas que usan otros productos de BitDefender, así que ningún problema.

Como habéis podido ver, además tiene versión nativa de 64 bits, que es de las cosas que más me gustan en BitDefender.

Si te has registrado con anterioridad y tienes licencia, puedes descargarlo directamente de:
https://download.bitdefender.com/SMB/Workstation_Security_and_Management/BitDefender_Antivirus_Scanner_for_Unices/Unix/Current/EN_FR_BR_RO/Linux/

Para evitar errores y que se carguen los motores antivirus, una vez instalado hay que ejecutar estos dos comandos, como root:

ln –force –symbolic /opt/BitDefender-scanner/var/lib/scan/Plugins /opt/BitDefender-scanner/var/lib/scan/Plugins/plugins
(todo lo anterior en la misma linea, pues es un único comando)

ll /opt/BitDefender-scanner/var/lib/scan/Plugins/plugins

Con ello ya se puede arrancar el programa, proceder al cambio de licencia (la consta es la de evaluación), actualizar las firmas y comenzar el escaneo.

Martes 13 de febrero de 2018

Ramón Miranda

Ramón Miranda
Ramon Miranda

Round 2. Visual Experiment for Krita 4.0 new layout proposal

Round2.

Virtual Deleted (for now) 44 brushes,  88 left.

virtual deleted bruhes.

How i decide what to remove? well i have tried to get the more visual pleasant and useful combination. My focus is what people could expect the first time krita opens. and make the experience as much comfortable as possible. No knowledge of tools or brushes are needed.
So if you like the idea here we go.

This is a document with lot of info, not for begginers even when they can learn some tips here and there, but lot of terminology is present.

You are going to see lot of “IMO”( in my opinion). Of course you can disagree totally or not. I expose my ideas based on my own experience and i hope this help, if you like flames i am not you man ;)
Also you will need this image to follow the numbers.
  • 1 it can be changed by eraser soft. They do basically the same, erase softly. the Airbrush erase don´t use the Airbrush feature. Also imo is not a good idea put an eraser as the first brush in the default pack.If you(begginer) try it in a blank layer you can see nothing is happening and think the software is bad or the tool is not working.
  • 3 The “noise” size controlled by density can’t be modified In big canvas sizes. This could be make the noisy effect invisible or not perceptible.
  • 4 Airbrush pressure is a redundant term. It would be like the tipical Airbrush. Added 2 instead, Airbrush linear i would remove linear.
  • 7 we have a lot of “wetpaint” colorsmudge brushengine based brushes. 
  • 9 Gaussian term is not a common word to describe behavior in brushes. It is slow and Soft curve can do the same and more imo.
  • 12 The Soft thing is not enough for me to be as brush.
  • 14 Added 20 instead. If the tablet has no tilt options, we can use RMB to change angle.
  • 22,26, 27 Added 24 instead.I wish to control the size of bristles and the scale of them. nowadays they are always 1px width wich is nice for low res but is useless for highres images. 6000px wide.
  • 38, 39, 40 i can’t see practical uses. Maybe sketching. Added 37 to have a sample of this brushengine. I would add to the “specials” category
  • 44 added 45 instead in “ink” category. It is only to fill big areas, it could be replaced by 86 or 87. The tip can be changed to be square to be more usable in squared surfaces just changing the brush tip to square.
  • 46 Slow and nowadays we have another Blender Blur wich is soft. If DOF is what we need i would put it in FX or Distort Category
  • 51 There is a newer version for krita4. WIP
  • 55, 56, 57 Added 53, 54 instead in Texture category
  • 60 It can be replaced by 63. The ink stroke
  • 62, 64 Very small imo. Added 63 instead
  • 65 added 68 instead.
  • 69, 70, 71,72 i consider them as basic brushes. 69 or 71 can be replaced for 20. 70 can be replaced by basic brush with opacity by pressure. 72 can be replaced by ink brush just to take notes. 
  • 77 added 78 instead . Is texture controlled by pattern in Basic category
  • 94 Added 93 instead. We can control opacity by the upper menu slider or RMB. it would be great to have opacity by pressure or gradient as original Alchemy software.
  • 97,98,99,100,101,102,103,104,105. added 95, 96 as representation of the Sketchbrushengine. Shows basic features. Too much variation of the same brush engine (11 brushes). The pencil icon is not very intuitive. Size doesn’t control real size but Area to be affected and this is not usual behavior but special behavior in sketch brushengine. This can confuse some users.
  • 115 Useless imo. Only show change on color dynamics.The sorrounder brushes are very different. And the icon is related to dry technique like pastel so this could be confusing. 
  • 117 Added 120 (Blending cat. “Particle” Effect that blends color.)
  • 123 Added 118, 121 instead
  • 129 It is not related with nature neither texture. Random in rotation makes very hard to predict results. And useless imo.


That's all for the Round 2. Could i remove more brushes? could i simplify a bit more but without loosing quality and options for the user? maybe in Round 3 . Sharing and comments are apreciated as always. more feedback means better software

Jueves 01 de febrero de 2018

Curso: Gestión de proyectos Software con Git y GitHub

Independiente si te mueves por el mundo del desarrollo, la administración de servidores o simplemente eres una mente inquieta en...

La entrada Curso: Gestión de proyectos Software con Git y GitHub aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Miércoles 31 de enero de 2018

Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e IOS (8ª edición)

Retomamos las publicaciones en la web para hablaros de la próxima edición del curso gratuito Desarrollo en HTML5, CSS y...

La entrada Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e IOS (8ª edición) aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Lunes 22 de enero de 2018

TutorialesLinux.com: Borrar un volumegroup y extender el principal

Jueves 18 de enero de 2018

Bruno Exposito

Bruno Exposito
The Linux Alchemist

Comando chown – Cambiar el propietario

El comando chown (change owner) permite modificar el dueño de uno o varios ficheros o carpetas.

Está instalados en todas las distribuciones GNU/Linux, dentro del paquete coreutils.

Puedes consultar el listado de usuarios en el fichero /etc/passwd usando el siguiente comando:

 cat /etc/passwd | cut -d ':' -f1

 

chown

Sintaxis de chown

sudo chown {{dueño}}:{{grupo}} {{nuevodueño}} {{fichero-o-carpeta}}

Opciones de chown

-c, –changes Igual que la opción “verbose” pero solo si hay cambios
-f, –silent, –quiet Omite la mayoría de los mensajes de error
-v, –verbose Muestra el resultado de cada fichero procesado
–dereference Afecta a la referencia del enlace simbólico, en lugar del enlace simbólico en si (opción por defecto).
-h, –no-dereference Afecta al enlace simbólico, en lugar de la referencia a la que apunta.
–from=DUEÑO_ACTUAL:GRUPO_ACTUAL Cambia el dueño y/o grupo del fichero solo si el actual dueño y/o grupo coincide con el especificado.
Cualquiera de los dos puede ser omitido.
–no-preserve-root No trata “/” de manera especial (por defecto)
–preserve-root Falla al intentar operar recursivamente sobre “/”
–reference=RFILE Cambia la propiedad de file a la del fichero rfile.
-R, –recursive Se ejecuta sobre ficheros y directorios recursivamente
-H *Si es un enlace simbólico a un directorio, entra en el.
-L *Atraviesa todos los enlaces simbólicos a directorios que encuentre.
-P *No atravesar enlaces simbólicos (por defecto)
-v, –verbose Muestra el resultado de cada fichero procesado
–help Muestra la ayuda
–version Muestra la versión y licencia

* Se utiliza junto con el modificador -R

Cambiar el dueño de un fichero

Sintaxis

sudo chown {{usuario}} {{fichero}}

Ejemplos

sudo chown jose documento.txt

El fichero documento.txt que está dentro del directorio actual pasa ser propiedad del usuario jose.

sudo chown juan /home/bruno/Documentos/Reporte.pdf

El fichero Reporte.pdf pasa a ser propiedad del usuario juan, con independencia del directorio en el que te encuentres.

sudo chown pedro ~/Imágenes/foto.jpg

El fichero foto.jpg dentro de /home/TuUsuario/Imágenes pasa a ser propiedad de pedro.

sudo chown francisco “/home/bruno/Documentos/fichero con espacios.odt”

El fichero “fichero con espacios.odt” pasa a ser propiedad de francisco. Si el fichero o alguna carpeta tienen espacios debe estar entrecomillado.

Cambiar el dueño de todos los ficheros recursivamente

Sintaxis

sudo chown -R {{usuario}} {{carpeta}}

Ejemplos

sudo chown -R juan Imágenes

La carpeta Imágenes, y todos los ficheros/carpetas que están dentro (-R) pasan a ser propiedad de juan.

sudo chown -R jose “/home/bruno/Mis Imágenes”

La carpeta Mis Imágenes y todo su contenido pasa a ser propiedad de jose

sudo chown -R vicente ~/Imágenes

Mi carpeta /home/MiUsuario/Imágenes y todo su contenido pasa a ser propiedad de vicente.

Cambiar el dueño de todos los ficheros y carpetas del directorio actual que pertenecen a un determinado usuario.

Sintaxis

 sudo chown --from={{dueñoactual}} {{nuevodueño}} *

Ejemplos

sudo chown –from=jose bruno *

Todos el contenido del directorio actual que pertenezca a jose pasa a ser propiedad de bruno.

sudo chown –from=bruno fernando *

Todo con contenido del directorio actual propiedad de bruno pasa a ser propiedad de fernando.

Cambiar recursivamente el dueño de todos los ficheros y carpetas del directorio actual que pertenecen a un determinado usuario.

Sintaxis

 sudo chown -R --from={{dueñoactual}} {{nuevodueño}} {{carpeta}}

Ejemplos

sudo chown -R –from=jose bruno Documentos

Todos los fichero y directorios dentro de la carpeta Documentos (-R) que eran propiedad de jose pertenecen ahora a bruno.

sudo chown -R –from=juan bruno /home/juan/

Todos los ficheros y directorios dentro de /home/juan (-R) que eran propiedad de juan pertenecen ahora a bruno.

sudo chown -R –from=vicente jose .

Todos los ficheros y directorios del directorio actual (.) que eran propiedad de vicente pertenecen ahora a jose.

Cambia el dueño de todo el contenido de una carpeta si el actual dueño y grupo coincide con el especificado.

Sintaxis:

sudo chown -R --from={{dueño}}:{{grupo}} {{nuevodueño}} {{carpeta}}

Ejemplos:

sudo chown -R –from=juan:consultores javi Imágenes

La carpeta Imágenes y su contenido, cuyo dueño es juan y pertenece al grupo consultores es ahora propiedad de javi.

sudo chown -R –from=bruno:administradores paco ~

Tu carpeta /home/TuUsuario (~) y su contenido, propiedad del usuario bruno y que pertenece al grupo administradores pasa a ser propiedad de paco.

sudo chown -R –from=bruno:administradores jose /home/bruno

El directorio /home/bruno y su contenido,

Búsquedas complejas: find + chown

Para búsquedas mas complejas es posible usar el comando chown con find, ya que find permite realizar búsquedas por nombre, fecha, tipo, tamaño, etc

sudo find . -iname “*.txt” -exec chown bruno {} \;

Busca todos los archivos con extensión txt y les cambia el propietario a bruno.

sudo find . -type d -exec chown bruno {} \;

Busca todos los directorios (-type d) y les cambia el dueño a bruno.

Miércoles 10 de enero de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Desactivando los parches para los fallos en las CPUs de Intel en Linux

Los recientes fallos de seguridad en las CPUs de Intel llamados Meltdown y Spectre, han obligado modificar los sistemas operativos. Esto causa que los procesadores afectados lleguen a perder de un 5% hasta un 30% de rendimiento en la realización de ciertas tareas.

En determinados casos es un gran inconveniente. Existen situaciones en los que el usuario puede gestionar el riesgo de forma que, a costa de perder ese extra de seguridad, gane en rendimiento. Un ejemplo, supongamos que hay un grupo de científicos realizando cálculos matemáticos. Supongamos también que este grupo de científicos realizan sus cálculos en equipos aislados, de forma que no tienen interacción con otros equipos ni conexión con Internet. Perfectamente podrían deshabilitar los parches y continuar con sus cálculos con ese extra de rendimiento.

Otra situación: disponemos de un portátil. Cuando estemos navegando por Internet es totalmente necesario tener activado las protecciones frente a Meltdown y Spectre (y todas las medidas de seguridad que se nos ocurran). Supongamos ahora que nos vamos de viaje y no tenemos red (incluso puede que no tengamos ni posibilidad de conectarnos), suponamos que tenemos totalmente controlados los programas que vamos a ejecutar en ese tiempo y su procedencia. ¿No sería lógico desactivar dichas protecciones y así, posiblemente, ganar un de un 5% hasta un 30% más de rendimiento y de batería?

Lo que vamos a buscar aquí es cómo se deshabilitan dichas protecciones y qué condiciones podemos usar un equipo, con las protecciones desactivadas de forma segura.

¿Cómo se desactivan las protecciones?

Para desactivar estas opciones, hay que arrancar el ordenador y cuando aparezca el grub solicitando el sistema que queremos arrancar, pulsaremos la tecla e. Aparecerá un editor de texto. En este editor buscamos la línea que arranca el kernel y se le añade la opción “pti=off”. Es decir, al final tendremos que tener una línea similar a:

linux   /boot/vmlinuz-4.4-x86_64 root=UUID=a56... rw  quiet pti=off

Para comprobar si la protección ha sido desactivada, se debe teclear en un terminal.

dmesg | grep 'page tables isolation'

Si aparece la respuesta:

Kernel/User page tables isolation: disabled

es que la protección está deshabilitada y se tendrá el extra de rendimiento.

Evidentemente es más cómodo introducir una nueva entrada en el Grub de forma que podamos elegir entre un sistema seguro o un sistema un poco más rápido en el momento de arrancar.

¿Cuándo se debe deshabilitar estos parches?

Respuesta corta: Nunca.

He estado haciendo pruebas en mis equipos y para las tareas de oficina, programar/compilar, navegar o juegos, no parece que haya una pérdida de rendimiento acusada.

Tened en cuenta que por el sólo hecho de visitar una página web y que tengas un fallo en el navegador, te pueden infectar y usar tu sistema para minar bitcoin, obtener tus contraseñas,…

Como conclusión final sólo decir que el hecho de conocer cómo se desactivan estas protecciones conlleva la responsabilidad de saber usarlo sabiamente.

Espero que os sea útil.

Miércoles 27 de diciembre de 2017

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

Prueba

Esto es una prueba.

Realizada con el cliente de sobremesa WordPress.

Trabajar con archivos PDF en Linux

PDF (sigla del inglés Portable Document Format, «formato de documento
portátil») es un formato de almacenamiento para documentos digitales
independiente de plataformas de software o hardware.

Los documentos son de tipo compuesto (imagen vectorial, mapa de bits y
texto).

Actualmente es de los mas usados para el intercambio de información.

En Linux existen programas para crear y editar documentos en dicho formato.

En estos momentos el sistema operativo que uso es Fedora 27 x86_64 KDE.

Mis herramientas principales son:

Visor de archivos: Okular.

Edición de documentos: MasterPDF Editor, LibreOfficeDraw y Xournal.

Creación de archivos PDF: LibreOffice(extensión pdfimport),

MasterPDF Editor y CUPS-pdf.

Formularios (principalmente cumplimentarlos): Okular. y

MasterPDF Editor.

Se pueden crear escaneando un documento o una imagen.

Para el escaneo, aunque  al instalar el driver de la multifunción ya
incorpora su programa, el que uso es Xsane,
un software bastante veterano, pero muy completo. Permite escanear desde el
alimentador automático y desde la base de escaneo. Salida en varios
formatos: PDF, jpeg, gif, png, bmp, etc. Multipágina o página
individuales.  Enviar a la impresora o al fax.

La multifunción es una Epson, y el programa de escaneo es “Image Scan! for
Linux”, que es muy simple, y efectivo, pero con un defecto, tiene una falta
de compatibilidad con el formato PDF. Lo he comprobado al aplicar un script
para comprimir ficheros de gran tamaño. Siempre me daba errores, lo que no
ocurre con Xsane.

La mayoría de los programas anteriores se encuentran en los repositorios de
gran parte de las distribuciones Linux.

Master PDF
Editor
es software propietario. Está desarrollado por Code
Industry
. En Linux se puede utilizar libremente, sin fines
comerciales, por ejemplo para propósitos educativos o personales. Para otros
fines habría que adquirir la respectiva licencia.

Para ver las características mas importantes lo mejor es consultar esta entrada
de El atareao.

Aunque ya tiene unos meses, ha habido pocos cambios.

El principal problema que nos encontramos en Linux con los archivos PDF es
el de la firma digital.

El único programa que tiene incorporado todo para la misma es Adobe Acrobat.
Para Windows y, creo que también, para Apple y Android.

En Linux, la versión que hay es antigua y de 32 bits. Discontinuada por
Adobe.

No trae soporte para firma digital.

Tengo la costumbre de escanear con alta resolución, normalmente 300 dpi, con
lo cual los archivos son de gran tamaño. Para optimizarlos suelo empelar un
scrip que encontré hace tiempo, y no me acuerdo dónde.

Lo tengo en un fichero ejecutable: comprimepdf.sh

El contenido es el siguiente:

#!/bin/sh

dpi=72

if [ $# -lt 2 ]

then

echo “usage: $0 input output [dpi]”

exit 1

fi

if [ $# -gt 2 ]

then

dpi=$3

fi

echo “Shrinking document…”

gs  -q -dNOPAUSE -dBATCH -dSAFER \

-sDEVICE=pdfwrite \

-dCompatibilityLevel=1.3 \

-dPDFSETTINGS=/screen \

-dEmbedAllFonts=true \

-dSubsetFonts=true \

-dColorImageDownsampleType=/Bicubic \

-dColorImageResolution=$dpi \

-dGrayImageDownsampleType=/Bicubic \

-dGrayImageResolution=$dpi \

-dMonoImageDownsampleType=/Bicubic \

-dMonoImageResolution=$dpi \

-sOutputFile=$2 \

$1

#sh comprimepdf.sh ~/input.pdf ~/output.pdf 150

Este último párrafo es la orden para ejecutarlo.

El modificador 150, se puede cambiar para aumentar o disminuir la
resolución.

Es muy efectivo. Archivos de mas 10 MB los reduce a 200 o 300 Kb. sin
afectar a su calidad.

Es necesario tener instalado Ghostscript
para que funcione.

Existe un script, que en Fedora se puede instalar desde los repositorios, shrinkpdf.sh,
pero después de utilizar ambos, prefiero el primero.

Trabajar con archivos PDF en Linux

PDF (sigla del inglés Portable Document Format, «formato de documento
portátil») es un formato de almacenamiento para documentos digitales
independiente de plataformas de software o hardware.

Los documentos son de tipo compuesto (imagen vectorial, mapa de bits y
texto).

Actualmente es de los mas usados para el intercambio de información.

En Linux existen programas para crear y editar documentos en dicho formato.

En estos momentos el sistema operativo que uso es Fedora 27 x86_64 KDE.

Mis herramientas principales son:

Visor de archivos: Okular.

Edición de documentos: Master
PDF Editor
, LibreOffice
Draw
y Xournal.

Creación de archivos PDF: LibreOffice
(extensión pdfimport)
, Master
PDF Editor
y CUPS-pdf.

Formularios (principalmente cumplimentarlos): Okular. y Master
PDF Editor
.

Se pueden crear escaneando un documento o una imagen.

Para el escaneo, aunque  al instalar el driver de la multifunción ya
incorpora su programa, el que uso es Xsane,
un software bastante veterano, pero muy completo. Permite escanear desde el
alimentador automático y desde la base de escaneo. Salida en varios
formatos: PDF, jpeg, gif, png, bmp, etc. Multipágina o página
individuales.  Enviar a la impresora o al fax.

La multifunción es una Epson, y el programa de escaneo es “Image Scan! for
Linux”, que es muy simple, y efectivo, pero con un defecto, tiene una falta
de compatibilidad con el formato PDF. Lo he comprobado al aplicar un script
para comprimir ficheros de gran tamaño. Siempre me daba errores, lo que no
ocurre con Xsane.

La mayoría de los programas anteriores se encuentran en los repositorios de
gran parte de las distribuciones Linux.

Master PDF
Editor
es software propietario. Está desarrollado por Code
Industry
. En Linux se puede utilizar libremente, sin fines
comerciales, por ejemplo para propósitos educativos o personales. Para otros
fines habría que adquirir la respectiva licencia.

Para ver las características mas importantes lo mejor es consultar esta entrada
de El atareao.

Aunque ya tiene unos meses, ha habido pocos cambios.

El principal problema que nos encontramos en Linux con los archivos PDF es
el de la firma digital.

El único programa que tiene incorporado todo para la misma es Adobe Acrobat.
Para Windows y, creo que también, para Apple y Android.

En Linux, la versión que hay es antigua y de 32 bits. Discontinuada por
Adobe.

No trae soporte para firma digital.

Tengo la costumbre de escanear con alta resolución, normalmente 300 dpi, con
lo cual los archivos son de gran tamaño. Para optimizarlos suelo empelar un
scrip que encontré hace tiempo, y no me acuerdo dónde.

Lo tengo en un fichero ejecutable: comprimepdf.sh

El contenido es el siguiente:

#!/bin/sh

dpi=72

if [ $# -lt 2 ]

then

echo “usage: $0 input output [dpi]”

exit 1

fi

if [ $# -gt 2 ]

then

dpi=$3

fi

echo “Shrinking document…”

gs  -q -dNOPAUSE -dBATCH -dSAFER \

-sDEVICE=pdfwrite \

-dCompatibilityLevel=1.3 \

-dPDFSETTINGS=/screen \

-dEmbedAllFonts=true \

-dSubsetFonts=true \

-dColorImageDownsampleType=/Bicubic \

-dColorImageResolution=$dpi \

-dGrayImageDownsampleType=/Bicubic \

-dGrayImageResolution=$dpi \

-dMonoImageDownsampleType=/Bicubic \

-dMonoImageResolution=$dpi \

-sOutputFile=$2 \

$1

#sh comprimepdf.sh ~/input.pdf ~/output.pdf 150

Este último párrafo es la orden para ejecutarlo.

El modificador 150, se puede cambiar para aumentar o disminuir la
resolución.

Es muy efectivo. Archivos de mas 10 MB los reduce a 200 o 300 Kb. sin
afectar a su calidad.

Es necesario tener instalado Ghostscript
para que funcione.

Existe un script, que en Fedora se puede instalar desde los repositorios, shrinkpdf.sh,
pero después de utilizar ambos, prefiero el primero.


Martes 14 de noviembre de 2017

Liher Sanchez

Liher Sanchez
El blog de Liher

Cómo crear un sitio web con un constructor de sitios web y un diseño listo

Si no eres bueno en el diseño, y tampoco eres un profesional del diseño de sitios web, podemos ofrecerte una manera más fácil de crear un sitio web. Tu sitio web nuevo no sólo será totalmente funcional, sino también atractivo, es decir, creado de acuerdo con todas las tendencias de moda del diseño web de hoy.

Un constructor web y una plantilla prediseñada te ayudarán a completar esta tarea difícil. Así pues, hoy vamos a hablar de las nuevas plantillas de sitios web de TemplateMonster que han sido desarrolladas especialmente para MotoCMS 3.0.

 

 

Las ventajas principales del constructor de sitios web de MotoCMS 3.0

La principal diferencia entre el motor de MotoCMS y otros sistemas de gestión de contenidos es la simplicidad y claridad del primero. Te permite editar plantillas simplemente arrastrando y soltando varios elementos de sus diseños.

Ahora no tienes que saber codificar, no se te obliga a programar nada o hacer otras cosas técnicas. Simplemente arrastra y suelta los elementos prediseñados, textos e imágenes y obten un diseño único y funcional.

En otros CMS normalmente se te ofrece sólo un panel de administración y una plantilla prediseñada. Y todo lo que puedes hacer en el panel es crear páginas y añadir contenidos a ellas.

Mientras tanto, MotoCMS incorpora un poderoso editor visual que te permite crear un diseño de plantilla único arrastrando y editando diferentes elementos preestablecidos.

Es decir, no tendrás que codificar nada y preocuparte por el rendimiento del sitio en caso de que algo salga mal en el código. Todas tus configuraciones y experimentos con el diseño se guardarán automáticamente y el código del sitio permanecerá perfecto y funcionará adecuadamente en cualquier navegador.

La creación de sitios web con el constructor web de MotoCMS tiene un montón de ventajas:

  • Facilidad y comodidad. Incluso un principiante inexperto no tendrá problemas con su uso.
  • No se requiere programar o codificar nada.
  • Una gran cantidad de plantillas de alta calidad.
  • Sistema de edición visual sencilla de arrastrar y soltar.
  • Selector de colores único.
  • Alta velocidad de carga de sitios web.
  • Plantillas adaptativas y creadas de acuerdo con todas las tendencias actuales del diseño web.
  • Optimización para SEO.
  • Versión de prueba gratuita de 14 días.

 

 

Presta atención al último punto. Puedes probar este constructor web completamente gratis, experimentar con los ajustes, construir tu propio diseño único y, a continuación, si te gusta el resultado, comprar el sitio web creado y transferirlo a tu propio alojamiento web. En este caso, no perderás ningún dato. Nos parece una opción muy buena y útil.

Además, el producto se te ofrece junto con el servicio de soporte técnico, por lo que siempre puedes solicitar ayuda, en caso de que te confundas en algo o no puedas entender algo. Podrás solicitar ayuda del equipo de asistencia técnica justo después del registro en el sitio y obtendrás respuesta a cualquier pregunta tuya.

Hay cinco secciones principales en el panel de control de MotoCMS 3.0:

  1. Pages/Páginas. Se te permite crear y editar fácilmente páginas del sitio, personalizar su apariencia y al mismo tiempo hacer la optimización para los motores de búsqueda (SEO).
  2. Design/Diseño. En esta sección, se te permite personalizar la parte visual del diseño, el diseño del texto, los fondos, los estilos y los widgets. Estos últimos, a su vez, tienen sus propios ajustes preestablecidos que puedes modificar fácilmente.
  3. Multimedia library/Biblioteca multimedia. Una sección especial para trabajar con todos los archivos multimedia: videos, audios, etc.
  4. Configuration/Configuración. Los ajustes principales del sitio, así como la opción de integración de las herramientas de webmaster (para usuarios avanzados).
  5. Blog. Una sección separada para las configuraciones de visualización y funciones de blog.

Estas secciones puedes editar a tu gusto y tantas veces como deseas. Crea tu propio sitio, añade los widgets y bloques necesarios, inserta archivos multimedia, textos, tablas o cualquier otra cosa. Todo esto es fácil y rápido de configurar, así que, incluso una persona que nunca ha trabajado en el desarrollo web, podrá construir su propia página web sin mucho esfuerzo.

Las categorías principales de las plantillas MotoCMS 3.0 de TemplateMonster:

  • Arte y cultura;
  • Animales;
  • Diseño y fotografía;
  • Educación y libros;
  • Negocios y servicios;
  • Autos y motos;
  • Computadoras e Internet;
  • Electrónica;
  • Entretenimiento, juegos y vida nocturna;
  • Hogar y familia;
  • Moda y belleza;
  • Comida y restaurantes;
  • Vacaciones, regalos y flores;
  • Medicina;
  • Bienes raíces;
  • Sociedad y gente;
  • Deportes, naturaleza y viajes.

Como puedes ver, hay temas para todos los gustos. Y si no has encontrado una plantilla adecuada, entonces, créala por tí mismo! 🙂 Todo esto es muy fácil de hacer con el constructor web de MotoCMS 3.0. A pesar de toda esta simplicidad, tu sitio web todavía tendrá un aspecto profesional y fiable.

Todas las nuevas plantillas creadas por TemplateMonster para MotoCMS 3.0 son 100% adaptativas. Esto significa que funcionarán perfectamente en cualquier dispositivo y se adaptarán automáticamente a cualquier tamaño de pantalla.

Por supuesto, todas las nuevas plantillas incluyen aquellas características modernas, como el efecto de paralaje, la tipografía elegante, la adaptabilidad, los iconos de alta calidad, la animación preintegrada, el diseño de alta calidad en CSS3 y HTML5 y mucho más.