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

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

Окэ-эй, думаю я: если ты споришь в своём кругу о “норме”, а с тобой большинство не соглашается, значит “норма” не такая. Факт медицинский!

Вполне возможно, что он иногда думает, что ездить на мотоцикле с револьвером – это вариант нормы.

Всё вышеописанное не означает, что необходимо осудить его за это и бросить слушать подкаст. Нет, достаточно иметь своё собственное мнение. [+]

Сегодня пытался вспомнить, когда бросил курить. Не помню.

Если верить записи: https://entropii.net/?p=1156, то как минимум 11 лет назад.

Комаровский-то оказывается тоже бросал, вот его сегодняшнее видео на тему: https://www.youtube.com/watch?v=IxoO0lsRmpo

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

В пяти/десятиминутной доступности у меня примерно десять точек, где можно взять стаканчик.

И вот эти все кофейни, каждый во что горазд, придумывают свои маркетинговые ухищрения. У кого-то каждая шестая или седьмая чашка кофе бесплатно, у кого-то считаются только “на вынос”, у кого-то по номеру телефона, у кого-то по последним четырем цифрам, у кого-то надо печати на карту ставить, кто-то держит карточки у себя под стойкой и ставит галочки. У одной сети кофеен в разных точках отдельные базы и счётчики, поэтому бесплатные чашки не переносятся между точками. У кого-то скидка за инстаграм, у кого-то скидка за “свою” чашку, а у кое-кого за одноразовый стакан наоборот добавляют к сумме счёта. Ещё у одной по достижении 60 чашек присваивается другой уровень лояльности, хотя сильно дешевле не становится, на самом-то деле.

Вот новая кофейня решила выделиться, у них каждая пятая чашка бесплатно. Ну ОК.

В-общем идут на все любые ухищрения, чтобы ты пришёл ещё раз именно к ним.

Так вот, причём тут Microsoft казалось бы…

У меня есть подписка Microsoft 365 для семьи, в Казахстане сейчас стоит 38 990 тенге, пролонгируется автоматически и карта привязана. Срок подходит к концу. Ну думаю, что дороговато, пойду в интернете куплю подешевле. Захожу в учётную запись и там есть кнопка “Выключить периодическое выставление счетов”. Ну думаю отключу, чего уж там.

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

Ладно, думаю, уговорил, не буду отключать. И два месяца лишних получу к купленным двенадцати, и всё равно чуть позже куплю в интернете процентов на 20-25 дешевле. Вижу цену 29 990 тенге в одном уважаемом местном магазине.

PS.

У них же ещё есть какая-то программа Microsoft Rewards, можно зарабатывать бонусы и тратить. И можно даже поднять уровень своей лояльности:

To reach Level 2 status in Microsoft Rewards, you need to earn 500 points in a single month. Once you reach Level 2, you can earn up to 5,000 points per month. Level 2 members can earn five times more points on Bing.com, save up to 10% on rewards from Microsoft products and services, and get access to exclusive offers. To maintain your Level 2 status, you need to earn at least 500 points per month. As a Level 2 member, you can earn 10 points per dollar spent, plus bonus points, when you make qualifying digital purchases at the Microsoft Store.

ZDOC_3292

chatGPT

Ну допустим, я показал ему текст некоторой программы:

REPORT y_bc001_text_search.

TABLES: tadir.

SELECT-OPTIONS: s_devc FOR tadir-devclass DEFAULT 'Z*' OPTION CP.
SELECT-OPTIONS: s_objec FOR tadir-object.
SELECT-OPTIONS: s_objnm FOR tadir-obj_name DEFAULT 'Z*' OPTION CP.
PARAMETERS: p_text TYPE string.

START-OF-SELECTION.

  SELECT
    tadir~pgmid,
    tadir~object,
    tadir~obj_name,
    trdir~subc,
    tadir~devclass
    FROM tadir
    LEFT OUTER JOIN trdir ON tadir~object = 'PROG' AND tadir~obj_name = trdir~name
    INTO TABLE @DATA(lt_objects)
   WHERE tadir~devclass IN @s_devc
     AND tadir~object IN @s_objec
     AND tadir~obj_name IN @s_objnm
      AND ( tadir~object = 'PROG' OR tadir~object = 'FUGR' OR tadir~object = 'CLAS' ).

  LOOP AT lt_objects ASSIGNING FIELD-SYMBOL(<object>).
    IF <object>-object = 'PROG'  AND ( <object>-subc = '1' OR <object>-subc = 'M' ).

      DATA: lt_tpool TYPE STANDARD TABLE OF textpool WITH DEFAULT KEY.
      CALL FUNCTION 'RS_TEXTPOOL_READ'
        EXPORTING
          objectname           = <object>-obj_name
          action               = 'READ'
