All streams
Search
Write a publication
Pull to refresh
193
0.8

Программист

Send message
Если возможность настроить периферию и установить ПО чистым мышкотыканьем — да, тут винде нет равных.

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

Я бы сказал, что это предустановленная винда стоит "второй системой", за последние полтора года ни разу её не запускал. Сёрфить интернет без разницы на чём, программировать удобнее в линуксе, в игры я практически не играю. Играл в факторио — на линуксе она есть.
От винды одни неудобства с постоянными обновлениями и невозможностью настройки. Чуть захочешь чего-нибудь нестандартного, начинается "фича есть, только я вам её не отдам, у вас pro-лицензии нет". Линукс же просто работает. Ноутбук не перезагружаю месяцами, обновления ставятся практически мгновенно.

Скайп там есть. Такой же убогий как под osx, но это "заслуга" скайпа, а не операционной системы.

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

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


Впрочем, они те ещё 3.14***ы, сами перевели меня с тарифа за 100р/мес на 150р/мес. Более нове тарифы ещё хуже. А ещё их цены в 99р/мес и 149 р/мес подразумевают месяц в 30дней и потому по факту это почти 100.5р за средний месяц: 99 / 30 365 = 1204.5 > 100 12.

final в Java используют только тогда когда это просит компилятор.
С каждой новой версией компилятора таких просьб всё меньше и меньше.

final позволяет писать многопоточный код. Он пишется не только для программиста, а для того чтобы Java Memory Model гарантировала безопасность несинхронизованного многопоточного доступа.


Теперь про оптимизации:
Если я объявлю переменную c final, то копилятор имеет полное право инлайнить её где ему угодно. Если же слова final нет, то в один прекрасный момент с помощью рефлексии, простого присовоения значения или загрузки класса, который захочет поменять поле, оно может поменяться. (Если я рефлексией поменяю final поле, то я сам себе злобный буратино). Это касается практически всех языков, в которых есть виртуальные машины.


Поскольку существует проблема останова, мы не всегда можем сказать, что какой-то код будет исполнен или нет. Нет никаких гарантий, что компилятор в каждом случае сам догадается, что переменная неизменяемая. Нет никаких гарантий, что программист не ошибётся и случайно не напишет где-нибудь в дебрях кода pi = pi / 2. В java новые классы могут подгружаться прямо во время исполнения программы, а так же есть рефлексия, так что доказательство "неизменяемости" становится ещё сложнее, и его надо будет постоянно поддерживать в актуальном состоянии, и потом в один прекрасный момент переменная может стать изменяемой.


Кроме того, jit — очень сложная штука, вот пример: https://habr.com/post/305894/.
Когда я добавляю константность для полей объектов, я даю больше возможностей jit-компилятору для проведения оптимизаций.

Я новую категорию открывал. Может быть, с просто заменой прав иначе.


Вот здесь пишут, что вроде бы можно без госуслуг обойтись: https://autoprav.com/vu/kak-poluchit-prava-posle-sdachi-ekzamenov.html
И оно вполне похоже на правду (как и то, что талоны могут заканчиваться и надо будет рано утром приезжать или брать талон на другой день).


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

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


Я так загранпаспорт оформлял целых полгода. Никуда не торопился, но вообще-то его должны сделать за месяц.
Итак, декабрь 2017 — я попытался запросить загранпаспорт через госуслуги ради экономии 30% от суммы. После того как я всё-всё ввел, при отправлении мне выдаёт что-то типа "неизвестная ошибка, попробуйте завтра" (насколько я понял — не с моей стороны). "Завтра" не наступает. Я пишу в техподдержку. Проходит декабрь, январь. Я удаляю старую форму, отправляю запрос заново. Хотя это раньше не помогало, теперь сработало. Спустя энное время мне приходит письмо типа "приём только по предварительной записи там-то и возьмите необходимые документы". Я все госуслуги облазил — где происходит эта электронная запись, не нашёл. На сайте того-то места (тот ещё квест) нерабочая форма — нельзя выбрать ни одной даты. На телефон они в принципе не отвечают, пытался звонить в разные дни и разное время суток. Написал в техподдержку госуслуг с вопросом, где же записаться в ту самую очередь. Прошёл ещё месяц. В итоге на форуме своего города (я даже не знал про существование форума) нагуглил, что для записи надо прийти лично в определённое время в в некоторые дни. Божественно!
Пришёл, меня записали во внутренний журнальчик на через пару месяцев. Через пару месяцев я принёс всякие документы, и после этого они операвивно недельки через три я получил загран.
Формально — они сделали загран за 3 недели. Реально они его делали почти три месяца и ещё месяца три я потратил на "взаимодействие" с госуслугами.


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


