Написал свою первую статью на VC.
Где-то с марта по июнь я занимался участием в конкурсе Сбера с очень большим призовым фондом, и смог занять первое место. История с множеством неожиданных поворотов, надеюсь, будет интересно.
#dev
https://vc.ru/life/274970-plan-pobedy-kak-ya-poluchil-2-5-milliona-rubley-v-konkurse-sbera
Полноценное ООП, статическая типизация, события, Си-подобный синтаксис — именно на этом языке я научился тому фундаменту, который позволил мне стать профессиональным разработчиком. Именно после него я без особого труда кодил на Java и теперь вот на C#. Именно на AS3 я выиграл первый в своей жизни конкурс по программированию, и на нём же сделал первый проект, принёсший серьёзные деньги — достаточно серьёзные, чтобы я мог съехать от родителей. На нем непрерывно писал несколько лет, и ни о чём не жалею.
Потом Apple убила Flash, а крупные студии убили рынок инди-проектов в социальных сетях. Мой профессиональный путь стал менее простым и наивным, зато уровень знаний и умений в этой области сильно вырос. Прошлогодний код в любой момент кажется мне плохим, и хочется верить, что это признак какого-то развития. Но те времена я всегда вспоминаю с теплотой и любовью.
https://youtu.be/sanpUp8GIoY?
#dev
Попробовал, наконец, разработку на Blazor. Это такой фреймворк под .NET, который позволяет писать фронтенд на C#. Работает он двумя способами: либо собирает весь проект в WebAssembly, и бедный пользователь грузит себе мегабайтную dll, либо устанавливает клиент-серверное соединение через SignalR и шлёт клиенту информацию об обновлённых DOM-элементах.
Вот вторую то я и пробовал. Казалось бы — каждое нажатие кнопки требует отправить на сервер запрос и получить ответ. Никогда такого не было! Но субъективно разницы во времени отклика нет (потому что веб и так достаточно медленный, хаха).
Фронтенд-часть пишется очень похоже на JSX: вёрстка реактивно вперемешку с кодом. Когда-то я очень ругал React за такой подход, потому что каша. Но нетипизированный JS по-умолчанию каша, а здесь же по факту получается очень удобно: статический анализ не даёт тебе делать ошибки и писать ерунду.
Но приятный полноценный язык программирования вместо JavaScript это лишь вишенка на торте. Самое крутое — вся сила серверного кода с полноценной возможностью обращения к базе данных, шеринг моделей данных между сервером и клиентом, и, наконец, Dependency Injection любого серверного модуля в «клиент»! То есть вы не просто пишете одно приложение вместо двух, вы ещё и получаете отсутствие ошибок при каком-нибудь изменении моделей API, когда сервер стал отдавать не то, что ожидает клиент. Вам вообще теперь не нужен API, достаточно закодить нужную функцию на серваке и инжектировать её в нужный фронтенд-модуль.
Это супер удобно, супер быстро, супер устойчиво к ошибкам. Теперь не хочется возвращаться даже на вполне крутой Vue 3. Но, система пока новая, она не обросла решениями от комьюнити, а браузерный API всё равно придётся дергать через JavaScript Interop. Для совсем кайфа нужно подождать годик, поскольку развитие идёт довольно быстро. Например, там нет очень нужного в таком деле hot reload, но в .NET 6 он уже анонсирован, и вроде как есть в превью, а релиз в ноябре.
#dev
#dev 分支更新
重大变更:
* 完全异步化,替换了所有涉及同步网络请求的库为异步库
* 与 Telegram 交互的库由使用 HTTP Bot API 的同步库python-telegram-bot改为使用 MTProto Bot API 的异步库telethon
|- 这引入了 API key 的需求,程序已经内置了 7 个公开的 API key,即使遇到问题,重试几次就可登入成功。如果无法登入,可以自己申请 API key (详见docker-compose.yml.sample中的说明)
|- 由于直接连接到 bot 所属的 DC,不需绕经 HTTP Bot API 所在的 DC2/4,且不需轮询获得消息更新,它在接收及发送消息方面都更为迅速,资源占用也更低(现有证据表明,HTTP Bot API 很可能就是 MTProto Bot API 的一个包装)
|- 即使 HTTP Bot API 宕机,bot 也可以正常工作
|- 其他比较请见这里和这里
新增:
* 支持 <iframe> 元素的解析
* 支持 <video><source><source>...</video> 的解析
* 启用相对链接解析
* 将自定义表情替换为替代文字放入文本中时,可将其 emoji 化(如可能)
* 如果环境变量中设置了全局代理 (SOCKS_PROXY/HTTP_PROXY),会使用它们
* /test 接受了一个不合法的 URL 时,警示用户
* 一些新的环境变量,详见 docker-compose.yml.sample 中的说明
修复:
* 如果一个自定义表情的 width/height 是以 em 而非 px 为单位指定的,现在也能识别到它并将它从图片中剔除并替换为替代文字放入文本中
* 改为使用 post 的 guid/id 而不是 link 来辨识最后一次发送的 post,以规避某些特殊的 RSS feed 的 post 的 link 每次都会变化的问题
* 其他小问题修复
变更:
* 简化了 Telegraph 标题
* 修改 version 格式使之更合理
* 程序启动时不再一次性检查所有 feed 以避免一些问题
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
新增:
* 过长的消息可转为使用 Telegraph 发送
|- 需要设置环境变量 TELEGRAPH_TOKEN,不设置则不启用。每个 token 以逗号,分号,换行或空格中的任意一种分隔,为保证体验,请多设置几个。在这里申请 access_token
|- 如果实在不想申请,就直接输入连续的逗号,需要启用 n 个 Telegraph 账号就输入 n-1 个逗号,bot 会自动申请 token,但是这样会延长 bot 的启动时间
|- 消息过长乃至于 Telegraph 拒收时,转为链接发送
* 新增 /version 命令用于查看版本
|- git clone 后手动运行或通过官方 docker 镜像部署者,可以看到最近的 git tag、与前者的 commit 距离和 commit hash
|- 通过 Railway 部署者,只能看到部署时间
更新:
* 更新了 /help 命令返回的帮助
* 简化了命令列表的描述
* 每个 feed 中检查到的新 post,将多线程发送
* 每次检查 feed 更新,都会多线程检查
* 将 feed 更新检查均摊到每分钟,这在订阅较多时非常有用,可避免负载集中及触及 flood control
|- 为此,大于 60 分钟的检查间隔将会被重置为 60 分钟
|- 特定的某个 feed 的检查间隔仍为设置的间隔,但已四舍五入到整分钟
|- 程序启动时会一次性检查所有 feed,之后会将所有 feed 检查任务均摊到每分钟
变更:
* 官方构建 docker 镜像删去了 x86 支持,现在仅支持 amd64 (x86-64) 和 arm64,这对绝大部分用户没有影响
附注:
* 针对 Telegraph API 也设置了 flood control 自动等待;若等待时间过长,将直接重开在本次运行期间丢弃原账号并请求新的 Telegraph 账号
* post 发送任务最多允许 10 个线程同时生成消息,5 个线程同时发送消息
* feed 检查任务最多允许 5 个线程同时检查更新
* 由于 Telegraph API 非常容易触及 flood control,最多允许 1 个线程在同一时刻通过同一个 token 生成 Telegraph 文章,且每次请求附加了一个 1s 的间隔,因此最好多填几个 token
* 如果想测试多线程和 flood control 自动防止的效果: 盯着日志,然后 /test https://www.ithome.com/rss/ all
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
修复:
* 修复了数据库为空时无法添加订阅的问题
* 修复了错误的参数处理导致网络超时设置丢失,从而导致订阅检查任务无法自行结束的问题
* 修复了报错消息会无限重发的问题:当发送消息出现预料之外的错误而需要向管理员发送报错消息时,若报错消息也发送失败,不会尝试重发
新增:
* /list 命令现在拥有更简洁的输出
* 在 amd64 的基础上,docker 镜像增加 x86, arm64 构建(master 分支尚缺;为简化构建,改为使用 Python 3.9)
* 提供了一个使用 redis 作为数据库的 docker-compose 配置示例(因 master 分支尚未支持 redis,需在配置中指定 dev 分支)
* 日志输出支持着色
* 若订阅检查任务无法自行结束而导致订阅检查任务冲突,连续四次后将通过 Telegram 通知管理员
* 如果发生 getUpdates 冲突,在日志里提示用户少于十次这样的错误对于在 railway.app 里运行的示例来说是正常的
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 支持通过 OPML 文件导入和导出订阅
* 有限的异步支持(实验性;所有命令及订阅定时检查之间,将异步运行)
* 其它小更新与修复
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 支持使用 Redis 作为数据库(实验性)
|- 因此已经支持部署到 Railway 时持久化订阅
* 日志微调
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 如果 Telegram Bot API 拒收了媒体,自动尝试使用媒体反代服务(实验性)
* 支持解析代码(<code>/<pre>)
* 重构了超长消息分割方法,尝试修正一些问题(可能不稳定)
* 重写了有序列表 (<ol>) / 无序列表 (<ul>) 的解码方式,避免极端情况下错误地达到文本长度限制
* 支持为嵌套列表添加缩进
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 重构权限检查,为将来的多用户功能做准备
* 使用 logging 库来记录 log
* 更新 README 和帮助消息
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 添加了 GIF 支持,现在文章内的 GIF 不会再被转换为静态图片
|- 由于 Telegram 的限制,一条消息只能含有一张 GIF,因此若 GIF 过多,将引起刷屏
|- 为避免 GIF 前后都有静态图片/视频而造成 GIF 分隔消息的状况,以减少总消息数目,GIF 会最后发出,而不是按照文章中的顺序
* 修复了文本全部发送完毕而图片未发送完毕时,剩下的图片不会被发出的问题
* 根据更新后的 Telegram Bot API 文档,增加了图片长宽比限制
* 优化了标题存在性判断
* 更新依赖 bs4 到 4.10.0
* 移除了不再需要的旧代码
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持
#dev 分支更新
* 替换 README 中的图标为新设计的图标
* 因应许可证变更,在 /help 消息中添加仓库链接
* 因应许可证变更,更新 README
* 更改 user-agent,规避 requests 默认的 UA 被某些网站屏蔽的问题
* 解码相关:
|- 为列表首尾添加换行,以规避某些 feed 不给列表前后加换行的问题
|- 将 <h\d> 标题解码后的先导换行从一个改为两个,增强可读性
|- 对文章标题也实施 emoji 化
|- 修复了某些时候,超长消息自动分割时发出空消息的问题
|- 修复了错误的 HTML 转义顺序导致的转义失效
加入频道 | 加入群组 | GitHub 仓库 | 捐赠支持