LINUX.ORG.RU
ФорумTalks

Best-ЯП-вброс, или «а ваш ЯП так может?»

 


0

3

Много букав не будет.

https://ibb.co/G3nzR7W7

Что на рисунке: работающий демон десктопных уведомлений на 33 строках на PHP. 8 из которых нужны, чтобы notify-send не придирался.

Ну, можно добавить красивый графический вывод. Тогда код разжиреет еще на 20 строчек.

Это вам не ГОшечка.

★★★★★
Ответ на: комментарий от usi_svobodi

какой то сложный print('hello world')

Это не просто hello world, это штука которая выводит уведомления, которые шлют другие программы. Аналог notification-daemon, dunst, xfce4-notifyd и прочего многострочного дерьма.

windows10 ★★★★★
() автор топика

Хотите сказать, что использование подобной библиотеки DBus на любом другом языке будет выглядеть сильно жирнее?

unDEFER ★★★★★
()

Оберни всё это ещё в одну функцию и просто делай while (s = getmsg()) print(s);. ОЛОЛО ПЫЩ ПЫЩ ОДНЕ ЛИНЕ КОДЕ!!АДИНАДИН

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от unDEFER

Да. Потому что дело не библиотеке d-bus. Львиную долю кода занимает борьба с неудобствами ЯП - строками, массивами, преобразованием с одного в другое, статической типизацией. Сам d-bus использует несколько типов данных, и сложность не в том чтобы преобразовать один тип в другой, а в том что в своих собственных функциях вы не можете запросить «что-нибудь», вы можете либо function get(int what) либо function get(char *what) - а что делать если вы не знаете какой тип?

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

function get(char *what) {
if (what=="abc") {int var = 1;}
if (what=="def") {char *var = "1";}
printf(var);
}

var is undefined. Казалось что может быть проще установки разного типа переменных в зависимости от условия? Авотхрен.

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Казалось что может быть проще установки разного типа переменных в зависимости от условия?

Variant же!

unDEFER ★★★★★
()
Ответ на: комментарий от kaldeon

Оберни всё это ещё в одну функцию и просто делай while (s = getmsg()) print(s);. ОЛОЛО ПЫЩ ПЫЩ ОДНЕ ЛИНЕ КОДЕ!!АДИНАДИН

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

И да, кто ж доктор что в нормальных ЯП простые задачи например конкатенации строк, обернуты в один оператор, а в ублюдочных языках чтобы объединить 10 строк в одну - нужно написать 11 стркатов в строгой последовательности?

windows10 ★★★★★
() автор топика

PHP

Это вам не ГОшечка

Всё же сравнивать адекватнее будет с другими интерпретируемыми языками. Писать лень, но что-то мне подсказывает, что на Python или Ruby будет примерно столько же строк. Ну импорт в начале, да.

CrX ★★★★★
()
Ответ на: комментарий от unDEFER

Variant же!

То есть распухание кода. Об этом и говорю. Ну хорошо, я вам пример на пыхе, вы мне пример на другом ЯП.

<?php
function get($what) {
 if ($what=="test") {
  echo "String: $what\n";
 }
 if ($what==123) {
  $what=$what+1;
  echo "Int: $what\n";
 }
}

Если в функцию передана строка - работаем как со строкой. Если число - работаем как с числом.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

D:

void get(Variant what)
{
    if (a.convertsTo!(string)) {
        writefln("String: %s", what.get!(string));
    }
    else if (a.convertsTo!(int)) {
        writefln("Int: %s", what.get!(int));
    }
}
unDEFER ★★★★★
()
Ответ на: комментарий от windows10

500 строк для обработки текстово-числовых данных.

Пруфы будут? Давай на гошке, раз уж она была упомянута.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от windows10

Если в функцию передана строка - работаем как со строкой.

а есть туда сунуть bool?

FishHook
()
Ответ на: комментарий от windows10

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

Например, на каком-нибудь Питоне писать можно быстро, а дебажить и эксплуатировать - нет.

vsnb
()
Последнее исправление: vsnb (всего исправлений: 1)
Ответ на: комментарий от windows10

То есть распухание кода. Об этом и говорю. Ну хорошо, я вам пример на пыхе, вы мне пример на другом ЯП.

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

fun get(what: Int){
    println("Int: $what")
}

fun get(what: String){
    println("String: $what")
}
FishHook
()
Ответ на: комментарий от windows10
func get(val any) {
	switch v := val.(type) {
	case string:
		if v == "test" {
			println("string")
		}
	case int:
		if v == 123 {
			v++
			println("int: ", v)
		}
	}
}

Что дальше?

kaldeon
()

Молодец, конечно, но в общем и целом - пофиг.

seiken ★★★★★
()
Ответ на: комментарий от vsnb

Например, на каком-нибудь Питоне писать можно быстро, а дебажить и эксплуатировать - нет.

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от usi_svobodi

это штука которая выводит уведомления, которые шлют другие программы

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

