No Rights Reserved

Drafts

Series [0/3]

Why though? | Собственно, зачем? [0/3]

[ IDEA ] - серия постов про разное и всякое, не концентрируясь на “как”, но вместо этого делать упор на “почему”. Почему git это очень удобно и зачем это нужно всякому? А вот почему - и пара примеров и после набор элементарных команд.

Так же можно делать пометку “уровень сложности” - начальный гит к примеру легкий, а вот емакс это уже наверное ближе к “очень сложно”. Хотя, есть варианты.

Алсо, давать литературу и learning path.

  • TODO VI(m) and derivatives

    Because: vim motions.

  • TODO EMACS

    Because: org-mode (show the general stuff)

  • TODO GIT

    Because: show how to version control stuff.

Longreads [1/8]

TODO Про методологию поиска в интернете

https://www.reddit.com/r/RBI/comments/cbham7/how%5Fi%5Ffind%5Fstuff/

  • English text

    Based on the response and requests made in this thread, I’m going to attempt to lay out how I go about finding people, places, things, whatever using almost entirely open source, freely available tools and resources. A few of the tools I use aren’t free (mostly Photoshop and tools like the NGP VAN voter database), but there are frequently free analogs you can use.

    As I’ve thought through how to write this, it occurred to me that I should probably just use the above linked thread as kind of a case study. It would be impossible to write out a step by step guide to tracking shit down, as every search is unique, but I can show you my methodology, and my thinking at each step. As a background on me, I’ve always been incredibly curious and eager to learn new things and was an early explorer of the primitive internet, BBS, etc back in the early 90’s. As an adult, I joined the Army and became a recon platoon leader, where among other things, I worked on teams to find/capture high value targets. Later in life I’ve done some tracing for people needing to find people for legal reasons, and I’ve done oppo research for political candidates. It’s totally a hobby now, but something I think I’m pretty good at.

    So here’s how I do it. Every search is based on a funnel principle. I always want to load the top of the funnel with absolutely as much information as I can, and then start working my way down, discarding irrelevant info and prioritizing potential leads. So, in the thread about the mystery hotel in Thailand, here’s what I did.

    First up, want to analyze in great detail all the available info. Naturally, I started with the photos linked here. I go over each photo very closely. No object, feature, reflection, plant, or design element is too small to notice. In photo 1, a couple of things jumped out. The blue notebook on the table was a big one, and the unique layout of the outdoor kitchen area. The uniquely shaped pool furniture stood out to me as well. The biggest value in this photo is that it gives a good sense of the layout of the room, the unique design of the pool, the kitchenette, and the doors/windows. All of the elements will come into play in the next step.

    The second photo was by far the most helpful, as it gave a full 360 degree view of the room using the reflection. It also showed us a couple of unique features. The indoor/outdoor shower is a big one. If you’re looking for something you know is a vacation spot, it’s likely people would notice/comment on features like that. The fact that it has the six cut in boxes adjacent the shower fixture, and the look of the fixture itself also was important. The unique sink to the right of the picture with the glass suspended over it was very unusual. Finally, the fluffy red towels were a big clue. That’s relatively unique, and very visually recognizable. My first line of thinking was that since this is probably a nice, but relatively cheap accommodation in a third world country, it was possible these unique red towels could have stained someone’s bathing suit or clothes, which is something people very likely would negatively review online, and could be a huge help.

    The third photo provided some more detail on the kitchen, and a good layout of the objects in the entertainment center, and on the table, as well as the position of the kitchen utilities. Notice also the roof patterns, outdoor AC unit, and smoked glass behind the kitchenette. All of these could prove very helpful.

    So once I’d gone through and made extensive mental notes on the unique features, I created in my head (though on paper works even better) a 360 degree layout of the villa, in a way that I could kind of mentally pan and move around. The point of this is to become so familiar with what you are looking for that you can easily recognize it if you see it from other angles, or you notice visually similar things in other photos (appliances, fixtures, bedding, art, furniture, etc). This applies to literally every search. You want to become so familiar with what you are looking for that the subconscious pattern recognition parts of your brain fire off when you see something that connects with what you are looking for.

    The next thing I do is think about the intangibles around what I’m looking for. I had very little info on the missing boyfriend, but I could infer a few things. The girlfriend came to reddit, specifically RBI for help. This indicates that she’s pretty computer literate, and probably a somewhat frequent redditor. That probably means her BF is too. It also means, combined with the fact that he is backpacking alone in Thailand that they are young and adventurous. That made is seem likely that he wasn’t exactly at the Grand Hyatt, but probably a small hotel, or likely if not specifically an AirBnb, someplace that isn’t far off from that in price, quality, etc.

    So once I feel very familiar with the target, I start at the top of that funnel and go for the very big, very easy threads to start digging at. The red towels just felt like an easy initial search. I went to google and started searching combinations of Thailand, Ko Samui, and “red towel(s)". I actually found a negative review of a place that looked somewhat similar complaining exactly about what I had guessed, the red towels at a Thai resort had bled onto their white bathing suit. It’s a shot in the dark, but hey, it almost worked. It wasn’t this place, but it was a decent early lead that didn’t pan out unfortunately.

    From there, I went on TripAdvisor and other travel sites, and searched for combinations of Ko Samui and indoor/outdoor shower, private pool, red towel, blue notebook, and other unique identifiers from the pictures. That wasn’t super productive, but not entirely a dry hole. It gave me some insight into Ko Samui, a place I’ve never been. I started to get a feel for the quality of neighborhoods, which geographic areas were better/worse/more likely to host lower end travel or AirBnb, and so on.

    Once I felt like I had a couple of geographic target areas in mind, I went o AirBnB and started searching open rooms in those areas. This was the most laborious part of the process, but ultimately the one that worked. I was rapid fire scrolling through listings, as there are hundreds, but since I had built such a robust scene of the hotel in my head, it was just a matter of quickly matching patterns. I landed on a few places with matching outdoor furniture, which felt promising. Ultimately though, it was that blue notebook on the table outside that gave it away.

    On about the 300th AirBnB listing I scrolled past, I saw the notebook. I instantly knew I had found maybe not the exact place, but somewhere connected to it. From there it was a matter of identifying exactly where it was geolocated using user reviews and comments that gave away details like proximity to a 7-11 and the beach. Then I just drew a little radius around the 7-11 and searched inside it. Pretty soon I landed on the Samui Boat Lagoon and knew that was the spot. A little more google image searching of that phrase exactly, and I found what I believe is either the exact room the boyfriend was in, or one that was layed out almost identically.

    So now that I’ve typed that all out, it’s probably a lot less exciting that I (or you) had hoped. But searching like this is just recognizing which details are important, building familiarity with the target, having a sense of where to look, and then just pattern matching using open source tools. The part I didn’t really touch on is how to use your personal network of contacts to help with this, but I don’t really have many close contacts in SE Asia these days, so that was not an option here. Despite that, using people on the ground has been immensely helpful to me in finding things, places, and people. Sometimes something as simple as “Hey, what part of your country do you think this is?” can yield really valuable context and clues.

    So assuming the mods are cool with it, I’m happy to answer questions about this, about other interesting searches I’ve completed, or almost anything else. Happy to talk tradecraft, things you can do to make your brain really good at observing and retaining detailed info, and an anything else.

