Подписаться на блог

Ихрь постит в уютный бложик

Фрирайтинг, заметки, шитпостинг и все подряд (18+)

Change SSH port on Ubuntu 22 using Ansible

After updating Ubuntu 22.10 SSHd uses socket-based activation.
As a result, the sshd configuration port does not affect the listening port.
To change the port, we need to perform the following tasks:

- name: Create config folder
  file:
    path: /etc/systemd/system/ssh.socket.d
    state: directory
    recurse: true

- name: Create config file
  copy:
    dest: /etc/systemd/system/ssh.socket.d/listen.conf
    content: |
      [Socket]
      ListenStream={{ custom_ssh_port }}

- name: Reload systemd manager
  systemd:
    daemon_reload: yes

- name: restart ssh
  service:
    name: "ssh"
    state: restarted

- name: Update connection port
  set_fact:
    ansible_ssh_port: "{{ custom_ssh_port }}"

How to fix unknown fragments types in graphql-codegen?

I spent half of the day setting up graphql-codegen to generate the correct types for fragment queries.

At first, my code looked like this:

// file1
export const DIALOG_FIELDS = gql(`
  fragment DialogFields on Dialog {
    id
    name
  }
`);

// file2
export const GET_DIALOG = gql(`
  ${DIALOG_FIELDS}
  query GetDialog($dialogId: ID!) {
    dialog(id: $dialogId) {
      ...DialogFields
    }
  }
`);
const config: CodegenConfig = {
  schema: CONFIG.apiHost,
  documents: ['src/**/*.{tsx,ts,js,jsx}', '!src/gql/__generated__/*.ts'],
  generates: {
    './src/gql/__generated__/': {
      preset: 'client',
      plugins: [],
      overwrite: true,
      presetConfig: {
        gqlTagName: 'gql'
      }
    }
  },
};

So, with the basic config I did get an unknown type for both the query and the fragment:

I found a simple solution for this — we need to remove the string interpolation for the fragment literal from the query, because graphql-codegen automatically includes fragments.

export const GET_DIALOG = gql(`
  query GetDialog($dialogId: ID!) {
    dialog(id: $dialogId) {
      ...DialogFields
    }
  }
`);

As a result, I did get an not unknown type, but the type with no data from the fragment for the query fragment.

I lost the most time at this stage, eventually finding a solution in the small GitHub thread. We need to disable fragment masking feature.

const config: CodegenConfig = {
  schema: CONFIG.apiHost,
  documents: ['src/**/*.{tsx,ts,js,jsx}', '!src/gql/__generated__/*.ts'],
  generates: {
    './src/gql/__generated__/': {
      preset: 'client',
      plugins: [],
      overwrite: true,
      presetConfig: {
        gqlTagName: 'gql',
        fragmentMasking: false
      }
    }
  },
};

Finally the type contains all the information and it is complete!

How to fix broken Outline VPN after installing Charles on Mac OS

Sometimes, after installing Charles or any other web proxy on your Mac OS, Outline VPN or any other 3rd party client on your Mac OS can break your VPN connection. To fix it you need to:

  1. Remove the web proxy configuration from the «Details» tab of your Wi-Fi network configuration.
  2. Remove the web-proxy configuration from the VPN connection configuration.
  3. If you don’t have VPN connection settings and are using a 3rd party client (e. g. Outline VPN), you will need to remove the VPN connection from the VPN tab in System Preferences (not in your client) and reconnect using the 3rd party client.
  4. In this case the connection will be recreated in System Preferences without proxy settings.

Alternatively, you can manually remove the proxy server configuration from

/Library/Preferences/com.apple.networkextension.plist

using any plist editor (e. g. BBEdit) and restart your OS.

Про дебаг в старых Safari

Знаете, что самое веселое в фронтенд-разработке после похорон IE?
Дебажить приложения под Safari старых версий — это просто нереально...

Как я делал с IE? Качал виртуалку с сайта MS с нужной версией IE и спокойно дебажил.

Как я делаю с Safari? Ищу образ виртуалки, их же официально никто не распространяет, а ушлые ребята распространяют образы только через Patreon, WTF?

На ноут я не могу поставить виртуалку со старой Mac OS, потому что у меня ARM процессор. На ПК я не могу поставить потому, что у меня там процессор AMD, а почему-то на новых AMD виртуалки как-то криво инструкции транслируют.

