
Vivo en la periferia de una reunión tecnológica. Y en la periferia en un sentido geográfico. Y esto significa que:
- Nunca he estado en conferencias profesionales. Solo porque nunca se le ha dado esa oportunidad.
- Nunca compré cursos de capacitación: es extraño para mí pagar lo que puedes aprender en Internet o en los libros. Es tentador, por supuesto, obtener conocimiento concentrado, respaldado por tareas prácticas, para obtener un certificado. Pero para esto nunca tuve el dinero ni el tiempo.
- Soy partidario del ascetismo digital: no por mi propia voluntad, sino como producto de una reestructuración eterna en nuestro país. En períodos cortos de estabilidad financiera, actualizo la electrónica de forma residual. Así que ahora estoy escribiendo este texto en Core2Duo hace diez años. Todavía estoy esperando la próxima meseta estable en mi curva de ganancias.
- Tres veces en mi vida compré juegos. En los años 90. Estos fueron casetes para el obsoleto Spectrum. Miro la compra de software con sorpresa: cuando todos usaban software pirateado, también lo usaba sin comprender la esencia del problema. Y luego, a principios de la década de 2000, me cambié completamente a Linux y no había nada que comprar.
- Sorprendentemente, nunca he perdido un teléfono móvil, desde el comienzo de la aparición de la comunicación GSM. Y nunca se rompieron o no fueron reparados. Las tres piezas están perfectamente en el estante, y la cuarta, un teléfono inteligente, se encuentra en su bolsillo. El tiene cinco años. No tengo experiencia comprando software en Google Play, ni siquiera sé cómo hacerlo. La esposa lo sabe, pero yo no.
- Ruego a los proveedores que me incluyan en la lista negra y que no me llamen con ofertas para "comprar Internet" o un paquete de televisión. Porque no tengo TV y para Internet tengo suficiente velocidad mínima. Le pido que no me informe sobre las nuevas tarifas para las comunicaciones móviles, porque elijo el más barato disponible.
- Nunca he visto extranjeros de habla inglesa en vivo. Y nunca habló con extranjeros con voz. Tal oportunidad nunca se dio en mi rincón del oso, aunque sería interesante. Poco a poco estoy aprendiendo inglés, pero lo necesito solo para leer literatura.
Probablemente lo suficiente. ¿Quién soy y qué estoy haciendo en Habrahabr? El hecho es que yo ... soy un sobreviviente permanente. En otras palabras, un desarrollador moderno de pila completa. ¡Oh, me imagino cómo los programadores de perfiles fruncieron el ceño ahora! Fullstack ... ¿Qué les puedo decir? Chicos, estaría feliz de bombear habilidades en una dirección. Me gustaría, como usted, sumergirse en el tema y convertirse en un gurú altamente especializado. Pero, desafortunadamente, la realidad es que en las regiones, una persona en un sitio remoto tiene que aferrarse a cualquier trabajo, simplemente para no andar ni convertirse en taxista.
¿Con qué idiomas tuve que lidiar y entregar cosas terminadas? Si realiza una selección en una línea de tiempo, obtendrá la siguiente lista:
Sí, yo mismo tengo miedo de esta mezcolanza. ¿Qué tipo de lanzamiento encantador? ¿Eso es correcto? Web - análisis de fortaleza - contabilidad de acciones - juegos ... Plantas de energía nuclear, cartografía, telefonía. Autor, ¿hablas en serio? Por supuesto! La vida se apretará: no te levantarás demasiado.
Borde de la transición
Para sentir el borde de la transición de un proyecto a otro, puede considerar las dos líneas más bajas de la tabla anterior. Para el proyecto, desde la penúltima línea "Cartografía y navegación, desarrollo móvil para Android", solo lo haremos con los enlaces.
Y para completar la imagen, un par de publicaciones más:
Y sobre la línea de fondo de la tabla "Desarrollo web y telefonía" , discutiré más adelante en este texto.
Por lo tanto, un proyecto prometedor de una aplicación móvil para Android para equipos de navegación personalizados se está cerrando abruptamente. Ayer, el desarrollador escribió el código de fondo en C ++ y el frente en QML, fijó el código nativo a Java a través de JNI, y hoy debe buscar frenéticamente la vacante del desarrollador de C ++ en el sitio remoto. El mercado moderno de C ++ es tal que encontrar un empleador en Rusia con C ++ en un sitio remoto es un gran éxito. Todos los empleadores quieren ver un programador de C ++ en la oficina. El mes en la búsqueda es un cero completo. Es hora de volver a entrenar, el beneficio del fondo lo permite.
Definición
El desarrollador Fullstack (representante de una familia de especialistas) es un personaje mítico, objeto de deseo de un empleador que quiere optimizar la producción de software para un equipo de una persona. El desarrollador Fullstack tiene habilidades mágicas: tiene una memoria sin fondo, porque conoce todos los lenguajes y tecnologías modernas; el aparato conceptual global está integrado en el cerebro, superior en la organización del proceso de pensamiento de Vladimir Lenin, Albert Einstein y Leonardo da Vinci; El pensamiento sistémico de tal especialista es capaz de depurar cualquier cosa directamente en el cerebro, sin el uso de herramientas de depuración. Sin pretensiones, alimentado por la luz solar.
Transición a una nueva tarea
De repente, el usuario de haar de itsar viene a mí y lo lleva a su equipo. Tiene varias tareas pendientes, y estoy implementando un prototipo de servicio web para pruebas. Según lo planeado, el servicio web notifica a los usuarios de varios eventos a través de varios canales de comunicación, incluidas las llamadas telefónicas. Como resultado, apareció el sitio QrCall.org , sobre el cual ya estaba escrito en Habrahabr: Ve allí, no sé dónde .
Mirando hacia el futuro, escribiré inmediatamente los plazos: la discusión y redacción de la tarea técnica tomó dos semanas, tomó un mes y medio crear la primera implementación y ponerla en producción.
Para comprender, hasta la fecha, este servicio web se ve así (versión de desarrollador):