DRFT Cisco and SCP

  • What

    How many ways do you have to `scp` the file to a router’s or switch’s flash? A couple, at least.

  • How

    • Receive a file on Cisco from a remote SCP server

    You logged in to a Cisco box and getting this file from a remove SCP.

    `copy scp://*username*@*remote host*//*remote path*/*remote filename* flash:`

    • Send a file from a SCP server to a Cisco box

    You are logged on a Linux box and sending the file to a remote Cisco.

    `scp local filename remote user*@*Cisco address:flash:/*destination filename*`

    • Get a file from Cisco

    You are logged in to your Cisco box and getting this file from another Cisco device.

    First off, enable an SCP server on the remote guy. You should be able to `ssh` to this box and know the credentials (obviously).

    `ip scp server enable`

    Now, copy it:

    `copy scp://*remote user*@*remote cisco*/*remote filename* flash:*local filename*`

    • Send a file to Cisco (from Cisco)

    `copy flash:*local filename* scp://*remote user*@*remote cisco*/*remote filename*`

  • Notes

    SCP number unknown*Though this one looks quite close to the case..

  • Fun fact

    The beauty of this solution keeps me amazed up to this day. Last time I checked it was 2019 and we still do not have a progress indicator of any sort. Keep counting `!`'s and ~pray~ multiply it by 512.

    The rest of the cryptic symbols are here:

    CharacterDescription
    `.`For net transfers, a period indicates that the copy process timed out. Many periods in a row typically mean that the copy process may fail.
    `O`For net transfers, an uppercase O indicates that a packet was received out of order and the copy process may fail.
    `e`For flash erasures, a lowercase e indicates that a device is being erased.
    `E`An uppercase E indicates an error. The copy process may fail.
    `V`A series of uppercase Vs indicates the progress during the verification of the image checksum.

    [Link][2] [2]: https://www.cisco.com/E-Learning/bulk/public/tac/cim/cib/using%5Fcisco%5Fios%5Fsoftware/cmdrefs/copy.htm

TODO Про Джона Макафи, основателя компании Virgin

Найти здесь про то, как он трахнул кита. Замечательная история же. https://twitter.com/officialmcafee/status/1010682321106821125?lang=en

https://www.reddit.com/r/OutOfTheLoop/comments/ae04as/whats%5Fup%5Fwith%5Fjohn%5Fmcafees%5Ftweets%5Fabout%5Ffucking/

DRFT Digital Borrowing

Libby, спустя 21 день, без предупреждения отобрал у меня “Hearts in Atlantis”, не дав дослушать. Книга начитывается что-то около 20 часов, из которых мне оставалось прослушать часа четыре - оставалась последняя часть - про то, как Бобби возвращается домой. Слушал я в основном на беговой дорожке и я банально не выбегаю такое количество времени в месяц.

(note: libby это онлайн сервис для прослушивания аудиокниг)

В моем детстве продлить библиотечную книгу было довольно просто - достаточно было прийти и заявить об этом. Сейчас, насколько я понимаю, все обстоит примерно так же. Вот (совершенно случайная) ссылка на секцию Обновления, обыкновенной библиотеки Goldsmiths University of London:

How to renew your loans of books from the library

  • Online - онлайн
  • Students App - через приложение
  • In the library - сходив ногами в библиотеку
  • By phone or email - по телефону или имейлу

Важная оговорка: You will not be able to renew books yourself if your account is blocked or the item is reserved - вы не сможете продлить книгу, если ваш аккаунт заблокирован или эта книга уже зарезервирована кем-то другим. Здраво, в целом. Речь ведь идет о физических книгах.

Впрочем, как оказалось, Libby тоже позволяет продлять книги. С некоторыми ограничениями, впрочем. Я не смог продлить книгу, которую мне надо сдать через 9 дней - приложение заявило, что это можно сделать только через 6 дней - то есть за 3 дня до истечения срока. Разумно. Было бы еще неплохо получить напоминание о том, что срок аренды книги скоро истекает, конечно.

Взять книгу обратно я могу только через 2 недели. Почему так - не совсем понятно, потому что книга выдается на 21 день. Просто посчитать, что это не 2 недели, а 3. Ну, тут видимо расчет на сознательного слушателя, который закончит книгу за меньшее время. Ладно.

В статусе Сердец в Атлантиде теперь написано такое: 1 copy in use, 0 people waiting - 1 копия используется, никто не ожидает.

Если у вас до сих пор не возникло странного ощущения что здесь что-то немного не так, наводящий вопрос: сколько копий этого текста используется в настоящий момент? Текста, который вы сейчас читаете.

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

## audible.com

Аудибль это сервис от Амазона. Амазон это ребята, которые хостят основную часть современного интернета. Еще они делают электронные книжки Киндл.

На главной странице мне было предложено вписаться в тестовый месяц использования:

✓ Free membership for 30 days with 1 audiobook + 2 Audible Originals. ✓ After trial, 3 titles each month: 1 audiobook + 2 Audible Originals.

То есть за стоимость подписки (15 долларов в месяц) предлагается к прослушиванию одна книга. Audible Originals это книги, начитанные специально для Аудибль. В списке Best-Selling Audible Originals я не увидел ни одного знакомого автора.

Это, впрочем, говорит только об уровне моей начитанности.

В списке Commitment-free guarantee (гарантия отсутствия обязательств) следующее:

  • You won’t be charged until after 30 days - деньги снимут только после испытательного месяца.

  • Don’t like an audiobook? Swap it for free - если книга не понравилась, ее можно поменять за так. Это хорошо (см. audiobooks)

  • Cancel anytime, no questions asked - тут говорят о том, что подписка может быть отменена в любое время. Это действительно важно знать заранее, это совершенно не та вещь, которую можно ожидать, когда подписываешься на сервис.

Выдержки из FAQ:

What happens to my audiobooks if I cancel my membership?

Nothing at all. Your books are yours to keep. You can continue to listen to them on any of your devices or our app.