В итоге приходится искать макбуки на Intel, на них ставить виртуалку со старой ОС и там дебажить — во житуха!

Изначально писал в телеге — тык

Про Apple и поддержку старых фич

Айти — уникальная штука по количеству ошибок с обратной совместимостью, причем даже в глобальных продуктах с кучей пользователей.

У меня в работе (да и не только в работе) очень много всего автоматизировано: переключения между проектами, автозаполнения форм, переводчики по месту, хитрые поиски и линки, генерилки паролей и временных почт, подключалки к серверам, всякие скрипты уровня «сходи туда, скачай то, заскриншоть, отправь в телеграм» и т. д.

Так вот после обновления Mac OS (напомню, лучшая ОС в мире) у меня отвалилась половина скриптов потому, что Apple удалила из стандартной сборки системы python 2 (которому сто лет в обед) и php (зачем он там был, я уже и не вспомню). Пришлось что-то переписать, что-то обновить, о чем-то забыть...

Вот Apple может взять и релизнуть сильно ломающие изменения, а некоторые мои знакомые в своих проектах не могут удалить одно мелкое поле, которым пользуются ну 2% пользователей. Более того, я завсегдатай срачей в тематических чатах про поддержку старых браузеров.

Кажется, всякое старье все-таки можно (и нужно) выпиливать, пользователи не тупые и умеют гуглить, пусть разбираются. Всем бы у Apple поучиться!

Больше постов в телеграме, там шитпостинг ложится лучше

Как я Алису научил открывать домофон

У меня установлен умный домофон, вызовы на который можно принимать с телефона, смотреть через приложения записи камер и открывать через него же дверь.

Это очень удобно, но телефон я не всегда ношу с собой по дому, да и когда готовлю, например, и требуется открыть дверь, то становится довольно неудобно — руки заняты.

Когда я задумался, как бы решить эту проблему, то в голову пришла мысль, что таймеры во время готовки я выставляю через Алису, было бы круто так же открыть и домофон (и входную дверь тоже, но это другая история).
«Алиса, открой домофон», — бах, дверь открыто — красота! Нужно делать.

Во-первых, я изначально заложил 95% на успех, так как домофон у меня через приложение может открываться с телефона.
Во-вторых, мне банально интересно было потыкаться в навыки Алисы и даже 5% неуспеха меня не смущали.
В-третьих, мне никак не хотелось идти вечером пятницы пить пиво.

Опираясь на первый пункт, я подумал, что можно было бы зареверсить эндпоинты всякими HttpToolkit’ами, но прежде решил погуглить и не зря. Нашел репозиторий на гитхабе с интеграцией домофона в какую-то аппку для умных домов, в одном из файликов было описано взаимодействие с апи провайдера.

Я, недолго думаю, постманом получил нужные токены, протыкал ручки — вроде работает. Быстренько накидал простой сервис на ноде, который на запрос по определенному эндопоинту с сикретом (куда же без сесурити) дергает эндпоинт провайдера, в случае неудачи пытается обновить токен и дернуть его еще раз.

Затем пошел на Диалоги, где сделал приватный диалог для Алисы, который перенаправил в ту же ручку. Внутри сервиса дописал пару проверок, чтобы во входящих интентах было «домофон», затем дергался эндпоинт провайдера, а в ответ Алисе уходило «Открываю».

Проверил — работает! Только расстроило, что в диалогах инпут длинный. То есть Алиса слушает это как «Алиса, скажи домофону, чтобы открылся» или около того — явно в команде должно звучать кодовое слово навыка.

Обошел это через создание шортката в сценариях для всех своих станций и... эврика! Теперь Алиса открывает домофон по фразе «Открой домофон». Пятница прошла довольно-таки неплохо!

Изначально тут вообще должен был быть здоровый гайд с примерами кода и кучей скриншотов, но в итоге код получился очень типовой, рокетсайнса никакого, так что убрал все лишнее и поделился чисто тем, что есть.

Видео с демкой залил в телегу — тык.

Шитпостинг в телеграме

TL;DR: Теперь посчу еще и в канал -> https://t.me/fuckanarium

Небольшой кросс-линк своих блогов сделаю.
С недавних пор довольно часто пишу в телеграм канал, посты там менее содержательны и больше в стиле лайф-стайл заметок.

Там и про работу, и про проекты, и про диджеинг и про тусовки и фесты — про все, что происходит в жизни в режиме «почти лайф»!

Ранее Ctrl + ↓