
我生活在技术聚会的边缘。 并在地理意义上处于外围。 这意味着:
- 我从未去过专业会议。 只是因为从未有过这样的机会。
- 我从来没有买过培训课程:我为自己在这些互联网或书本上学到的东西付钱而感到奇怪。 当然,获得经过实践任务支持的集中知识以获得证书很诱人。 但是为此,我从来没有金钱或时间。
- 我是数字禁欲主义者的拥护者:不是我自己的自由意志,而是作为我们国家永恒重组的产物。 在财务稳定的短期内,我会在剩余基础上更新电子产品。 所以现在我十年前在Core2Duo上写这篇文章。 仍在等待我的收益曲线上的下一个稳定平台。
- 我一生中有三次购买游戏。 在90年代。 这些是过时的Spectrum的录音带。 我惊奇地看着购买的软件:当每个人都使用盗版软件时,我也使用了它而不了解问题的实质。 然后,在2000年代初,我完全转向Linux,没有东西可买。
- 出人意料的是,从GSM通信出现之初,我从未丢失过手机。 他们从来没有破裂或没有得到修复。 所有三件物品都整齐地放在架子上,第四件是智能手机,放在您的口袋里。 他五岁。 我没有在Google Play上购买软件的经验,甚至都不知道该怎么做。 妻子知道,但我不知道。
- 我恳求提供商将我列入黑名单,而不给我“购买互联网”或电视套餐的要约。 因为我没有电视,也没有互联网,所以最低速度对我来说足够了。 我要求您不要告诉我有关移动通信的新资费,因为我选择了最便宜的资费。
- 我从未见过说英语的外国人。 而且他从不与外国人说话。 尽管这很有趣,但我从来没有给过这样的机会。 我正在慢慢地讲英语,但我只需要阅读文学即可。
大概够了。 我是谁,我在哈布拉哈伯上做什么? 事实是我……我是永久的幸存者。 换句话说,是一个现代化的全栈开发人员。 哦,我可以想象Profile程序员现在如何皱眉! 全栈...我能告诉他们什么? 伙计们,我很乐意将技能推向一个方向。 像您一样,我很高兴将自己投入到这个话题中并成为一名高度专业化的专家。 但是,不幸的是,现实情况是,在偏远地区,一个人必须抓紧任何工作,而不是去骑摩托车或成为出租车司机。
我必须处理哪些语言并发出完成的东西? 如果在时间轴上进行选择,则会得到以下列表:
是的,我自己被这种大杂烩吓到了。 什么样的附魔投掷? 是吗 网络-强度分析-库存会计-游戏...核电站,制图学,电话。 作者,你是认真的吗? 绝对! 生活会紧缩-您的起床时间不会太长。
过渡边缘
要感觉到从一个项目过渡到另一个项目的边缘,可以考虑上表的最下面两行。 对于项目,倒数第二行“制图和导航,Android移动开发”中,我们将仅使用链接。
为了使图片更完整,还有更多出版物:
关于“ Web开发和电话”表的最底端,我将在本文后面讨论。
因此,用于自定义导航设备的Android移动应用程序的一个有前途的项目正在急剧关闭。 昨天,开发人员用C ++编写了后端代码,并用QML编写了前端代码,通过JNI将本机代码固定到Java,今天,他必须在远程站点上疯狂地寻找C ++开发人员的空缺。 现代的C ++市场如此之大,以至于在远程站点上找到具有C ++的俄罗斯雇主都是巨大的成功。 所有雇主都希望在办公室看到C ++程序员。 搜索中的月份是一个完整的零。 是时候重新培训了,背景的好处允许了。
定义
全栈开发人员 (代表一个专家家族)是一个神话人物,它是希望将软件生产优化为一个人的团队的雇主的愿望对象。 全栈开发人员具有神奇的能力:他具有无底的记忆,因为他了解所有现代语言和技术; 全球概念设备被整合到大脑中,在组织弗拉基米尔·列宁,阿尔伯特·爱因斯坦和莱昂纳多·达·芬奇的思维过程中表现出色; 这样的专家的系统思维能力可以直接在大脑中调试任何东西,而无需使用调试工具。 朴实无华,由阳光驱动。
过渡到新任务
突然,itsar的haar 用户来到我身边,并将其带到他的团队。 他有许多任务悬而未决,我正在实现用于测试的原型网络服务。 按照计划,Web服务通过各种通信渠道(包括电话)将各种事件通知用户。 结果,出现了网站QrCall.org ,有关它的内容已经在Habrahabr上写了: 去那里-我不知道在哪里 。
展望未来,我将立即写下截止日期:技术任务的讨论和编写用了两个星期,创建第一个实施并投入生产用了一个半月的时间。
为了理解,迄今为止,此Web服务如下所示(开发人员版本):