Что произойдет с моими аудиокнигами, если я отменю подписку?

Ничего. Вы сохраните книги и сможете слушать их на любых устройствах или на нашем приложении.

Это круто. Однако:

  • Для проигрывания на mp3 плеерах предлагается установить приложение (под Windows). Список поддерживаемых устройств таков:

    • Kindle (разные)
    • Sandisk MP3 Players
    • Creative MP3 Players
    • Garmin & Tom Tom GPS Devices
  • Под Мак вроде как можно скачать книги напрямую, но скачиваются они в непонятном формате `aax`, который еще надо постараться перетащить в `mp3`.

What are Geographic Restrictions and how do they affect shopping on Audible?

When publishers decide to publish a work, they acquire the rights to distribute that particular audiobook in certain regions of the world. Frequently, the rights for an audiobook are split among several companies, each of whom publish for different countries. Audible must abide by these restrictions, though it may occasionally inconvenience the customer.

Тут говорится о том, что издатели аудиокниг по разным причинам могуть владеть правами на распространение только в определененных (не всех) странах. Это значит, что в стране А в списке может присутствовать книга Б, а в стране В ее может и не быть. Упс.

https://audible.custhelp.com/app/answers/detail/a%5Fid/5006/kw/mp3

Can I convert my Audible audiobooks into MP3 files?

Unfortunately, Audible audio files cannot be converted into MP3 or any other file format.The reason for this is because we utilize security technologies to protect the intellectual property rights of our content providers and authors.

Можно ли сконвертировать книгу Аудибль в mp3?

Нет, нельзя. Причина проста - защита интеллектуальной собственности провайдеров контента и авторов.

Из смешного:

https://audible.custhelp.com/app/answers/detail/a%5Fid/4468 Will audiobooks be downloaded to my computer with the Audible Cloud Player?

No content will be downloaded to your computer while using the Audible Cloud Player because the audio is being streamed on your computer through your Internet connection.

Тут говорят о том, что при стриминге аудиокниги никакой контент не будет загружен на компьютер. Технически, это, конечно, не так. Технически, никакой разницы между загрузкой и стримингом не существует. Появляется эта разница только когда контент, загруженный из интернета удаляется с вашего компьютера. То есть, на самом деле “стриминговый” контент это такой, который принудительно удаляется с накопителя после загрузки. Такие дела.

## audiobooks.com

Выдержки из FAQ:

What is a book credit?

1 book credit allows you to listen to any audiobook in our library. If you find yourself wanting to listen to more books, you can add book credits to your subscription as you go.

Can I listen to more than one audiobook per month?

Absolutely! With our subscription plan, one credit is automatically added to your account each month. To get more, you can either purchase top-up credits through the website or claim books instantly using our InstaCredit feature in the app.

То есть - месячная подписка стоит около 15 долларов. В подписку входит 1 книга в месяц (плюс выбор из нескольких книг, меняющийся каждый месяц - это почему-то называется VIP Rewards - Вознаграждение Особо Важным Персонам). Насколько я понимаю, это аналог подписки Sony PSN, в которую каждый месяц включается несколько бесплатных игр.

Раньше у них была возможность слушать книги безо всяких ограничений. Стоило это несколько немилосердно - 25 долларов в месяц - но, в целом, это была неплохая опция. Впрочем, они отменили эту возможность спустя примерно год. Упс.

В этом месяце в списке VIP Rewards было 17 книг. Из всех авторов я знал только Кормака Маккарти (с его Дорогой), но его Дорогу я уже читал.

Это, впрочем, говорит только об уровне моей начитанности.

Дальше:

Why do I always have to listen to a preview?

Our combined Preview and Play button allows you to listen to an audiobook before committing. If you don’t like the audiobook, stop at any time. Around the three-minute mark of most books, you’ll be prompted to hit “Continue”. If you’re enjoying the narrator and story when you get to this point, hit “Continue” and keep listening. If not, preview a few more until you find a great listen.

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

Why is this book unavailable to me?

When publishers get the rights to books, they may only get the rights to distribute in certain countries. We have to honor that distribution, so these books will be regionally restricted. If it were up to us, all audiobooks would be available worldwide!

Снова, географические ограничения на проигрывание контента.

Can I cancel my membership?

Some relationships just aren’t meant to be, which is why there are absolutely no restrictions on when you can cancel your Audiobooks.com membership. Go to the My Account section of the website (the link is in the top right when you’re logged in) and cancel online with the click of a link.

Можно ли отменить подписку? Да! Однако, в отличие от аудибля, тут ни слова о том, что уже прослушанные / приобретенные книги остаются у слушателя. Ладно.

Как обычно, мой основной вопрос - идет ли часть моей оплаты напрямую авторам или их наследникам? В FAQ обоих сервисов про это не написано. Я задал вопрос через специальную форму для задавания вопросов, на audiobooks - пока жду ответа. На Аудибле удобной формы для задавания вопросов найти не удалось.

Вот ответ от audiobooks:

Hi there,

Thanks for your message.

Yes we do have contracts set in place with the authors/publishers. Unfortunately I do not have an exact amount as it would depend on that specific contract/book.

Best,

Tara Customer Service Representative Tell us about your experience and you’ll be entered in our daily draw for a free credit

—– Original Message —–

Hi guys, I could not find this question in FAQ: do my subscription money go to the authors and their respective heirs? How much exactly? Thank you!

  1. “Занимать” цифровые копии безусловно противоестественно. Цифровая природа подразумевает дубликаты, копиии, идентичные оригиналам. Стоимость создания цифрового дубликата пренебрежимо мала.

Противоестественно: то, чего не сущестует в природе. То, что идет против природы вещей. Ограничивать возможность пользоваться цифровой копией книги настолько же противоестественно, как предлагать читать физическую копию книги нескольким читателям одновременно. Это не только противоестественно, но даже как-то жестоко.

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

TODO: Почитать про права на книги, библиотечные практики. Почему происходит именно так? DRM

TODO LM Datasource

https://orgmode.org/manual/results.html

Goal - create a datasource in lm to check that RIPE objects are in fact being advertised.

Datasource: Multinstance

