Обновить
-13
1.4

Пользователь

Отправить сообщение
Всё что угодно можно вписать в квадрат. Но если мы будем вписывать в квадрат одного и того же размера и китайские иероглифы и кириллицу с латиницей, то либо иероглифы превратятся в нечитаемое месиво, либо между буквами будут зиять расщелины. Либо придётся попрощаться с одинаковой шириной символов.
Любое упоминание Нигерии? До свидания.

Автор ведь из США? Как бы на неё борцы за права негров не ополчились.

«Хромает»?
Чего стоит одно только переселение автора из США в Великобританию:

Even though I’m from the US, I prefer to pronounce it ZedFS instead of ZeeFS because it sounds cooler.
Хотя я из Великобритании, я предпочитаю произносить ZedFS вместо ZeeFS, потому что это звучит круче.

Не всё так однозначно.


Переносы строк (Word Wrap) могут растянуть одну физическую строку на несколько экранных.


Code Folding, напротив, может схлопнуть несколько физических в одну. Да так, что в начале экранной строки будет первая физическая, в середине — сотая, а в конце и вовсе № 1024. И word wrap вишенкой на торте.


Всё это при тотальной моноширинности.


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


Ещё в редакторе IDEA есть parameter hints, которые могут менять ширину из-за изменений в другом файле (имя параметра в прилетевшем из Git-а файле изменилось, к примеру).


«Просто вычислить» не так уж и просто получается.

Очередной эффективный менеджер придумал, как урезать расходы на зарплату. Опять же, с большего количества студентов деньги собрать можно будет. Ничего нового.
Вероятно, вы давно не меняли ноутбук, а возможно, что и работу.
Sony продала подразделение в 2014 году, да и скругления краёв у современных моделей не такие.
5: mov eax, [eax+0x28]

Пятая строка содержит сдвиг регистра eax на 40 байт

Сдвиг регистра на IA32/AMD64 осуществляется инструкциями shl, shr и им подобными, аналог в языках с си-подобным синтаксисом — <<, >>.
В процитированной пятой строке — загрузка значения из памяти по адресу eax + 0x28

Жизненный опыт подсказывает, что доверять советам персонажей, использующих эпитеты навроде «совковая агитка» и им подобные, не стоит. Ими движет всё что угодно, кроме здравого смысла.
просто потому, что Серп стоит 5к, а до ЗП еще пара недель.

КМК, в такой ситуации не «Серп» нужно покупать, а газету «Работа».

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

Не расстраивайтесь, гугл обещает в ближайшее время превратить интерфейс гмыла в кусок «современного красивого» УГ. Вот это действительно печалит.

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

Вы так говорите, словно это проблема. В современных IDE есть генераторы геттеров/сеттеров и даже в простом текстовом редакторе с этой задачей на ура справится банальный поиск с заменой. Два у нас поля или двадцать особой роли не играет.

Эти несколько килобайтов скучного текста были призваны мотивировать читателя бежать за билетом на трамвай? Мне кажется, получилось не очень.
Звучит не так уж и фантастично.
Начнут требовать доступ к камере и анализировать куда направлен взгляд жертвы рекламы.
Камера сейчас есть почти в каждой кофеварке.

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


nameOf() in Java
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.ClassFileLocator;
import net.bytebuddy.jar.asm.ClassReader;
import net.bytebuddy.jar.asm.ClassVisitor;
import net.bytebuddy.jar.asm.MethodVisitor;
import net.bytebuddy.jar.asm.Opcodes;

import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;

public class Util {

    private static final String FUNCTION_APPLY_METHOD_NAME = "apply";
    private static final String FUNCTION_APPLY_METHOD_SIGNATURE = "(Ljava/lang/Object;)Ljava/lang/Object;";

    private static final Instrumentation INSTRUMENTATION = ByteBuddyAgent.install();

    public static byte[] getClassBytes(Class<?> clazz) {

        try {
            ClassFileLocator classFileLocator = ClassFileLocator.AgentBased.of(INSTRUMENTATION, clazz);
            TypeDescription.ForLoadedType typeDefinitions = new TypeDescription.ForLoadedType(clazz);
            ClassFileLocator.Resolution resolution = classFileLocator.locate(typeDefinitions.getName());
            return resolution.resolve();
        } catch (IOException e) {
            return null;
        }

    }

    public static <T, P> String nameOf(@SuppressWarnings("unused") Class<T> type, Function<? super T, P> property) {

        byte[] bytes = getClassBytes(property.getClass());

        if (bytes != null) {

            final AtomicReference<String> calledMethodName = new AtomicReference<>(null);

            ClassReader classReader = new ClassReader(bytes);
            classReader.accept(new ClassVisitor(Opcodes.ASM5) {
                @Override
                public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {

                    if (name.equals(FUNCTION_APPLY_METHOD_NAME) && descriptor.equals(FUNCTION_APPLY_METHOD_SIGNATURE)) {
                        return new MethodVisitor(Opcodes.ASM5) {
                            @Override
                            public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
                                calledMethodName.set(name);
                                super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
                            }
                        };
                    }

                    return super.visitMethod(access, name, descriptor, signature, exceptions);

                }
            }, 0);

            return calledMethodName.get();
        }

        return null;
    }
}

public class Test {

    public static void main(String... args) {
        System.out.println("String::toString()  : " + Util.nameOf(String.class, String::toString));  // toString
        System.out.println("new String(String)  : " + Util.nameOf(String.class, String::new));       // <init>
        System.out.println("(Object) -> { ... } : " + Util.nameOf(String.class, (Object object) -> { // Something like `lambda$main$0`
            System.out.println("Hello, lambda!");
            return object;
        }));
    }

}

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

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

«Advert» это же реклама?
А раз так, то оно будет использовать стандартное API одного из распространённых сервисов. По его использованию и найдут. Поиск использования классов в Android Studio работает на отлично. Не знаю, правда, зачем кому-либо нужно искать рекламное activity. Тем более настоящему инженеру.

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

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

Вы что, это же харясмент!

Информация

В рейтинге
1 419-й
Зарегистрирован
Активность