ViewModel в Java

Примечание: сразу уточню, что ViewModel — это не замена onSaveInstanceState(Bundle)

Ниже код ViewModel

package ag.krasnov.exampleviewmodel;

import android.util.Log;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

    private int mCount;


    public int getCount() {
        return mCount;
    }

    public void increment() {
        mCount++;
    }
}
Читать далее «ViewModel в Java»

Xcode: создание пакета

Создаем пакет стандартными способами xcode

Далее можно сохранить его в любой git и применять метки (tag):

git tag -a 1.0.0 -m "version 1.0.0"
git tag
1.0.0
git push origin --tags

Особенности работы iisnode

В логах windows можно увидеть следующую ошибку:

Faulting application name: w3wp.exe, version: 10.0.14393.0, time stamp: 0x57899b8a
Faulting module name: ntdll.dll, version: 10.0.14393.2969, time stamp: 0x5ccd148a
Exception code: 0xc0000005
Fault offset: 0x0000000000065553
Faulting process id: 0x2694
Faulting application start time: 0x01d88ba20ec97214
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: f0c1f728-42d5-446e-b599-6bc97223eb12
Faulting package full name: 
Faulting package-relative application ID: 

Проблема заключалась в том, что в один момент времени процесс node.exe потребляет оперативной памяти больше 2Gb.

Читать далее «Особенности работы iisnode»

Перенаправление логов в systemd

Создаем сервис:

[Unit]
Description=RPC сервис
After=network-online.target

[Service]
User=www-data
Restart=on-failure
# тут указываем путь к серверному приложению
WorkingDirectory=/var/www/rpc-release
ExecStart=/usr/bin/node /var/www/rpc-release/bin/www conf=./release.conf
StandardOutput=file:/var/log/rpc/rpc-dev.log
StandardError=file:/var/log/rpc/rpc-dev-error.log

[Install]
WantedBy=multi-user.target
Читать далее «Перенаправление логов в systemd»

Locust: нагрузочное тестирование

Подробнее на официальном сайте: https://docs.locust.io/en/latest/quickstart.html

Создание простого теста:

from locust import HttpUser, task, between

class Exists(HttpUser):
    wait_time = between(1, 5)

    @task(1)
    def auth(self):
        self.client.get("/exists")

Для проверки можно выполнить:

import requests as r
base_url = 'http://localhost:5007/release'
r.get(base_url + '/exists')

# <Response [200]>
Читать далее «Locust: нагрузочное тестирование»

Ошибки в taiga

ACCESS_REFUSED - Login was refused using authentication mechanism AMQPLAIN. For details see the broker logfile

Ошибка была в том, что был удален пользователь taiga. Чтобы исправить авторизоваться под taiga и выполнить:

sudo rabbitmqctl add_user taiga taiga
sudo rabbitmqctl add_vhost taiga
sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"

Установить Jupiter notebook на Ubuntu 20.04

Создаем нового пользователя

sudo adduser jupiter
sudo usermod -a -G www-data jupiter

Далее авторизуемся под новым пользователем:

sudo apt install python3-pip python3-dev
sudo pip3 install virtualenv

mkdir ~/my_project_dir
cd ~/my_project_dir
virtualenv my_project_env

source my_project_env/bin/activate
Читать далее «Установить Jupiter notebook на Ubuntu 20.04»

Основы Python

Список — это структура данных. Чтобы создать список, его элементы перечисляют через запятую в квадратных скобках и присваивают переменной. Например, вот список из пяти первых значений столбца installs из таблицы с данными «Книжного грызуна»:

installs = [29486, 33968, 30830, 34361, 33968]

Да! Индексы могут быть отрицательными — это называется обратная индексация. Такая программа покажет на экране значение 36.8, то есть последний элемент списка.

temperature = [36.6, 37.2, 36.5, 36.8]
print(temperature[-1]) 

Обратная индексация

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

russian_cities = ['Москва', 'Санкт-Петербург', 'Томск', 'Екатеринбург', 'Владивосток', 'Смоленск', 'Барнаул', 'Сочи', 'Красноярск']

print(russian_cities[6])
print(russian_cities[-3])

Что такое срезы

Срезы — почти как индексы. Только они позволяют получить не один, а сразу несколько идущих подряд элементов списка. Чтобы сделать срез, в квадратных скобках через знак : указывают начало и конец желаемого диапазона. Например, data[1:5]some_list[7:9].

Срезы начала и конца списка

Срезы конца списка работают аналогично. Последний элемент среза совпадает с окончанием списка, поэтому достаточно указать индекс первого элемента. Удобнее делать это через отрицательный индекс. Так можно получить последние три элемента prime_numbers:

prime_numbers = [2, 3, 5, 7, 11, 13, 17]
print(prime_numbers[-3:]) 
Скопировать код[11, 13, 17]