GET https://stat.ripe.net/data/prefix-routing-consistency/data.json?resource=200.87.101.0/24
{
  "status": "ok",
  "server_id": "app001",
  "status_code": 200,
  "version": "0.7",
  "cached": false,
  "see_also": [],
  "time": "2019-10-08T07:49:57.418825",
  "messages": [],
  "data_call_status": "supported - based on version 1.1",
  "process_time": 1058,
  "build_version": "2019.9.25.129",
  "query_id": "20191008074956-61055de0-7676-434d-a0dc-756ff8b79ffa",
  "data": {
    "routes": [
      {
        "origin": 6568,
        "irr_sources": [],
        "in_whois": false,
        "asn_name": "Entel S.A. - EntelNet",
        "prefix": "200.87.0.0/17",
        "in_bgp": true
      },
      {
        "origin": 6568,
        "irr_sources": [
          "NTTCOM"
        ],
        "in_whois": true,
        "asn_name": "Entel S.A. - EntelNet",
        "prefix": "200.87.0.0/16",
        "in_bgp": true
      },
      {
        "origin": 6568,
        "irr_sources": [
          "NTTCOM"
        ],
        "in_whois": true,
        "asn_name": "Entel S.A. - EntelNet",
        "prefix": "200.87.96.0/20",
        "in_bgp": true
      },
      {
        "origin": 6568,
        "irr_sources": [
          "RADB"
        ],
        "in_whois": true,
        "asn_name": "Entel S.A. - EntelNet",
        "prefix": "200.87.101.0/24",
        "in_bgp": false
      }
    ],
    "query_starttime": "2019-10-08T00:00:00",
    "query_endtime": "2019-10-08T00:00:00",
    "resource": "200.87.101.0/24"
  }
}

Groovy iterate over list:

def list = [1,2,3,4]
for(item in list){
    println item
}

Acitve discovery script

import groovy.json.JsonSlurper

def staturl = "https://stat.ripe.net/data/prefix-routing-consistency/data.json?resource=8.18.221.0/24" // TODO: use ##wildvalue## instead of hardcoding

response = new URL ( staturl +
                    URLEncoder.encode(
        "",
        'UTF-8' ) ).text

String jsonString = response

JsonSlurper slurper = new JsonSlurper()
Map parsedJson = slurper.parseText(jsonString)

def id=0

// Build wildvalue
for(route in parsedJson.data.routes){
    println id + "##" + route.asn_name.replaceAll('\\=:# ', '') + "##" + route.prefix + "##" + route.in_whois + ":" + route.in_bgp

    id++
}


if (parsedJson.status_code != 200 ) {
    println "Status code is not 200: " + parsedJson.status_code
    return 1;
}

return 0;

Result:

WildValueWildAliasWildValue2DescriptionProperties
0LEVEL3 - Level 3 Parent, LLCtrue:true8.0.0.0/9
1AIRBNB - Airbnb, Inc.true:true8.18.221.0/24
2LEVEL3 - Level 3 Parent, LLCfalse:true8.16.0.0/12

Collector attributes script

String in_whois = "##WILDVALUE2##".split(':')[0]
String in_bgp = "##WILDVALUE2##".split(':')[1]

if (in_whois == "true") {
    println "in_whois is true"
}

if (in_bgp == "true" ){
    println "in_bgp is true"
}

return 0

Split string

String str1="blah:doot:boop"
println str1.split(':')[2]
  • ASN Routing Consistency
    WildValueWildAliasWildValue2DescriptionProperties
    08.18.221.0/24true:true
    138.68.202.0/24true:true
    22620:127:d000::/40true:false

DRFT Being an expert

  • TODO Being an expert

    Expert.

  • DONE Быть экспертом 📚

    По мотивам одной из начальных глав книги Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt. Эта книга, вроде бы, есть в русском переводе, я не смог найти сходу.

    Вокруг экспертизы, уровней экспертизы и профессионализма, постоянно происходит какой-то нездоровый (подземный) шум, вполне характерный для ситуации когда термин употребляют люди, плохо понимающие значение этого термина. Интуитивно понятно, что если человек эксперт, то в предмете он разбирается. Это, конечно же, так, но, у этого состояния, оказывается, присутствуют прелюбопытнейшие побочки.

    Вкратце, отличие начинающих от экспертов такое:

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

    Эксперта легко отличить от других. Эксперт делает свою работу без видимых усилий. Новички и продвинутые те же самые задачи будут выполнять (гораздо) менее эффективно. Возможно в процессе работы им потребуется обратиться к документации или помощи знакомого профессионала или эксперта. Возможно, неоднократно.

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

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

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

    Обещанные интересные побочки следующие:

    • Стремление стать экспертом объясняется (во многом) тем, что экспертом быть гораздо проще, чем новичком. Гораздо круче, проще и прибыльнее делать работу быстро, не задумываясь и не напрягаясь, чем медленно, потея и фрустрируя от нехватки времени.
    • Эксперт совершенно не обязательно сможет удачно обучать других, менее эффективных товарищей. Причина в интуитивной природе эксперта. “Это все равно что стакан кому-нибудь описывать или, не дай бог, рюмку: только пальцами шевелишь и чертыхаешься от полного бессилия” - очень похоже. Гораздо более эффективным учителем может быть профессионал, не достигший еще уровня экспертизы. Чувак, еще не ставший магом.

Shorties [0/3]

TODO Paypal

Here’s a fine example of ‘global practices’. At least, this story has a good ending.

Fun story. There was a period of time early in PayPal’s life (1998 or 1999 probably?) when they were growing exponentially and had 3 customer service reps. They were getting over 10,000 emails per day and simply did not respond to any of them, as it would be impossible to keep up. Then people started calling their corporate numbers and dialing random extensions to find someone to talk to. Then every desk’s phone was ringing 24 hours a day, so they unplugged them all and used cell phones. One guy even showed up at the office’s front door, so they had to install a card reader to keep non-employees out. It was several months where PayPal had millions of users and there was no customer support whatsoever. Just none. If your money was gone or something, nobody was going to know or help you with it. I think that’s worse than Twitch right now. Anyway, that’s how PayPal ran for a few months until they solved it in one fell swoop, by opening up a 200 seat call center for support. The day the support center went live, support responses went from non-existent to same day. And the founders don’t regret running the company like that, since focusing on new customers instead of existing customers during that time period is what led them to dominate the online payments market and become a billion dollar company while their competitors no longer exist. This all came out of an interview with one of the founders in the past.

Link

TODO Markdown Here

https://markdown-here.com/

POST evil keybindings in org-super-agenda

If you’re using Doom Emacs - add this to your config.el:

(after! evil-org-agenda
  (setq org-super-agenda-header-map
        (copy-keymap evil-org-agenda-mode-map)))

If case you’re using vanilla Emacs use eval-before-load. The after! macro is built on eval-before-load, actually.

! TShirt Print

Today’s links:

I am not sure the make of the tv you have, but I am assuming that you probably matched the soundbar and it’s samsung. In 2016 I spent nearly $2,000 on my Samsung TV and soundbar. Right after, like seriously, days after the 1 year warranty was done, I started getting full screen pop up ads. They would happen regardless of what I was doing.

