blog.udartsev.ru


GIT show all branches creators

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate

Export all Grafana data sources to data_sources folder

Export all Grafana data sources to data_sources folder

mkdir -p data_sources && curl -s "http://localhost:3000/api/datasources"  -u admin:admin|jq -c -M '.[]'|split -l 1 - data_sources/

This exports each data source to a separate JSON file in the data_sources folder.

Load data sources back in from folder

This submits every file that exists in the data_sources folder to Grafana as a new data source definition.

for i in data_sources/*; do \
    curl -X "POST" "http://localhost:3000/api/datasources" \
    -H "Content-Type: application/json" \
     --user admin:admin \
     --data-binary @$i
done

Docker Image to OpenShift Cluster

export docker_registry_hub=172.30.1.1:5000
docker login -u $(oc whoami) -p $(oc whoami --show-token) $docker_registry_hub

Ubuntu - change Alt+Shift language layout

  1. Disable Alt+ buttons for keyboard layout (Logitech): sudo dpkg-reconfigure keyboard-configuration

  2. Disable Alt+Shift in Window keyboard settings: enter image description here

  3. Install tweak tool and change layout buttons: sudo apt-get install gnome-tweak-tool


Disable [Shift+Space] for change language in Ubuntu 20.04

 xmodmap -e 'keycode 65 = space space space space'

Hyperledger Fabric - Anchor peer

Hyperledger Fabric - Anchor peer

Anchor peer это пир, который используется для обнаружения всех узлов, принадлежащих организациям в канале. Anchor peer должен быть доступен для всех пиров в канале.

У каждой организации в канале должен быть anchor peer (или несколько для предотвращения единой точки отказа), что позволяет пирам обнаруживать все существующие пиры в канале. Если в вашей организации нет anchor peer, ваши пиры смогут видеть только пиры своей организации. Если у организации нет anchor peer в канале, а к каналу присоединяется новый пир, организация не получит информацию об этом новом пире.

Например, предположим, что у нас есть три организации - orgA, orgB, orgC - в канале и один anchor peer в организации - peer0.orgC - определенный для организации C. Когда peer1.orgA из организации A связывается с peer0.orgC, он расскажет peer0.orgC о peer0.orgA. И когда позже peer1.orgB свяжется с peer0.orgC, peer0.orgC сообщит peer1.orgB о peer0.orgA. С этого момента организации orgA и orgB начнут напрямую обмениваться информацией без какой-либо помощи со стороны peer0.orgC.

Да в сети может быть один anchor peer, но рекомендуется использовать отдельные anchor peer для каждой организации.

Внешние и внутренние конечные точки

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

Когда пир стартует, он использует peer.gossip.bootstrap в своем core.yaml для обмена информацией о членстве, делясь информацией обо всех доступных пирах в пределах своей собственной организации. Т.е использует peer.gossip.bootstrap для сплетен внутри своей организации.

Также можно использовать CORE_PEER_GOSSIP_ENDPOINT в docker-compose файле:

peer1:
  - CORE_PEER_GOSSIP_BOOTSTRAP=peer2:7051
peer2:
  - CORE_PEER_GOSSIP_BOOTSTRAP=peer1:7051

Для того, чтобы пиры в одной организации знали о существовании пиров в другой организации нужно использовать CORE_PEER_GOSSIP_EXTERNALENDPOINT:

peer1:
  - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1:7051
peer2:
  - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2:7051

GOLANG - go.sum (fix)

Delete conflict package sums:

sed '/^github.com\/hyperledger\/fabric v1.4.4/d' ./go.sum > temp.txt && mv temp.txt go.sum

DOCKER - Powerfull comands


[CONTAINERS] ПОИСК КОНТЕЙНЕРОВ:

docker ps -a $(docker ps -a -f "since=b2f3a7899d6d" -q) 
  • since= все контейнеры ПОСЛЕ
  • before= все контейнеры ДО
  • -q вернуть только ID контейнеров

[CONTAINERS] УДАЛИТЬ ВСЕ КОНТЕЙНЕРЫ:

docker rm -f $(docker ps -a -q)

[CONTAINERS] УДАЛИТЬ КОНТЕЙНЕР С ПРЕФИКСОМ В ИМЕНИ = cli:

docker rm -f $(docker ps -a -f "name=cli" -q)

[CONTAINERS] ЗАЙТИ В КОНТЕЙНЕР С ПРЕФИКСОМ В ИМЕНИ = cli:

docker exec -ti $(docker ps -a -f "name=cli" -q) bash
peer chaincode list --installed
peer channel list

[IMAGES] УДАЛИТЬ ВСЕ IMAGES:

docker image rm -f $(docker images -a -q)

[IMAGES]УДАЛИТЬ IMAGES (поиск):

docker image rm $(docker image ls -f "since=b2f3a7899d6d" -q) 

[VOLUMES] УДАЛИТЬ ВСЕ UNUSED VOLUMES:

docker volume prune

[VOLUMES]УДАЛИТЬ ВСЕ VOLUMES:

docker volume rm $(docker volume ls -q)

[GLOBAL] ОЧИСТА ОТ НЕИСПОЛЬЗУЕМЫХ КОНТЕЙНЕРОВ, IMAGES и VOLUMES:

docker system prune

[NETWORKS] СПИСОК ВСЕХ NETWORKS:

docker network ls

[CONTAINERS] ИНФОРМАЦИЯ О КОНТЕЙНЕРЕ:

docker inspect -f 25942aa05b32

[CONTAINERS] ПОЛУЧИТЬ IP КОНТЕЙНЕРА:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.Aliases}} | {{.IPAddress}}{{end}}' 25942aa05b32

[CONTAINERS] ПОИСК КОТЕЙНЕРА ПО IP

docker inspect -f '{{range.NetworkSettings.Networks}}{{.Aliases}} {{.IPAddress}}{{end}}' $(docker ps -q) | grep 172.20.0.20

[IMAGES] ФИЛЬТР IMAGES:

docker images --filter "<option>=<value>"
docker image ls --filter "<option>=<value>"

docker image ls --filter "reference=hyperledger/fabric-peer:crypto-pro"

“–filter” options:

  • reference : that can be used in order to isolate images having a certain name or tag;

  • before : to filter images created “before” a specific point in time;

  • since: to filter images since a specific point in time (usually another image creation);

  • label: if you used the LABEL instruction to create metadata for your image you can filter them later with this key;

  • dangling: in order to isolate images that are not used anymore.


DJANGO - ORM lookup classees

**Django 3.***

Доступные подклассы для выборки запросов типа:
"user_name__icontains"
"user_name__iregex"
"user_name__startswith"
django.db.models.query_utils :
  'contained_by':     <class 'django.contrib.postgres.fields.ranges.RangeContainedBy'>,
  'gte':              <class 'django.db.models.lookups.IntegerGreaterThanOrEqual'>,
  'lt':               <class 'django.db.models.lookups.IntegerLessThan'>,
  'contains':         <class 'django.db.models.lookups.Contains'>,
  'endswith':         <class 'django.db.models.lookups.EndsWith'>,
  'exact':            <class 'django.db.models.lookups.Exact'>,
  'gt':               <class 'django.db.models.lookups.GreaterThan'>,
  'gte':              <class 'django.db.models.lookups.GreaterThanOrEqual'>,
  'icontains':        <class 'django.db.models.lookups.IContains'>,
  'iendswith':        <class 'django.db.models.lookups.IEndsWith'>,
  'iexact':           <class 'django.db.models.lookups.IExact'>,
  'in':               <class 'django.db.models.lookups.In'>,
  'iregex':           <class 'django.db.models.lookups.IRegex'>,
  'isnull':           <class 'django.db.models.lookups.IsNull'>,
  'istartswith':      <class 'django.db.models.lookups.IStartsWith'>,
  'lt':               <class 'django.db.models.lookups.LessThan'>,
  'lte':              <class 'django.db.models.lookups.LessThanOrEqual'>,
  'range':            <class 'django.db.models.lookups.Range'>,
  'regex':            <class 'django.db.models.lookups.Regex'>,
  'startswith':       <class 'django.db.models.lookups.StartsWith'>,

SUBLIME - Anaconda plugin

SublimeText3 Anaconda (Python plugin)

https://sublime-text.zeef.com/zeefcom Anaconda config:

{ "pep8_ignore": [
    "E501",
    "E402",
    "UnusedImport",
    "W291",
    "E722",
  "E111"
    ] ,
  "pyflakes_explicit_ignore": [
    "UnusedImport",
    ],
  "auto_formatting": true,
  "autoformat_ignore":
    [
        "E309",
        "E501",        
    ],
  "auto_complete": true,
  "auto_complete_commit_on_tab": true,
}