*         AUTHORITY_CHECK      = ' '
          language             = sy-langu
        TABLES
          tpool                = lt_tpool
        EXCEPTIONS
          object_not_found     = 1
          permission_failure   = 2
          invalid_program_type = 3
          error_occured        = 4
          action_cancelled     = 5
          OTHERS               = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      LOOP AT lt_tpool ASSIGNING FIELD-SYMBOL(<tpool>).
        IF <tpool>-id = 'I' AND <tpool>-entry CP p_text.
          WRITE: <object>-obj_name, <tpool>-key, <tpool>-entry.
        ENDIF.
      ENDLOOP.
    ELSEIF <object>-object = 'FUGR'.

      DATA: lv_fugr TYPE rs38m-programm.
      lv_fugr = 'SAPL' && <object>-obj_name.

      CALL FUNCTION 'RS_TEXTPOOL_READ'
        EXPORTING
          objectname           = lv_fugr
          action               = 'READ'
*         AUTHORITY_CHECK      = ' '
          language             = sy-langu
        TABLES
          tpool                = lt_tpool
        EXCEPTIONS
          object_not_found     = 1
          permission_failure   = 2
          invalid_program_type = 3
          error_occured        = 4
          action_cancelled     = 5
          OTHERS               = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      LOOP AT lt_tpool ASSIGNING <tpool>.
        IF <tpool>-id = 'I' AND <tpool>-entry CP p_text.
          WRITE: <object>-obj_name, <tpool>-key, <tpool>-entry.
        ENDIF.
      ENDLOOP.

    ELSEIF <object>-object = 'CLAS'.

      DATA: lv_clas TYPE rs38m-programm.
      lv_clas = <object>-obj_name.

      DATA(lv_eq_count) = 30 - strlen( lv_clas ).
      DO lv_eq_count TIMES.
        lv_clas = lv_clas && '='.
      ENDDO.
      lv_clas = lv_clas && 'CP'.

      CALL FUNCTION 'RS_TEXTPOOL_READ'
        EXPORTING
          objectname           = lv_clas
          action               = 'READ'
*         AUTHORITY_CHECK      = ' '
          language             = sy-langu
        TABLES
          tpool                = lt_tpool
        EXCEPTIONS
          object_not_found     = 1
          permission_failure   = 2
          invalid_program_type = 3
          error_occured        = 4
          action_cancelled     = 5
          OTHERS               = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      LOOP AT lt_tpool ASSIGNING <tpool>.
        IF <tpool>-id = 'I' AND <tpool>-entry CP p_text.
          WRITE: <object>-obj_name, <tpool>-key, <tpool>-entry.
        ENDIF.
      ENDLOOP.
    ENDIF.

  ENDLOOP.

END-OF-SELECTION.

  WRITE: / 'Search completed:', p_text.

Так вот, сервис может пояснить за код, лучше чем я:

(more…)

Есть в ABAP кое-какие языковые конструкции, отсутствующие в топовых языках, по крайней мере на базовом уровне, например MOVE-CORRESPONDING.

VARYING – это одна из таких конструкций. Я изредка использовал её в базовом варианте:

DATA: BEGIN OF ls_varstr,
        cod01 TYPE char20,
        cod02 TYPE char20,
        cod03 TYPE char20,
        cod04 TYPE char20,
      END OF ls_varstr.

ls_varstr = VALUE #(
  cod01 = '001'
  cod02 = '002'
  cod03 = '003'
  cod04 = '004'
).

DATA: lv_code  TYPE char20.

DO 4 TIMES VARYING lv_code FROM ls_varstr-cod01  NEXT ls_varstr-cod02.

  WRITE: / lv_code.

ENDDO.

Результат предсказуем:

Но как иногда оказывается, у этой конструкции есть две дополнительных глубины.

