Менталитет раскладки

Вот вам стандартная US раскладка

US

Она представлена и на нашей клавиатуре. Более того, цифры находятся на тех же клавишах

RU

Немцы никогда не переключают раскладок клавиатуры,
но цифры у них там же, где на американской

DE

Достаточно экстравагантной считается раскладка Dvorak, но и здесь цифры на тех же местах

dvorak

Французская раскладка.

В нижнем регистре (без клавиши Shift), на раскладке нет ни одной цифры

FR

Цифры можно вводить только с нажатой клавишей Shift…

FR-shift

или Control…

FR-ctrl

Правда, цифра 6 тогда заменена долларом

Французы люди суеверные, им не свойственен меркантилизм,
но, как и все, они любят доллары

Smart Сast Syntactic Sugar that I Would Like to Have in Kotlin

I tried to write a function that could be used with a set of classes that have the same method but not descendants of the same ancestor. For instance, JMenu and JTextField have addActionListener method. With the next approach it is possible to implement semi-dynamic type checking.
test.kt
class X { 
    fun foo() {} 
} 
 
class Z { 
    fun foo() {} 
} 
 
fun doSomehting (a:Any) { 
    when (a) { 
        is X -> a.foo() 
        is Z -> a.foo() 
    } 
}
this solution seems redundant. Because of autocompletion or accidentally, one can misprint the foo function. Additionally, for a large list, a lot of duplicates should be written for the each case. I would like to have something like this
 
    when (a) { 
        is X,Z -> a.foo() 
    }
For such a case Kotlin could generate the same byte code as for the case above.

Functional Boolean Expressions in Kotlin

If we have optionals why we cannot handle booleans using the similar approach?

test.kt
fun Boolean.ifTrue(then: () -> Unit): Boolean { 
    if (this) { 
        then.invoke() 
    } 
    return this; 
} 
 
fun Boolean.ifFalse(then: () -> Unit): Boolean { 
    if (!this) { 
        then.invoke() 
    } 
    return this; 
} 
 
fun main(args: Array<String>) { 
    (true).ifTrue { 
        // true 
    }.ifFalse { 
        // false 
    } 
}
or with infix

test.kt
infix fun Boolean.ifTrue(then: () -> Unit): Boolean { 
    if (this) { 
        then.invoke() 
    } 
    return this; 
} 
 
infix fun Boolean.ifFalse(then: () -> Unit): Boolean { 
    if (!this) { 
        then.invoke() 
    } 
    return this; 
} 
 
fun main(args: Array<String>) { 
    (true) ifTrue { 
        // true 
    } ifFalse { 
        // false 
    } 
}

How to collect indices conditionally in jdk8

Sometimes, I use API that requires indices as parameters. It was the only case when I used for loop with indices instead of Stream API. Here is a way to get indices only with Stream API
    // just initialisation
    List<String> listOfStrings = Stream.of("Dan", "Han", "Gun", "Sun", "Dnepropetrovsk").collect(Collectors.toList());

    // getting indices
    int[] indices = IntStream.range(0, listOfStrings.size()).filter(i -> listOfStrings.get(i).startsWith("D")).toArray();
Of course, for LinkedList this should work slowly than for loop.

An elegant way to make your JDK8 code irresponsive

This is a simple example where new API and modern implementation allow write irresponsive GUI.

Anyone who has been starting to learn JDK8 Stream API sees a lot of advertisements how elegant Stream API is.Anyone is informed about a parallel() method which wisely distribute you calculations among cores (if your functions are pure, of course). But a junior programmer may not realise how dangerous this API could be.

The code below shows how to hang you UI even without running anything dangerous on the EDT thread. Run the example, notice that a part of the window is constantly changing its colour, press the button.

Test to illustrate parallel streams and Swing UI issue

After a short delay you frame will become irresponsive. The problem is in the parallel() call. Comment it out and the UI becomes alive. Of course, you may need to specify greater heap for such a big List (for instance  with -Xmx4g argument).


public class HangJavaGUIFromNonEDTThread {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame test = new JFrame("Test");

            List<Integer> listOfIntegers = IntStream.generate(() -> ThreadLocalRandom.current().nextInt(10))
                                                    .limit(100000000)
                                                    .boxed()
                                                    .collect(Collectors.toList());

            test.setLayout(new GridBagLayout());
            JButton jButton = new JButton(new AbstractAction("Calculate") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    new Thread() {
                        @Override
                        public void run() {
                            System.err.println(listOfIntegers.parallelStream().filter(i -> i < 5).count());                             SwingUtilities.invokeLater(() -> setEnabled(true));
                        }
                    }.start();
                    setEnabled(false);
                }
            });
            test.add(jButton);

            Dimension panelSize = new Dimension(200,200);

            Color [] colors = {
                    Color.green,
                    Color.red,
                    Color.yellow,
                    Color.blue
            };

            Random random = new Random();

            JPanel jPanel = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.setColor(colors[random.nextInt(colors.length)]);
                    g.fillRect(0, 0, panelSize.width, panelSize.height);
                }
            };

            jPanel.setPreferredSize(panelSize);

            Timer timer = new Timer(100, e -> jPanel.repaint());

            timer.start();

            test.add(jPanel);

            test.pack();
            test.setVisible(true);

        });
    }
}

Andrew Krasny noted, that “this effect is not related to the threads used. This is a GC problem – button hit triggers the Full GC and.. the whole word stops – can see this easily – java -XX:+PrintGCDetails -XX:+PrintGCDateStamps ….”