Por lo tanto, necesitamos saltar de C ++ a PHP7 y la pila de herramientas correspondiente a las realidades modernas. No hay tiempo para la acumulación (C) de Putin. Straustrup, Schildt, Gottschling, Salter y Klepper se colocan en el estante más alejado. Paralelamente a la escritura de TK, recuerdo que lo inventaron en PHP7. La consulta "qué hay de nuevo en PHP7" ofrece varios artículos sobre Habrahabr y en blogs de programación. Sí, espacios de nombres e importaciones, un nuevo tipo de operador ternario y cualquier azúcar sintáctico, tipos escalares y otros similares, clases anónimas, cierres finales, generadores ... En su mayor parte, todo es familiar. Una vez más, me doy cuenta de que PHP es un placer celestial en comparación con las graves ventajas.
Selección de herramienta
Telefonía
Más preocupado por la futura implementación de la telefonía. Voy a dominar? Está claro de inmediato que tiene que trabajar con SIP, pero ¿cómo? Me queda un recuerdo en el cerebro que solía jugar con algún cliente SIP de consola, e incluso podía marcar un número de teléfono y hacer una llamada. Para resolver el problema esto será suficiente. En un caso extremo, debe confundirse con Asterisk. Llamo a un señalista familiar, describiendo la esencia del problema, pidiéndole que me recuerde qué tipo de cliente de consola puedo sentir. El veredicto es inequívoco: este es Linphone y su consola linphonec . Pero marcar un número en la consola no es suficiente. Todavía tiene que reproducir el archivo de sonido en el teléfono virtual. Instala Linphone, ve a su consola, mira las posibilidades. Por lo tanto, es posible cambiar de un dispositivo de sonido a un archivo. Esto es bueno Y en la consola hay un comando de reproducción que inicia un archivo de audio para reproducir. En principio, no se necesita nada más.
Aunque no, todavía existe el problema de las llamadas concurrentes. Lo discuto con itsar , él dice que las alertas de llamadas son raras, solo alineelas . Solo limite la duración. Oh bien Si es así, entonces no hay más preguntas sobre telefonía.
Marco PHP y administrador de paquetes
A continuación, debe decidir en qué marco realizar el proyecto y, al mismo tiempo, debe tratar con el administrador de paquetes Composer. Anteriormente, solo miraba Composer e instalaba Yii2 sin componentes a través de él, porque en Yii2 todo lo que se necesitaba ya estaba incluido. Bueno, no importa qué marco elija, Composer seguirá siendo necesario. Leí cómo instalarlo. Apuesto a que funciona.
La siguiente es la pregunta sobre el marco. Descubrí que en 2019, Yii2 ya no es relevante, y Yii3 está atascado en algún tipo de estado intermedio. Lo que queda Para Zend y Symfony, todavía no he madurado, por lo que prácticamente no hay opciones, solo Laravel . Leo la documentación, miro los manuales, solicito un libro de un autor de habla rusa (resultó ser muy sensato, lo que se necesita para comenzar). Después del antiguo Codeigniter y el irrelevante Yii, el marco de Laravel se entiende fácilmente, puede ver de inmediato cómo la idea de programación ha progresado en el diseño de aplicaciones web. Todo lo que se soñó ya se ha implementado, desarrollado y cubierto con enfoques estándar. Sí, el proyecto no está cargado, por lo que puedo permitirme una curvatura nubia en la implementación.
Puse a Laravel "por defecto", sugiriendo que Composer decida por sí mismo qué versión de Laravel es relevante actualmente. Él pone 5.5. Bueno, deja que esta versión sea, tiene más ejecución que 5.8, por lo que será más fácil resolver problemas. No buscamos la innovación.
NPM
Algunos componentes de Laravel, por ejemplo, el sistema de construcción y minificación Mix CSS (complemento para Webpack), requieren el tiempo de ejecución del servidor Node.Js JavaScript y el administrador de paquetes npm basado en JavaScript. El Debian Linux Stable que estoy usando ya tiene el paquete npm . Sin embargo, es una versión bastante antigua y no es adecuada para la infraestructura de Laravel 5.5. Descubro cómo instalar desde fuentes de terceros, encuentro deb.nodesource.com, lo instalo. Hmm, extraño, en el mismo paquete, npm se instala junto con Node.Js. Esto no es para nada Unix, pero bueno. Lo principal que funciona.
Diseño
La idea del proyecto QrCall.org es llamar al usuario a través de un código QR . Y esto significa que los visitantes ingresarán al sitio desde dispositivos móviles, utilizando las cámaras de las cuales se escaneará este código QR. Al mismo tiempo, es probable que el registro de usuarios, la configuración de alertas y la impresión de códigos QR se realicen desde computadoras de escritorio. Por lo tanto, el diseño adaptativo es indispensable.
Inmediatamente noto la generación de contenido móvil / de escritorio en el servidor al analizar UserAgent. Este no es nuestro enfoque para 2019. Aquí el framework CSS Bootstrap definitivamente nos ayudará. En general, el diseño de las aplicaciones web es un tema amplio, grande e independiente, que debe abordar un especialista por separado. Para mí en desarrollo web no hay nada más complicado que elegir con diseño. Hace tiempo que entiendo que tengo un cretinismo imponente. Paso mucho tiempo para sangrar otro regular o para alinear varios elementos. Pero no tenemos recursos para el codificador, por lo que debe hacer lo que pueda, es deseable que el resultado sea suave y hermoso.
La pregunta es: ¿qué versión de Bootstrap debo usar? 3 o 4? Resulta que Bootstrap viene inmediatamente incluido con Laravel 5.5, y esta es la versión 3.x. No hay tiempo para descubrir cómo rehacer el entorno en Bootstrap 4, así que dejo la versión 3. Al final, cientos de miles de sitios usan Bootstrap 3 en Internet, lo que significa que es una tecnología decente para usar.
Lo más interesante es que, como resultado, resultó hacer un diseño adaptativo no solo para la parte "abierta" del sitio, sino también para su cuenta personal.
Así es como se ve la página en la versión de escritorio:

Y aquí está ella en la vista móvil:

Desarrollo
¿Cómo se usará el marco? Tengo este enfoque: utilizar al máximo todos los componentes ya preparados del freverka, pero con una condición: si hay una buena comprensión de cómo funciona este componente. Como dijo una persona que ya conocía Zen Laravel: "No se trata del hecho de que la documentación está escrita en un idioma no ruso, sino del hecho de que incluso en el marco nativo de inglés no siempre es indicativo". Por lo tanto, creo que si no puede descubrir rápidamente un componente o método, es mejor hacer algo más simple con sus propios métodos que escribir código que usted mismo no comprende bien.
De que estoy hablando El marco de Laravel es un gran marco con muchas abstracciones implementadas y con su propio enfoque de la estructura del código. Tiene cosas simples que se han utilizado durante mucho tiempo y con éxito tanto en Laravel como en otros marcos. Hay cosas complejas pero comprensibles, por ejemplo, la implementación de colas (que deberán usarse para telefonía). Pero hay cosas fundamentales realmente complejas en las que no podrás penetrar. Por ejemplo, este es un paquete de contenedor de servicios + proveedor de servicios + fachada. Hasta ahora, he entendido cómo crear mecánicamente un proveedor de servicios, colocarlo en un contenedor de servicios y atornillar la fachada a todo. Pero por lo que hay que hacer, aún no me he dado cuenta. Parece que este enfoque acorta el código, puede referirse a la abstracción y sus métodos en un estilo estático, sin usar la nueva palabra clave (mérito dudoso). Y el uso de fachadas facilita la organización de pruebas automatizadas de una aplicación web y, como efecto secundario de toda esta conveniencia, cuando se utiliza un proveedor de servicios, la inyección de dependencia está automatizada. En general, aunque no hay comprensión, es más fácil para mí hacer con las clases de ayuda habituales, lo cual hago.
Tecnología
Entonces, para resumir lo anterior, obtuve la siguiente pila de tecnología bastante tradicional:
- SO: Linux (elijo Debian estable)
- Lenguaje: PHP7
- Marco: Laravel
- Silbatos frontend: Bootstrap 3 + Vue.js
- Base de datos: MariaDB (también conocido como MySQL)
- Servidor web: NGinx
- Telefonía: SIP + linphonec / linphonecsh
- VCS: Git
Sí, no es la pila más moderna y avanzada. Pero necesitamos hacer negocios, y no practicar envolver el entorno en contenedores Docker y no promover la idea del desarrollo exclusivo de JS.
Cola
Las colas son un área temática muy específica, y en equipos grandes generalmente las responde un especialista especialmente capacitado que garantiza el funcionamiento de las colas en cientos de servidores. En nuestro caso, no se observan cientos de servidores, por lo que es necesario usar la cola de la manera más simple y posible en los negocios. Por lo tanto, como un repositorio de trabajos, decidí usar el motor de base de datos relacional MySQL ya utilizado en el proyecto. Hubo cierta tentación de hacerlo sabiamente, por ejemplo, basado en Redis, pero simplemente no había tiempo para lidiar con esta base de datos NoSQL.
Durante el desarrollo, apareció una solicitud para una tarea que no se pudo resolver directamente con la cola MySQL, pero que se resolvería con Redis. El problema era que después de completar con éxito la tarea, la tarea se elimina de la cola y no hay forma de verificar si, por ejemplo, se completó una tarea determinada en los últimos 10 minutos. Cuando se usa el almacenamiento Redis, esto podría implementarse a través de Limitación de velocidad, pero cuando se usa MySQL, esto no es posible. Por lo tanto, tuve que implementar dicha funcionalidad simplemente sobre la base del análisis del registro de acciones. Afortunadamente, el registro de acciones es una parte indispensable de nuestro pequeño sistema de información.
Servicios pagados
Al colocar un sitio en Internet, debe pagar el pago de varios servicios. El alojamiento y el nombre de dominio son siempre pagos casi obligatorios. Tomamos el alojamiento de forma económica, pagamos 2Gb de RAM, a razón de 1Gb para la base de datos, el resto, para el sistema operativo y la ejecución del script. Había 2 núcleos de microprocesador en la tarifa, aunque creo que uno estaría bien con nuestras cargas. El espacio en disco en 20 Gb es más que suficiente para nuestro proyecto. Durante el proceso de implementación, se requería la compilación de linphonec , porque en el escritorio de mi desarrollador había un Debian Linux más antiguo que en la imagen final de la máquina virtual proporcionada por el proveedor de alojamiento, y el paquete estándar del repositorio contenía una versión antigua de este programa con varias "características" desagradables. Y así, para compilar linphonec, 2Gb no fue suficiente para mí. La magia de las plantillas en C ++ está consumiendo memoria como si no estuviera dentro de sí misma, por lo que tuve que configurar un intercambio, después de lo cual el ensamblaje se completó con éxito.
La telefonía SIP tampoco ha sido gratuita, pero dado que hay varios operadores de telefonía IP grandes en Rusia que compiten entre sí y ofrecen tarifas de muy bajo costo. El único momento incomprensible fue que al ordenar una tarifa, el operador convenció de que la tarifa sería por segundo, pero en realidad resultó ser por minuto. Pero esto debe tratarse por separado.
En nuestras realidades modernas, no puede confiar en el hecho de que hay servicios gratuitos de correo electrónico. Y en nuestro caso, el boletín de correo electrónico es necesario para enviar varias alertas. En mi experiencia, todos los intentos de organizar el envío de muchas cartas a través de Yandex.Mail o Google.Mail solo conducen al hecho de que los servidores de correo de recepción, después de tres o cuatro letras, marcan los mensajes como spam. Es decir, los problemas surgen ya en la etapa de depuración, sin mencionar la producción. Por lo tanto, tuve que molestarme con el servicio Mailgun, a través del cual las cartas se entregan rápidamente y sin problemas. Solo hay un malentendido con Mailgun: en algunos artículos escriben que dan gratis enviar 10,000 cartas al mes. Y en el sitio web de Mailgun en sí, de alguna manera es resbaladizo escrito que entiendo como 10,000 cartas desde el momento del registro. , , .
Mailgun . , , . , , SMTP. Laravel Mailgun, .
, . INPUT . . , SSH, . — DROP INPUT. , , .
SIP-, SIP- , , nf_conntrack_sip . , NAT, nf_nat_sip , , .
, . . — , , MySQL. — , . zip-, , , . — . rsync.
, — , borg . , .
GIT , , . . , , , ( ), - ( git , artisan ). /etc/sudoers , , .
, Laravel , . , , . , .
, ! — . ? : ! , CI . , , CI-, -.
. , ? Si! - ? , ! . , .
, Laravel, CSS- Bootstrap 3 Bootstrap 4. - Bootstrap 4 Bootstrap 3, flex- , Bootstrap 3 , . Bootstrap 4, , .
, , HTTPS. , , . HTTP HTTPS, Let's Encrypt HTTPS - NGinx , .
, . , , . , , logrotate , .
. , , . -, . , . , , . , Laravel , , , . , , , .
Resumen
, " " " ". , . , , , , : , , , ( , , ).
? "". ? -, , . , , , , . , .
, , " , , " , . . ++ , . : , " ", , , , , . -. - , . , , . - : , - , , , .
— , - , , , . , proof-of-concept, , , , . , — , .
, - . , , . , - , , -. , , , ...
? : -, , , , , .