Во-первых, можно крутить два поля одновременно:

DATA: BEGIN OF ls_varstr,
        cod01 TYPE char20,
        val01 TYPE char100,
        cod02 TYPE char20,
        val02 TYPE char100,
        cod03 TYPE char20,
        val03 TYPE char100,
        cod04 TYPE char20,
        val04 TYPE char100,
      END OF ls_varstr.

ls_varstr = VALUE #(
  cod01 = '001' val01 = 'First'
  cod02 = '002' val02 = 'Second'
  cod03 = '003' val03 = 'Third'
  cod04 = '004' val04 = 'Fofth'
).

DATA: lv_code  TYPE char20.
DATA: lv_value TYPE char100.

DO 4 TIMES
   VARYING lv_code FROM ls_varstr-cod01  NEXT ls_varstr-cod02
   VARYING lv_value FROM ls_varstr-val01  NEXT ls_varstr-val02.

  WRITE: / lv_code, '=', lv_value .

ENDDO.

И оказывается так тоже можно, результат не удивит:

А во-вторых, поля в последовательности могут называться как угодно.

Мне раньше казалось, что нумерация в поле очень важна: VAL01, VAL02. Магия! А вот нет. Так тоже можно:

DATA: BEGIN OF ls_varstr,
        first         TYPE char20,
        second        TYPE char20,
        i-do-not-know TYPE char20,
        wtf           TYPE char20,
      END OF ls_varstr.

ls_varstr = VALUE #(
  first         = '001'
  second        = '002'
  i-do-not-know = '003'
  wtf           = '004'
).

DATA: lv_code  TYPE char20.

DO 4 TIMES VARYING lv_code FROM ls_varstr-first  NEXT ls_varstr-second.

  WRITE: / lv_code.

ENDDO.

Если чуть подумать, то станет всё понятнее, как оно было заложено и почему. Могу проиллюстрировать на менее интуитивно понятном примере:

DATA: BEGIN OF ls_varstr,
        cod01     TYPE char20,
        val01     TYPE char100,
        cod02     TYPE char20,
        val02     TYPE char100,
        cod03     TYPE char20,
        val03     TYPE char100,
        cod04     TYPE char20,
        val04     TYPE char100,

        other     TYPE text60,
        fields    TYPE text60,
      END OF ls_varstr.

ls_varstr = VALUE #(
  cod01 = '001' val01 = 'First'
  cod02 = '002' val02 = 'Second'
  cod03 = '003' val03 = 'Third'
  cod04 = '004' val04 = 'Fofth'

  other     = 'Other~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
  fields    = 'Fields~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
).

DATA: lv_code  TYPE char20.
DATA: lv_value TYPE char100.

DO 5 TIMES
   VARYING lv_code FROM ls_varstr-cod01  NEXT ls_varstr-cod02
   VARYING lv_value FROM ls_varstr-val01  NEXT ls_varstr-val02.

  WRITE: / lv_code, '=', lv_value .

ENDDO.

Обратите внимание на DO 5 TIMES. Ха-ха? Знаете что произойдёт?

(more…)

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

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

Потихоньку, пока дети растут, я начал понимать несостоятельность такой аналогии.

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

Я сам часто говорю сам своей двухлетней дочери, что:

  • мы идём гулять (а не в поликлинику)
  • больно от укольчика не будет
  • надо выпить вкусный сиропчик, тогда животик сразу пройдёт
  • микробы сейчас на тебя ка-а-ак нападут (и я вам покажу откуда)
  • это самая вкусная каша на свете
  • этот дяденька очень плохой
  • это только для взрослых
  • пульт потерялся
  • если много смотреть мультики, то можно стать зомби
  • кукла Маша по тебе скучает
  • зайчик хочет спать
  • папа устал

… и тому подобное, и так далее до бесконечности.

Ну как до бесконечности… пока не подрастёт и не начнёт соображать сама.

Разве это ложь?

(more…)

Ищу. Система же умная, подсказывает:

Профессионалы фигнёй не занимаются, очевидно.

PS. Удивительно, как личная текущая ситуация влияет на восприятие окружающей действительности. Мир всегда сложнее и разнообразнее, чем нам кажется.

В пробке может прибежать мысль:
Ведь я по делу еду, а вы все куда? Почему вам дома/на работе не сидится?