В моём ближайшем МФЦ на стойке для выдаче талончиков прям на экране приклеена бумажка типа "не работает", потом говоришь специально обученной женщине, она отклеивает бумажку от экрана, выбирает там что надо и приклеивает бумажку обратно. (Я об этом поначалу не знал, и за 15 минут до окончания работы мфц мне просто не дали талончик, а взять его из "неработающей" стойки я не догадался) В ещё одном МФЦ видел хак — есть специальные маленькие штучки с тремя смайликами, на которых после обслуживания клиент может поставить свою оценку. В моём городе они стоят как надо, а вот там — тупо развёрнуты от посетителей, и работники сами себе ставят максимальные оценки. И всё, "все довольны", блин.

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


Как я их получал лет 7 назад: пришёл в гаи, постоял 5 минут в очереди, получил права. Всё.

Можно сделать "приватное поле" и "методы с произвольными модификаторами доступа", потому что в некоторых языках публичные поля практически не используются. "Приватность" поля даёт компилятору простор по порядку расположения полей, а так же можно будет безболезненно переместить поле из объекта, например, во вложенный объект и поменять геттеры/сеттеры на возвращение значения оттуда.

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

Потому что процедура — не возвращает значения. Если у неё ещё и побочных действий не будет — она станет совсем не нужна.

Хм, а если на это взглянуть иначе? Допустим, функции должны быть чистыми — поэтому они обязаны что-то возвращать.


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


И ещё — получается, из функций нельзя вызывать процедуры?

  1. да, левый — подтип правого.
  2. нет. (если поменять местами T₁ и T₂, то да)
  3. Хм. Тут подвох? Я вижу два варианта ответа, но не могу сказать, какой из них лучше:
    можно сказать, что выбор типа X не влияет на U, и потому левый будет подтипом. С другой стороны, если предположить, что T₁ это bottom type, а T₂ и U₁ — нет, то левый не сможет быть подтипом правого.

В С при увеличении указателя на void людя хотят именно перемещаться по байтам в памяти. Если размер void вместо 1 станет 0, то тогда сломается совместимость.

Вы хотите потребовать, чтобы для свойства a указывали явно тип принимающей переменной? int q = A.a? Разработчики будут против, это неудобно.

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


А зачем?

Потому что он есть. Кому это мешает?


прекрасный пример с SO:

Это уже больше похоже на некорректную ситуацию. Ну так запрещать надо именно такое, а не все совпадения имён!


Вдобавок, даже из этой ситуации можно было вывернуться, если бы проперти было доступно как метод get_Q(), а в неоднозначности из примера отдавался бы приоритет методу Q.


В языках типа Groovy/Scala проперти играют роль синтаксического сахара, который использовать не обязательно — можно напрямую звать геттеры и сеттеры. С моей точки зрения происходящее в С# выглядит лишним усложнением.

Потому что невозможно будет определить, что такое var q = A.a.

Не вижу проблемы. Если у класса несколько методов, то тоже невозможно определить, к чему относится A.a При этом всё нормально работает:


class A {
    public void a(double c){}
    public int a(){return 1;}
}

public static void Main()
{
    Func<int> a = new A().a;
    Action<double> a2 = new A().a;
    var a3 = new A().a();
}