Imagine trying to play a game, and every 90 or so seconds the game would basically minimize and the pop up would take over. You would have to navigate out of the ad to resume, but it would just happen again a few minutes later.

The fix was hard resetting the tv and disconnecting from power and network.

Absolutely ridiculous

So it goes.

http://www.vimgolf.com/ https://www.moolenaar.net/habits.html https://www.moolenaar.net/

Posts :@personal-blog:

No rights reserved.

2019 Posts

DONE Про Алексу

На декабрьской вписке в Сан Франциско (славный викторианский домик на Mars Street, минут десять в гору от Castro) в числе прочих замечательных штук были две умных колонки Amazon Echo (плюс амазоновский сабвуфер). Чумовые устройства, совершенно.

Кроме очевидного голосового управления (Alexa, play some ambient) эти штуковины теперь умеют сбиваться в стаи. В приложении Alexa можно настроить группы колонок - эти две стоят в спальне, поэтому назовем эту группу bedroom, а эти две стоят в кухне, поэтому называются kitchen - и управлять этими группами по отдельности. Включать музыку в жилой комнате или только в кухне. Плюс к тому, колонки каким-то образом координируются и раскидывают стерео звук друг на друга.

Голосовое управление до сих пор не очень удобное, но в целом работает. Надо внятно сказать Alexa - тогда колонки убавят громкость и начнут прислушиваться. Затем можно сказать что-нибудь вроде set timer to 10 minutes или play Pixies, или, например, shut up, чтобы Алекса замолчала. Можно попросить поставить будильник или закрыть дверь (если в ней есть совместимый умный замок). Можно запустить рецепт IFTT. Можно подключить свой аккаунт Spotify и попросить проиграть тот или иной плейлист.

Зашел после работы в ближайший Best Buy поглядеть амазоновские устройства поближе и посмотреть, что еще из подобного есть рынке. Стенд Amazon Alexa стоит прямо напротив стенда Google (гугловская серия устройств для умного дома теперь называется Google Nest - гнездо). У обоих есть маленькие умные колонки , умные дисплеи (Amazon Echo Show и Google Nest Hub), камеры наблюдения, термостаты, звонки и прочие устройства.

Город будущего уже появился на горизонте.

2020 Posts

Today I Learned (vim surround)

  • TODO Today I Learned :vim:emacs:evil:surround:

    Today I learned that evil-mode has support of surround.vim. Here, I am lazily copying the documentation (see the link below):

    It’s easiest to explain with examples. Press cs"' inside

    "Hello world!"
    

    to change it to

    'Hello world!'
    

    Now press cs'<q> to change it to

    <q>Hello world!</q>
    

    To go full circle, press cst" to get

    "Hello world!"
    

    To remove the delimiters entirely, press ds".

    Hello world!
    

    Now with the cursor on “Hello”, press ysiw] (iw is a text object).

    [Hello] world!
    

    Let’s make that braces and add some space (use } instead of { for no space): cs]{

    { Hello } world!
    

    Now wrap the entire line in parentheses with yssb or yss).

    ({ Hello } world!)
    

    Revert to the original text: ds{ds)

    Hello world!
    

    Emphasize hello: ysiw<em>

    <em>Hello</em> world!
    

    Finally, let’s try out visual mode. Press a capital V (for linewise visual mode) followed by S<p class"important">=.

    <p class="important">
      <em>Hello</em> world!
    </p>
    
  • DONE Неожиданное открытие :vim:emacs:evil:surround:

    Сегодня я выяснил, что в evil-mode есть поддержка surround.vim. Дальше, лениво копирую документацию (см. ссылки ниже).

    It’s easiest to explain with examples. Press cs"' inside

    "Hello world!"
    

    to change it to

    'Hello world!'
    

    Now press cs'<q> to change it to

    <q>Hello world!</q>
    

    To go full circle, press cst" to get

    "Hello world!"
    

    To remove the delimiters entirely, press ds".

    Hello world!
    

    Now with the cursor on “Hello”, press ysiw] (iw is a text object).

    [Hello] world!
    

    Let’s make that braces and add some space (use } instead of { for no space): cs]{

    { Hello } world!
    

    Now wrap the entire line in parentheses with yssb or yss).

    ({ Hello } world!)
    

    Revert to the original text: ds{ds)

    Hello world!
    

    Emphasize hello: ysiw<em>

    <em>Hello</em> world!
    

    Finally, let’s try out visual mode. Press a capital V (for linewise visual mode) followed by S<p class"important">=.

    <p class="important">
      <em>Hello</em> world!
    </p>
    

DRFT Еще один пример хорошего дизайна

В моих новых наушниках Jabra Elite 85h музло ставится на паузу, когда снимаешь наушники, и продолжает играть когда надеваешь их обратно. Это пример потрясного прозрачного для пользователя дизайна продукта. Такое поведение совершенно естественно, привыкаешь к этому моментально.

Еще из примеров потрясного дизайна - включение подсветки приборной панели автомобиля ручкой включения фар. То есть происходит следующее: стало темно, плохо видно панель, ты включаешь подсветку панели и заодно включаешь фары. То что эти два действия совмещены в одном - совершенно гениальное решение.