2016-08-05T21:42:44.514-0300: [GC (Allocation Failure) [PSYoungGen: 58273K-&gt;1488K(76288K)] 58273K-&gt;17520K(251392K), 0.0330779 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
2016-08-05T21:42:50.197-0300: [GC (Allocation Failure) [PSYoungGen: 67024K-&gt;2513K(141824K)] 1206960K-&gt;1142458K(1306624K), 0.8698558 secs] [Times: user=6.48 sys=0.05, real=0.87 secs] 
2016-08-05T21:42:51.067-0300: [Full GC (Ergonomics) [PSYoungGen: 2513K-&gt;0K(141824K)] [ParOldGen: 1139944K-&gt;413111K(598528K)] 1142458K-&gt;413111K(740352K), [Metaspace: 9953K-&gt;9953K(1058816K)], 16.2868371 secs] [Times: user=20.38 sys=0.21, real=16.29 secs] 

“See – on my PC this takes 20 seconds!

Try to add System.gc(); just before making the form visible – you’ll see the pause on startup, but the button will work fine later.

BTW, Zing has no this problem ;)”

Не могу создать директорию wp-content/uploads Проверьте, доступна ли родительская директория для записи

Случается так, что после установки Word Press, пользователи не могут загрузить изображения в папку uploads.

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

Чтобы это сделать, проще всего, перейти по адресу

<ваш сайт>/wp-admin/options.php

найти там строку “upload_path” и заменить соответствующее ей значение на абсолютный путь до папки на сервере.

Обычно, это решение работает, если вы перенесли свой Word Press с хостинга на хостинг.

Второе наиболее распространенное решение – поменять права доступа на папке wp-content/uploads с 755 (все права хозяину, чтение и запуск группе и всем остальным) на 777 (все права всем).

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

Но нельзя ни в коем случае решать эту проблему таким способом.

Намного лучше определить группу к которой приниадлежит ваш web server, дать права на запись этой группе.

Чтобы определить группу можно запустить следующую команду

ps aux | egrep ‘(apache|httpd)’

Предположим, она будет  ‘www-data’

Далее, нужно поменять права дериктории wp-content/uploads на 770 и установить в качестве группы ‘www-data’

Теперь ваш сервер может записывать в папку wp-content/uploads

NB: Если вы не планируете работать с файлами минуя Word Press, вы можете ограничиться правами 700, установив при этом пользователя web сервера хозяином директории wp-content/uploads и находящихся внутри файлов.

How to use Idea with German shortcuts on Windows

To use German key map you should meet the next requirements

General overview

 
  1. Enable ide.non.english.keyboard.layout.fix IDE registry property
  2. Switch to the German keyboard layout in OS language settings
  3. Download German keymap_settings.zip and extract settings.jar with a German keymap for Idea on Windows (archive)
  4. Enable German keyboard support in IDE Settings -> Keymap

Setup details

  1. To enable IDE registry key. Press CTRL-SHIFT-A shortcut. Type “Registry” into the action search text field. Find the key in the shown dialog. Select the key and close the dialog
    Registry
    Registry in Idea IDE
  2. Usually, German users do not need to switch keyboard layout
  3. Import German layout using IDE settings import wizard (File -> Import Settings…). For this use settings.jar file. The file is in an archive here archive. This file should not affect your settings. After the import you should have gotten another key map “Deutsche Tastaturbelegung für Windows
    German layout
    German layout in Idea
       
  4. If you have enabled the registry key successfully, your German layout should be detected automatically
    Baloon
    German layout is autodetected
    If you do not see such a balloon, you should be able to enable the support through Settings -> Keymap tab
    German layout support
    Checkbox for enabling German layout

3ds Max vs. Maya vs. Blender

Посмотрел вчера с большим удовольствием все шесть роликов. Человек конкретно, точно и ясно сравнивает 3ds Max, Maya и Blender.

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

Maya идеально подходит для создания нестандартных и новых решений. Поэтому используется в анимации.

Blender В отличии от предыдущих продуктов стоит не 220 000 рублей, а 0 рублей. Можно использовать для конечных коммерческих решений.  Имеет свои преимущества в том числе при предварительном рендеренге моделей и при анимации.

Автор говорит, что в Pixar работает около 70 программистов. Поэтому, немаловажно сказать, что плагины для Blender можно писать на Python

Running mpkg and pkg installers on Mac OS X if the packages are intended for previous OS versions

Today I tried to build OpenJDK 8u40 image on El Capitan (MacOS X 10.11). Actually, it was a rather challenging task even with Yosemite (Mac OS X 10.10). To begin with I disabled System Integrity Protection. But after that I faced with Command Line Tools for Xcode. You need CLT with gcc to build OpenJDK. There are versions for Mountain Lion (Mac OS X 10.9) and Yosemite (Mac OS X 10.10). When I run the installer (mpkg file) I got the next message “This package can only be installed on OS X 10.8″.

This package can only be installed on OS X 10.8
This package can only be installed on OS X 10.8


To solve the issue I executed the next commands:

1. Get to a temporary dir
> cd /tmp

2. Unpack pkg somewhere
> pkgutil --expand /Volumes/Command\ Line\ Developer\ Tools/Command\ Line\ Tools\ \(OS\ X\ 10.10\).pkg ./clt

3. This step is not so easy. I opened a file inside the expanded package
>vim clt/Distribution
Surprisingly, it was a plist (a special XML-base format for storing properties on Mac)

4. Inside the plist was a tag with Java Script code! Where happened different checks of os version and paths. I substituted 10.10 to 10.11 and 10.11 to 10.12

5. I have packed the package again.
> pkgutil --flatten clt clt.mpkg
After these steps the bundle was installed smoothly.

Programming Blog