因此,我们需要从C ++过渡到PHP7,并使用与现代现实相对应的工具堆栈。 没有时间建立(C)普京。 Straustrup,Schildt,Gottschling,Salter和Klepper放在远处的架子上。 在编写TK的同时,我还记得他们是在PHP7中发明的。 查询“ PHP7的新功能”在Habrahabr和编程博客中提供了几篇文章。 是的,名称空间和导入,一种新型的三元运算符和任何语法糖,标量类型以及诸如此类的其他名称,匿名类,完成闭包,生成器……在大多数情况下,一切都是熟悉的。 我再次为自己指出,与严格的优势相比,PHP是一种天堂般的乐趣。
工具选择
电话技术
最担心电话的未来实现。 我会掌握吗? 显而易见,您必须使用SIP,但是如何? 我曾经与一些控制台SIP客户端一起玩,这使我记忆犹新,甚至可以拨打电话号码并拨打电话。 要解决这个问题,就足够了。 在极端情况下,您必须对星号感到困惑。 我正在打电话给一位熟悉的信号员,描述问题的实质,让您提醒我我会感觉到哪种控制台客户端。 判决是明确的-这是Linphone及其控制台linphonec 。 但是,仅在控制台中拨打号码是不够的。 您仍然必须将声音文件播放到虚拟听筒中。 安装Linphone,转到其控制台,查看可能性。 因此,可以从声音设备切换到文件。 很好 在控制台中,有一个play命令可启动要播放的音频文件。 原则上,不需要更多。
虽然不是,但是仍然存在并发调用的问题。 我与它的itar讨论过 ,他说呼叫警报很少,只需排队。 仅限制持续时间。 哦好 如果是这样,那么电话就不再有问题了。
PHP框架和包管理器
接下来,您需要确定要在哪个框架上进行项目,同时还需要处理Composer软件包管理器。 以前,我只是看过Composer并安装了没有任何组件的Yii2,因为在Yii2中已经包含了所有需要的东西。 好了,无论我选择哪种框架,都仍然需要Composer。 我阅读了如何安装它。 我敢打赌,它行得通。
接下来是框架的问题。 我发现在2019年,Yii2不再相关,Yii3陷入某种中间状态。 还剩下什么? 对于Zend和Symfony来说,我尚未成熟,因此几乎没有选择,只有Laravel 。 我阅读了文档,看了看手册,订购了一位俄语作家的书(事实证明这很明智,需要做些什么)。 在使用了古老的Codeigniter和不相关的Yii之后,就很容易理解Laravel框架,您可以立即看到编程思想在Web应用程序设计中是如何发展的。 梦dream以求的一切已通过标准方法实施,运行并变得过分庞大。 是的,该项目计划不加载,因此我可以在实现中承担一些努比亚的压力。
我将Laravel设置为“默认”,建议Composer自己决定当前使用哪个版本的Laravel。 他把5.5。 好吧,让这个版本成为现实,它比5.8更具可运行性,因此更容易解决问题。 我们不追求创新。
NPM
某些Laravel组件,例如Mix CSS构建和最小化系统(Webpack的附加组件),需要Node.Js JavaScript服务器运行时和基于JavaScript的npm软件包管理器。 我正在使用的Debian Linux Stable已经具有npm软件包。 但是,它是一个相当旧的版本,不适合Laravel 5.5基础结构。 我想出了如何从第三方来源进行安装,找到deb.nodesource.com,并从中进行安装。 嗯,很奇怪,在同一软件包中,npm与Node.Js一起安装。 这根本不是Unix方式,但是很好。 主要的工作原理。
布局图
QrCall.org项目的想法是通过QR码呼叫用户 。 这意味着访问者将使用扫描此QR码的相机从移动设备进入网站。 同时,用户注册,设置警报和打印QR码很可能是通过台式计算机完成的。 因此,自适应布局是必不可少的。
通过分析UserAgent,我立即注意到服务器上移动/桌面内容的生成。 这不是我们2019年的方法。 在这里, Bootstrap CSS框架肯定会为我们提供帮助。 通常,Web应用程序的布局是一个单独的,巨大的大型主题,应由单独的专家解决。 对我来说,在Web开发中,没有什么比选择布局更复杂的了。 我很早就知道自己有强硬主义。 我花费大量时间来缩进另一个常规字符,或对齐多个元素。 但是我们没有编码器的资源,因此您必须尽力而为,最好使结果平滑美观。
问题是:我应该使用哪个版本的Bootstrap? 3还是4? 事实证明,Bootstrap立即与Laravel 5.5捆绑在一起,这是版本3.x。 现在没有时间弄清楚如何在Bootstrap 4上重新构建环境,因此我离开了版本3。最后,成千上万的站点在Internet上使用Bootstrap 3,这意味着它是一种不错的技术。
最有趣的是,结果证明,它不仅针对网站的“开放”部分,而且还针对您的个人帐户,做出了自适应布局。
这是桌面版页面的外观:

在这里,她处于移动视图中:

发展历程
该框架将如何使用? 我有这种方法:最大程度地使用freverka的所有现成组件,但有一个条件:是否对该组件的工作原理有很好的了解。 正如一位已经了解Zen Laravel的人说的那样,“这与文档不是用非俄语编写的事实有关,而是有关该框架甚至使用英语的事实也并不总是指示性的。” 因此,我相信,如果您无法快速找出组件或方法,最好用自己的方法做些简单的事情,而不是编写自己不了解的代码。
我在说什么 Laravel框架是一个大型框架,实现了许多抽象,并且使用自己的代码结构方法。 它具有简单的东西,长期以来已在Laravel和其他框架中成功使用。 有很多复杂但可以理解的事情,例如,队列的实现(必须用于电话)。 但是,您将无法深入了解真正复杂的基本事物。 例如,这是捆绑服务容器+服务提供商+外观。 到目前为止,我已经了解了如何机械地创建服务提供者,将其放置在服务容器中以及将外观固定到其上的方法。 但是对于需要做的事情-我尚未意识到。 看来这种方法缩短了代码,您可以以静态样式引用抽象及其方法,而无需使用new关键字(可疑优点)。 而且使用立面可以轻松地组织Web应用程序的自动化测试,并且作为所有这些便利的副作用,当使用服务提供商时,依赖项注入是自动化的。 通常,虽然没有理解,但对我来说,最简单的方法是与我通常要做的帮手类一起做。
技术领域
因此,总而言之,我得到了以下非常传统的技术堆栈:
- 操作系统:Linux(我选择Debian Stable)
- 语言:PHP7
- 框架:Laravel
- 前端哨声:Bootstrap 3 + Vue.js
- 数据库:MariaDB(又名MySQL)
- Web服务器:NGinx
- 电话:SIP + linphonec / linphonecsh
- VCS:Git
是的,不是最时尚和最先进的堆栈。 但是,我们需要开展业务,而不是练习将环境包装在Docker容器中,也不要提倡纯JS开发的想法。
列
队列是一个非常特定的主题领域,在大型团队中,队列通常由经过特殊培训的专家来回答,该专家确保队列在数百台服务器上的运行。 在我们的案例中,没有观察到数百台服务器,因此有必要在业务中尽可能简单地使用队列。 因此,作为工作存储库,我决定使用项目中已经使用的MySQL关系数据库引擎。 例如,基于Redis会有一些明智的选择,但是根本没有时间处理这个NoSQL数据库。
在开发过程中,出现了对无法使用MySQL队列直接解决但可以使用Redis解决的任务的请求。 问题在于,成功完成任务后,该任务将从队列中删除,并且无法检查例如某项任务是否在最近10分钟内完成? 使用Redis存储时,可以通过速率限制来实现,但是使用MySQL时,这是不可能的。 因此,我必须仅基于对操作日志的分析来实现这种功能。 幸运的是,操作日志是我们小型信息系统必不可少的一部分。
付费服务
在Internet上放置站点时,必须依靠各种服务。 托管和域名几乎总是强制性付款。 我们以廉价的价格购买了托管服务,并为数据库支付了2Gb的内存,其余的1GB则用于数据库和操作系统以及脚本执行。 收费标准中有2个微处理器内核,尽管我认为其中一个可以很好地处理我们的负载。 20Gb的磁盘空间足以容纳我们的项目。 在部署过程中, 需要进行linphonec的编译,因为在开发人员的桌面上,Debian Linux的版本比托管人提供的完整虚拟机映像中的版本更旧,并且存储库中的标准软件包包含该程序的旧版本,并带有一些令人不愉快的“功能”。 因此,要编译linphonec,2Gb对我来说还不够。 C ++中模板的魔力在于消耗内存,就好像它们本身不在内部一样,因此我必须进行一次交换,然后组装成功完成。
SIP电话也不是免费的,但是由于俄罗斯有多家大型IP电话运营商相互竞争,并提供非常低廉的资费。 唯一无法理解的时刻是,在订购价目表时,运营商说服该价目表是每秒,但实际上却是每分钟。 但是,这必须分开处理。
在我们现代的现实中,您不能依靠免费的电子邮件服务这一事实。 在本例中,需要电子邮件时事通讯来发送各种警报。 以我的经验,所有尝试通过Yandex.Mail或Google.Mail组织发送许多信件的尝试仅导致以下事实:接收邮件服务器(三到四个字母后)会将邮件标记为垃圾邮件。 也就是说,问题已经在调试阶段出现,更不用说生产了。 因此,我不得不烦恼Mailgun服务,通过该服务可以快速无障碍地发送信件。 Mailgun仅有一个误解:他们在某些文章中写道,他们每月免费发送10,000封信。 在Mailgun本身的网站上,从注册之日起,我就以10,000封信的方式写得有些滑溜。 , , .
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-, -.
. , ? ! - ? , ! . , .
, 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 , , , . , , , .
总结
, " " " ". , . , , , , : , , , ( , , ).
? "". ? -, , . , , , , . , .
, , " , , " , . . ++ , . : , " ", , , , , . -. - , . , , . - : , - , , , .
— , - , , , . , proof-of-concept, , , , . , — , .
, - . , , . , - , , -. , , , ...
? : -, , , , , .