DONE TextFSM - State Change [2/2]

  • DONE TextFSM - Изменение стейта :automation:textfsm:nornir::

    • Что?

      TextFSM это питоновский модуль для парсинга (плохо) форматированного текста. Изначально был спроектирован для парсинга вывода cli разных устройств - в частности, сетевых.

      В TextFSM существует три важных сущности: ввод, список правил и вывод.

      Вывод cli я буду называть ввод (хе-хе) - потому что это та информация, которую нам нужно распарсить. Этот вывод мы скармливаем машине конечных автоматов TextFSM, которая обрабатывает (парсит) его в соответствии со списком правил. Получившийся текст уходит в вывод.

    • Как?

      TextFSM это final state machine - машина конечных автоматов. В простейшем случае, в TextFSM есть два состояния: Start (обязательно должно присутствовать в файле шаблона) и EOF - implicit (подразумеваемое) состояние, переход на которое происходит когда мы прочитали весь файл.

      Алгоритм FSM примерно такой:

      1. FSM читает строчку из ввода;
      2. FSM проверяет, матчится ли эта строчка с правилами из списка правил. Список правил для каждой строчки из ввода проверяется сверху вниз, с первой строки списка правил;
      3. Если строчка матчится одной из строчек списка правил, FSM выполняет действие и переходит к следующей строчке ввода, снова ее сверяя со списком правил, начиная с первой строчки списка. Также, в этом шаге могут заполняться значения переменных.

      Подробнее про алгоритм FSM, действия и правила можно почитать в документации (см. Ссылки)

    • Зачем?

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

    • FSM с одним состоянием (не считая EOF)

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

      [ Ввод ]

      Server group radius
          Sharecount = 1  sg_unconfigured = FALSE
          Type = standard  Memlocks = 1
          Server(10.14.121.20:1814,1815) Transactions:
          Authen: 6	Author: 0	Acct: 0
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.3.121.20:1814,1815) Transactions:
          Authen: 3	Author: 33	Acct: 333
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.4.12.26:1814,1815) Transactions:
          Authen: 4	Author: 0	Acct: 0
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.129.111.20:1814,1815) Transactions:
          Authen: 5	Author: 0	Acct: 555
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(172.30.2.123:1812,1813) Transactions:
          Authen: 0	Author: 0	Acct: 0
          Server_auto_test_enabled: TRUE
           Keywrap enabled: FALSE
      Server group SERVER_GROUP_2
          Sharecount = 1  sg_unconfigured = FALSE
          Type = standard  Memlocks = 1
          Server(172.30.10.123:1812,1813) Transactions:
          Authen: 2249	Author: 0	Acct: 22424
          Server_auto_test_enabled: TRUE
           Keywrap enabled: FALSE
      

      Эту конструкцию можно распарсить так:

      [ Список правил ]

      Value Filldown NAME (\S+)
      Value Filldown SHARECOUNT (\d+)
      Value Filldown SG_UNCONFIGURED (TRUE|FALSE)
      Value Filldown TYPE (\w+)
      Value Filldown MEMLOCKS (\d+)
      Value Required SERVER_IP (\d+\.\d+\.\d+\.\d+)
      Value AUTH_PORT (\d+)
      Value ACC_PORT (\d+)
      Value AUTO_TEST_ENABLED (TRUE|FALSE)
      Value KEYWRAP_ENABLED (TRUE|FALSE)
      Value AUTHEN_COUNT (\d+)
      Value AUTHOR_COUNT (\d+)
      Value ACCT_COUNT (\d+)
             
      Start
        ^Server group ${NAME}
        ^.*Sharecount = ${SHARECOUNT}.*sg_unconfigured = ${SG_UNCONFIGURED}
        ^.*Type = ${TYPE}.*Memlocks = ${MEMLOCKS}
        ^.*Server\(${SERVER_IP}\:${AUTH_PORT},${ACC_PORT}\)
        ^.*Authen: ${AUTHEN_COUNT}.*Author: ${AUTHOR_COUNT}.*Acct: ${ACCT_COUNT}
        ^.*Server_auto_test_enabled: ${AUTO_TEST_ENABLED}
        ^.*Keywrap enabled: ${KEYWRAP_ENABLED} -> Record
      
      graph TD;
        Start-->EOF;
      

      [ Вывод ]

      ['NAME', 'SHARECOUNT', 'SG_UNCONFIGURED', 'TYPE', 'MEMLOCKS', 'SERVER_IP', 'AUTH_PORT', 'ACC_PORT', 'AUTO_TEST_ENABLED', 'KEYWRAP_ENABLED', 'AUTHEN_COUNT', 'AUTHOR_COUNT', 'ACCT_COUNT']
      ['radius', '1', 'FALSE', 'standard', '1', '10.14.121.20', '1814', '1815', 'FALSE', 'FALSE', '6', '0', '0']
      ['radius', '1', 'FALSE', 'standard', '1', '10.3.121.20', '1814', '1815', 'FALSE', 'FALSE', '3', '33', '333']
      ['radius', '1', 'FALSE', 'standard', '1', '10.4.12.26', '1814', '1815', 'FALSE', 'FALSE', '4', '0', '0']
      ['radius', '1', 'FALSE', 'standard', '1', '10.129.111.20', '1814', '1815', 'FALSE', 'FALSE', '5', '0', '555']
      ['radius', '1', 'FALSE', 'standard', '1', '172.30.2.123', '1812', '1813', 'TRUE', 'FALSE', '0', '0', '0']
      ['SERVER_GROUP_2', '1', 'FALSE', 'standard', '1', '172.30.10.123', '1812', '1813', 'TRUE', 'FALSE', '2249', '0', '22424']
      

      Обратите внимание на строчку Keywrap enabled:. Она идет в конце каждой секции и на ней отрабатывает действие Record - которое записывает накопленные значения в строчку вывода.

    • FSM с двумя состояниями (не считая EOF)

      [ Ввод ]

      total number of groups:3
             
      following RADIUS server groups are configured:
              group radius:
                      server: all configured radius servers
                      deadtime is 0
              group RADIUS_GROUP_A:
                      server: 10.65.101.22 on auth-port 1814, acct-port 1815
                      server: 10.110.101.22 on auth-port 1814, acct-port 1815
                      server: 10.194.101.22 on auth-port 1814, acct-port 1815
                      server: 10.10.10.27 on auth-port 1814, acct-port 1815
                      deadtime is 0
                      vrf is management
                      Source interface mgmt0
              group RADIUS_GROUP_B:
                      server: 172.40.2.14 on auth-port 1812, acct-port 1813
                      deadtime is 10
                      Source interface loopback0
      

      [ Список правил ]

      Value Required NAME (\S+)
      Value List SERVER (\d+\.\d+\.\d+\.\d+|all configured radius servers)
      Value DEADTIME (\d+)
      Value List AUTH_PORT (\d+)
      Value List ACCT_PORT (\d+)
      Value VRF (\S+)
      Value SOURCE_INTERFACE (\S+)
             
      Start
        ^.*group ${NAME}: -> Group
             
      Group
        ^.*server:\s*${SERVER}\s*on auth-port ${AUTH_PORT}, acct-port ${ACCT_PORT}
        ^.*server:\s*${SERVER} -> AllServers
        ^.*vrf is ${VRF}
        ^.*Source interface ${SOURCE_INTERFACE} -> Record Start
        ^.*deadtime is ${DEADTIME}
             
      AllServers
        ^.*deadtime is ${DEADTIME} -> Record Start
      
      graph TD;
        Start-->AllServers;
        AllServers-->Start;
        Start-->EOF;
      

      [ Вывод ]

      ['NAME', 'SERVER', 'DEADTIME', 'AUTH_PORT', 'ACCT_PORT', 'VRF', 'SOURCE_INTERFACE']
      ['radius', ['all configured radius servers'], '0', [], [], '', '']
      ['RADIUS_GROUP_A', ['10.65.101.22', '10.110.101.22', '10.194.101.22', '10.10.10.27'], '0', ['1814', '1814', '1814', '1814'], ['1815', '1815', '1815', '1815'], 'management', 'mgmt0']
      ['RADIUS_GROUP_B', ['172.40.2.14'], '10', ['1812'], ['1813'], '', 'loopback0']
      

      Ага, но почему так хитро? Потому что в группе radius последняя строчка перед следющей группой это deadtime is 0, а в остальных группах последняя строчка это Source interface. Для обработки этих разных групп нужны разные списки правил, которые раскидываются по разным стейтам (Start и AllServers).

      Условие перехода на стейт AllServers - строчка server: all configured radius servers, которая матчится правилом ^.*server:\s*${SERVER} -> AllServers.

      В стейте AllServers мы доходим до строчки deadtime is, записываем состояние и возвращаемся в стейт Start.

      Если FSM остается в стейте Start, запись состояния происходит после матчинга строчки Source interface.

  • DONE TextFSM - Changing a state :automation:textfsm:nornir::

    • What?

      TextFSM is a python module for parsing (badly) formatted text. It was originally designed to parse the output of cli from different devices - in particular, the network.

      In TextFSM there are three important entities: input, list of rules and output.

      The CLI output I’m going to call input (hehehe) because that’s the information that we need to parse. That’s the conclusion we’re feeding to the FSM. TextFSM, which processes (parses) it according to the list of rules. The resulting text goes into output.

    • How?

      TextFSM is a final state machine. In the simplest case, in TextFSM there are two states: Start (must be present in the template file) and EOF - an implicit state to which the transition happens when FSM reaches the end of the file.

      The FSM alrorithm is something like this:

      1. FSM reads a line from input;
      2. FSM checks if this line matches the rules from the list of rules. List of the rules for each line of input is checked from top to bottom, starting from the first line of the list of rules;
      3. If a line matches one of the rules in the list of rules, the FSM executes the action and goes to the next line of input, checking it against the list of rules again, starting on the first line of the list, again. Also, in this step, FSM can fill in the variable values.

      More information on the algorithm, actions and rules can be found in the documentation. (see References)

    • Why?

      If we have a simple output with repeating values, we can use only one state, filling the string with the values of matched variables. If the output is less structured, you will most likely have to use additional states.

    • FSM with one state (except EOF)

      One stage is enough when input clearly defines the separator between the lines of output, as for example here:

      [ Input ]

      Server group radius
          Sharecount = 1  sg_unconfigured = FALSE
          Type = standard  Memlocks = 1
          Server(10.14.121.20:1814,1815) Transactions:
          Authen: 6	Author: 0	Acct: 0
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.3.121.20:1814,1815) Transactions:
          Authen: 3	Author: 33	Acct: 333
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.4.12.26:1814,1815) Transactions:
          Authen: 4	Author: 0	Acct: 0
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(10.129.111.20:1814,1815) Transactions:
          Authen: 5	Author: 0	Acct: 555
          Server_auto_test_enabled: FALSE
           Keywrap enabled: FALSE
          Server(172.30.2.123:1812,1813) Transactions:
          Authen: 0	Author: 0	Acct: 0
          Server_auto_test_enabled: TRUE
           Keywrap enabled: FALSE
      Server group SERVER_GROUP_2
          Sharecount = 1  sg_unconfigured = FALSE
          Type = standard  Memlocks = 1
          Server(172.30.10.123:1812,1813) Transactions:
          Authen: 2249	Author: 0	Acct: 22424
          Server_auto_test_enabled: TRUE
           Keywrap enabled: FALSE
      

      This structure can be parsed this way:

      [ List of rules ]

      Value Filldown NAME (\S+)
      Value Filldown SHARECOUNT (\d+)
      Value Filldown SG_UNCONFIGURED (TRUE|FALSE)
      Value Filldown TYPE (\w+)
      Value Filldown MEMLOCKS (\d+)
      Value Required SERVER_IP (\d+\.\d+\.\d+\.\d+)
      Value AUTH_PORT (\d+)
      Value ACC_PORT (\d+)
      Value AUTO_TEST_ENABLED (TRUE|FALSE)
      Value KEYWRAP_ENABLED (TRUE|FALSE)
      Value AUTHEN_COUNT (\d+)
      Value AUTHOR_COUNT (\d+)
      Value ACCT_COUNT (\d+)
             
      Start
        ^Server group ${NAME}
        ^.*Sharecount = ${SHARECOUNT}.*sg_unconfigured = ${SG_UNCONFIGURED}
        ^.*Type = ${TYPE}.*Memlocks = ${MEMLOCKS}
        ^.*Server\(${SERVER_IP}\:${AUTH_PORT},${ACC_PORT}\)
        ^.*Authen: ${AUTHEN_COUNT}.*Author: ${AUTHOR_COUNT}.*Acct: ${ACCT_COUNT}
        ^.*Server_auto_test_enabled: ${AUTO_TEST_ENABLED}
        ^.*Keywrap enabled: ${KEYWRAP_ENABLED} -> Record
      
      graph TD;
        Start-->EOF;
      

      [ Output ]

      ['NAME', 'SHARECOUNT', 'SG_UNCONFIGURED', 'TYPE', 'MEMLOCKS', 'SERVER_IP', 'AUTH_PORT', 'ACC_PORT', 'AUTO_TEST_ENABLED', 'KEYWRAP_ENABLED', 'AUTHEN_COUNT', 'AUTHOR_COUNT', 'ACCT_COUNT']
      ['radius', '1', 'FALSE', 'standard', '1', '10.14.121.20', '1814', '1815', 'FALSE', 'FALSE', '6', '0', '0']
      ['radius', '1', 'FALSE', 'standard', '1', '10.3.121.20', '1814', '1815', 'FALSE', 'FALSE', '3', '33', '333']
      ['radius', '1', 'FALSE', 'standard', '1', '10.4.12.26', '1814', '1815', 'FALSE', 'FALSE', '4', '0', '0']
      ['radius', '1', 'FALSE', 'standard', '1', '10.129.111.20', '1814', '1815', 'FALSE', 'FALSE', '5', '0', '555']
      ['radius', '1', 'FALSE', 'standard', '1', '172.30.2.123', '1812', '1813', 'TRUE', 'FALSE', '0', '0', '0']
      ['SERVER_GROUP_2', '1', 'FALSE', 'standard', '1', '172.30.10.123', '1812', '1813', 'TRUE', 'FALSE', '2249', '0', '22424']
      

      Note the line Keywrap enabled:. It goes in the end of each section and triggers the the Record action - which writes the accumulated values to output.

    • FSM with two states (except EOF)

      [ Input ]

      total number of groups:3
             
      following RADIUS server groups are configured:
              group radius:
                      server: all configured radius servers
                      deadtime is 0
              group RADIUS_GROUP_A:
                      server: 10.65.101.22 on auth-port 1814, acct-port 1815
                      server: 10.110.101.22 on auth-port 1814, acct-port 1815
                      server: 10.194.101.22 on auth-port 1814, acct-port 1815
                      server: 10.10.10.27 on auth-port 1814, acct-port 1815
                      deadtime is 0
                      vrf is management
                      Source interface mgmt0
              group RADIUS_GROUP_B:
                      server: 172.40.2.14 on auth-port 1812, acct-port 1813
                      deadtime is 10
                      Source interface loopback0
      

      [ List of rules ]

      Value Required NAME (\S+)
      Value List SERVER (\d+\.\d+\.\d+\.\d+|all configured radius servers)
      Value DEADTIME (\d+)
      Value List AUTH_PORT (\d+)
      Value List ACCT_PORT (\d+)
      Value VRF (\S+)
      Value SOURCE_INTERFACE (\S+)
             
      Start
        ^.*group ${NAME}: -> Group
             
      Group
        ^.*server:\s*${SERVER}\s*on auth-port ${AUTH_PORT}, acct-port ${ACCT_PORT}
        ^.*server:\s*${SERVER} -> AllServers
        ^.*vrf is ${VRF}
        ^.*Source interface ${SOURCE_INTERFACE} -> Record Start
        ^.*deadtime is ${DEADTIME}
             
      AllServers
        ^.*deadtime is ${DEADTIME} -> Record Start
      
      graph TD;
        Start-->AllServers;
        AllServers-->Start;
        Start-->EOF;
      

      [ Output ]

      ['NAME', 'SERVER', 'DEADTIME', 'AUTH_PORT', 'ACCT_PORT', 'VRF', 'SOURCE_INTERFACE']
      ['radius', ['all configured radius servers'], '0', [], [], '', '']
      ['RADIUS_GROUP_A', ['10.65.101.22', '10.110.101.22', '10.194.101.22', '10.10.10.27'], '0', ['1814', '1814', '1814', '1814'], ['1815', '1815', '1815', '1815'], 'management', 'mgmt0']
      ['RADIUS_GROUP_B', ['172.40.2.14'], '10', ['1812'], ['1813'], '', 'loopback0']
      

      Ok, but why do we need 2 states? Because in the group radius the last line before the next group is deadtime is 0, and in other groups the last line is Source interface. To process these different groups, you need different rule lists, which go to different states (Start and AllServers).

      The condition that triggers the transition to AllServers state - the string server: all configured radius servers, that is getting matched by this rule: ^.*server:\s*${SERVER} -> AllServers.

      In the state AllServers FSM reaches the line deadtime is, writes the state and returns to the state Start.

      If FSM stays in the state Start, the state of the collected variables is getting written after the Source interface line is getting matched.