Короче, тот код что ты скинул - подразумевает что демон уведомлений у тебя уже установлен и работает.

Кроме того, код ужасен, потому что mainloop.run из GLib подразумевает передачу управления GIO, и скрипт в этом месте у тебя стопорится и не делает ничего кроме.

PHP-шный код в листинге у меня на скриншоте - и есть этот демон.

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от windows10

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

Gary ★★★★★
()
Ответ на: комментарий от Gary

Ну вот бро выше скинул ссылку на питоновый скрипт.

25 строк - только для мониторинга одного метода объекта d-bus, еще и с передачей этого мониторинга на откуп GIO. Подозреваю полный вариант будет в несколько раз больше.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

подозреваю, что можно также наговнокодить до 10 строк. и также пинать в цикле.

usi_svobodi
()
Ответ на: комментарий от windows10

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

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

что демон уведомлений у тебя уже установлен и работает.

это какой?

usi_svobodi
()
Ответ на: комментарий от windows10

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

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

Алсо заниматься код-гольфом с библиотеками та ещё ахинея.

Gary ★★★★★
()
Ответ на: комментарий от windows10

Переписал на нормальную вариацию, не благодари)))

<?php

function get(string|float|int $what): void
{
    if (is_numeric($what)) {
        $what++;
        echo "Number: $what", PHP_EOL;
    } elseif (is_string($what)) {
        echo "String: $what", PHP_EOL;
    }
}
Noob_Linux ★★★★
()

Та простыня сверху — это никак не одна строчка. Иначе можно на любом языке кроме питона убрать все переводы строк и код будет всё ещё валидный, но как бы однострочный.

Xenius ★★★★★
()

Чо т ерунда какая-то.

В питоне, перле или руби код будет чем то отличаться при наличии биндинга к dbus?

wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от Xenius

кроме питона

exec и будет тебе такая же фигня в питоне

frob ★★★★★
()
Ответ на: комментарий от usi_svobodi

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

Это значит, что тот пито-скрипт что ты сюда приложил, нужно увеличить в несколько раз.

это какой?

Откуда я знаю? Наверное твой DE-шный.

Прежде чем мониторить org.freedesktop.Notifications - их нужно создать. Создает их как правило notify daemon.

Если ты просто запустишь этот скрипт без запущенного ранее демона, будет такое: https://ibb.co/DH5NQb4V

А вот если перед этим запустить тот скрипт что нарисовал я - тогда да, и питоновский работает: https://ibb.co/1fh9fZWx

windows10 ★★★★★
() автор топика
Ответ на: комментарий от wandrien

В питоне, перле или руби код будет чем то отличаться при наличии биндинга к dbus?

Будет.

windows10 ★★★★★
() автор топика

PHP

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

Nervous ★★★★★
()
Ответ на: комментарий от windows10

Скинь, может перейду на питон =)

Нет уж. Никогда не переходи на Python. Оставайся на PHP.

EXL ★★★★★
()
Ответ на: комментарий от Nervous

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

Я не выкладывал код.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от superuser

на скринах

Шрифт как шрифт. В левом терминале уменьшенный, чтобы влез весь выхлоп.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от usi_svobodi

ну копай в сторону dbus.service.BusName. вся эта системная помойка слишком сложная.

Ага. И вот именно после того как я копнул - понял что Пых лучше всего подходит для такого дрочева.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Казалось что может быть проще установки разного типа переменных в зависимости от условия?

Помнится, кто-то сказал: “It is practically impossible to teach good programming to students that have had a prior exposure to PHP: as potential programmers they are mentally mutilated beyond hope of regeneration.”

rupert ★★★★★
()
Ответ на: комментарий от rupert

It is practically impossible to teach good programming to students that have had a prior exposure to

Там было про BASIC, но что такое похапе, как не бейсик для веба? %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от windows10

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

usi_svobodi
()

Ну, считай строки. Всяки фильтрации и экшоны допилишь сам, а я уже в пижаме.

package main

import (
	"fmt"
	"log"

	"github.com/godbus/dbus/v5"
)

func main() {
	conn, err := dbus.ConnectSessionBus()
	if err != nil {
		log.Fatalf("Failed to connect to session bus: %v", err)
	}
	defer conn.Close()
	notificationPath := dbus.ObjectPath("/org/freedesktop/Notifications")

	signal := make(chan *dbus.Signal, 10)
	conn.Signal(signal)

	if err = conn.AddMatchSignal(dbus.WithMatchObjectPath(notificationPath)); err != nil {
		log.Fatalf("Failed to add match signal: %v", err)
	}

	fmt.Println("Listening for desktop notifications...")

	for sig := range signal {
		fmt.Printf("Received signal: %+v\n", sig)
	}
}

bdrbt
()

Пых-пых всё ещё живой? Я думал с изобретением реакта это всё отправилось на помойку.

ox55ff ★★★★★
()

на PHP

Фрактал плохого дизайна? Не, не слышали.

eternal_sorrow ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)