Проблема в том, что усложнился весь язык.


  1. Проперти считается отдельной сущностью, хотя реализована через методы
  2. Геттер будет реализован как метод get_a, но при этом я не могу в классе определить ни одного метода с именем a.
  3. метод get_a() объявить тоже не получится. (Единственный логичный пункт)
  4. Метод геттера get_a() нельзя вызвать как метод. Но можно через рефлексию.

Л-логика! В C# создали проблемы на пустом месте.


Вот пример на скале:


class A() {
    val x = 1
    def x(s: String): Unit = println(s)
    def x(arg: Int): Unit = x(arg.toString)
}

val a = new A()
a.x(a.x)
val method: String => Unit = a.x(_)

Eдинственное, что запрещает язык — сделать метод с именем 'x', который ничего не принимает, поскольку геттер является этим самым методом.

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

Вот пример.


class A {
    public void a(double c){}
    public void a(int x, int y){}
    //public int a{get; set;}
}

Почему я могу сделать несколько методов с одинаковым именем и разный сигнатурой, и это нормально, а если я для проперти попробую использовать то же самое имя, то нельзя? И это не смотря на то, что "под капотом" геттер и сеттер это всё равно методы. Это ограничение мне кажется совершенно искусственным, как и отдельный синтаксис для определения геттеров и сеттеров.

Ну я больше описал "как я бы хотел", а не "как оно получится после столкновения с реальностью". Первичной целью является получение опыта и знаний. В идеале я бы хотел потеснить lua — сделать маленький гибкий язык, чтобы его можно было встраивать куда угодно. Ещё я хотел попробовать Graal VM, но у меня никак не дойдут руки(


В скале 2 нет типов-сумм, есть только очень ограниченная поддержка в виде case классов. Есть мелочи типа не устаканившихся макросов и некоторых костылей для обхода ограничений jvm. Есть некоторые моменты, которые, как мне кажется, сделаны слишком сложно. Всякие интересные возможности добавляют в dotty, но я не знаю, как их поддержка повлияет на производительность кода. Не хватает возможности в качестве шаблонного параметра передать число (в scala native это нужно для описания типа массива фиксированной длины). В scala native после компиляции получаются подозрительно большие бинарники. Код (jar файлы) получаются тоже довольно большими, на порядок больше того что в java (именно мой код, без учёта стандартной библиотеки). Вдобавок, чувствуется, что скала создавалась под jvm, это выражается в некоторых ограничениях. Например, для интерфейса c методом print(t: T) и не могу сделать, чтобы один класс реализовал интерфейс одновременно и для T=int и для T=String

Забавно наблюдать, как опыт автора от использования предыдущих языков влияет на синтаксис и фичи придумываемого им языка.
P.S. Я пробовал создать свой язык, он у меня совсем другим получался. (По крайней мере, идея, до практики я не довёл). И синтаксис, и фичи, и базовые термины, в которых я мыслил — всё иное.

Принципиально — не отличается; но поскольку государств относительно мало, их репутацию выяснить намного проще, чем репутацию частных лиц.

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


Аналогично и сейчас, я могу даже в незнакомом городе зайти в кафешку типа мака и там будет стандартный набор еды и цен на неё.


Если я беру в магазине молоко, а оно оказывается прокисшим, то государство мне никак не помогает. Работает репутация, когда я перестаю ходить в магазин А, т.к. там продавцы обсчитывают и в магазин Б, т.к. там попадается просроченный товар. С редкими покупками типа автомобиля снова работает репутация, основанная на опыте знакомых и т.п. Опять же, хороший автопроизводитель даёт гарантию и бесплатно ремонтирует авто, не потому что государство так сказало (бывают случаи, когда какой-нибудь производитель юлит и не признаёт гарантийным случай, наличие нашего государства не особо помогает), а потому что ему дорога его репутация.

Information

Rating
1,793-rd
Location
Белград, Сербия
Registered
Activity

Specialization

Software Developer, ML Engineer
Kotlin
Scala
Java
Python
Neural networks
Algorithms and data structures
Android development
OpenGL