Ansible For Devops [ru/en]

  • DONE Ansible For Devops [ru] :ansible:осуждение:

    Взял тут книгу по Ansible, непонятное в ней начинается с первых же страниц:

    1. Clear - Ansible uses a simple syntax (YAML) and is easy for anyone (developers, sysadmins, managers) to understand. APIs are simple and sensible.

    Угу, если не принимать во внимание indentation и сложность (и неоднозначность) синтаксиса YAML.

    1. Fast - Fast to learn, fast to set up—especially considering you don’t need to install extra agents or daemons on all your servers!

    Ага, если не учитывать довольно значительное количество значений по умолчанию, которые совершенно не очевидны, если не заглядывать в документацию. Кстати, хорошая оговорка про то, что fast в значении fast to learn/set up (что не вполне верно), но не в значении fast to execute. Исполняются же плейбуки жутко медленно.

    1. Complete - Ansible does three things in one, and does them very well.

    Ну да, если не учитывать тот факт, что всякий раз, когда мне надо что-то автоматизировать, мне приходится колхозить либо дополнительные скрипты, либо api вызовы непосредственно из Ansible. Не то, что бы это была беда самого ансибля, конечно, но.

    1. Efficient - No extra software on your servers means more resources for your applications. Also, since Ansible modules work via JSON, Ansible is extensible with modules written in a programming language you already know.

    В целом, наверное, правда. ‘Efficient’ as in ‘clientless’.

    1. Secure - Ansible uses SSH, and requires no extra open ports or potentially - vulnerable daemons on your servers.

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

    Дальше идет пример с модулем ping.

    ansible example -m ping -u [username]

    И поясняется:

    If everything worked, you should see a message that shows www.example.com | success >>, then the result of your ping.

    Это довольно типичный, кстати, пример, который в целом хорошо иллюстрирует то, что мне не нравится в ансибле:

    1. Нигде не упоминается, что это не icmp ping. Я знаю, что в актуальной документации специально оговаривается, что ребята, это не icmp, если хотите icmp то делайте net_ping и проч и проч НО: проблема в том, что этот самый ping не надо было называть в точности так же, как и самую распространенную утилиту диагностики сетевого уровня. Это плохой дизайн, хреновая идея, это запутывает. Еще один пример корневого плохого дизайна это стандартная пара ключей src / dest, которая используется в множестве модулей Ansible. Присмотритесь: не src / dst, но src / dest. Никогда так не делайте.
    2. Нигде (в этом конкретном примере в книге) не упоминается, как эта команда работает и что она действительно делает. Это в целом тоже часть философии Ansible - под капот нужно заглядывать только тогда, когда это действительно необходимо (по мнению архитекторов Ansible). Это, конечно, неправильно.

    В официальной документации Ansible все не лучше. Практически каждый модуль документирован так, что приходится лезть в код, чтобы разобраться, что именно происходит и как именно надо этот модуль использовать. Как-то излишне стремно для продукта, который собственно создан для YAML-программистов, которые не должны знать ничего кроме ямла.

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

Photos

Structures

DONE Structures

IMG_6372.jpg

DONE Сооружения

IMG_6372.jpg

129 Die In Jet

DONE 129 Die In Jet

129 Die In Jet

DONE 129 Die In Jet | ru

1

https://toolbox.google.com/datasetsearch

Music

Threnos: On Thorns I Lay (ru/en)

DONE Threnos: On Thorns I Lay [ru]

DONE Threnos: On Thorns I Lay [en]

Video

DONE Cure | The Forest

Awesomeness

Avatar
Nelson Bighetti
Professor of Artificial Intelligence

My research interests include distributed robotics, mobile computing and programmable matter.

Следующий