Wednesday, November 8, 2017

Can't remove final physical volume  from volume group (Linux)

I have:
[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize   VFree 
  VolGroup   1   0   0 wz--n- 279.36g 279.36g
  centos     1   3   0 wz--n-  <3.64t   3.04t
[root@localhost ~]# pvs
  PV         VG       Fmt  Attr PSize   PFree 
  /dev/sda3  centos   lvm2 a--   <3.64t   3.04t
  /dev/sdb1  VolGroup lvm2 a--  279.36g 279.36g
 and want to remove VolGroup and add /dev/sdb1 into centos VG:
[root@localhost ~]# pvremove /dev/sdb1
  PV /dev/sdb1 is used by VG VolGroup so please use vgreduce first.
  (If you are certain you need pvremove, then confirm by using --force twice.)
  /dev/sdb1: physical volume label not removed.
[root@localhost ~]# vgreduce VolGroup /dev/sdb1
  Can't remove final physical volume "/dev/sdb1" from volume group "VolGroup"

To overcome that issue we'll first inactivate "VolGroup" and then remove that VG:
[root@localhost ~]# vgchange -an VolGroup
  0 logical volume(s) in volume group "VolGroup" now active
[root@localhost ~]# vgremove VolGroup
  Volume group "VolGroup" successfully removed 

Verifying and adding PV to a VG:
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   1   3   0 wz--n- <3.64t 3.04t
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree 
  /dev/sda3  centos lvm2 a--   <3.64t   3.04t
  /dev/sdb1         lvm2 ---  279.36g 279.36g
[root@localhost ~]# vgextend centos /dev/sdb1
  Volume group "centos" successfully extended
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  centos   2   3   0 wz--n- 3.91t 3.31t
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree 
  /dev/sda3  centos lvm2 a--   <3.64t   3.04t
  /dev/sdb1  centos lvm2 a--  279.36g 279.36g


Tuesday, October 17, 2017

Oversubscription (Network)

Oversubscription rates:
  1. Access Layer to Distribution Layer => 20:1
  2. Distribution Layer to Core Layer => 4:1
  3. Data Center links => 1:1
How to count oversubscription rates:
for example you have 48 1Gb/s ports Access Layer switch with one uplink to the Distribution Layer, so your rate is 47*1Gb/s:1*1Gb/s => 47:1 it can be ok, but recommendation is to have 20:1, so you can achieve this by lowering speed of Access Layer ports to 100Mb/s:
47*100Mb/s:1*1Gb/s => 4700Mb/s:1000Mb/s => 4,7:1 this rate is much better.
Also, you can utilize extra port for uplink (LAG=Etherchannel):
46*1Gb/s:2*1Gb/s => 4600:2000 => 23:1
Oversubscription with incorrect rates (given rates are just recommendations and you can calculate your own rates using ports load and dropped packets counters). Using proper oversubscription rates don't supplace QoS it just ensures (theoretically) that devices buffer will not be overloaded and that all packets will be delivered.

Monday, October 2, 2017

Start Android notes

AndroidStudio Project consists of Modules, every project can have 1 or more modules. When you "Run" you run needed module not project.

An app consists of a window - an Activity. Each activity consists of one or several elements (buttons, check-boxes, radio buttons etc.), the Android name for this element is View (Button, TextView, ImageView etc.). To collect views into a group of views we use ViewGroup (LenearLayout, RelativeLayout etc.).

To create activity file for the other screen orientation:
left click on res => right click on res => New => Adnroid resource file => Available qualifiers => Orientation

Size of views in the ViewGroup:
  1. actual size in dp/dpi (dot in one inch)
  2. constant values - match_parent / wrap_content
  3. weight: 
    1. weight=0 equals to wrap_content
    2. weight is the proportion of the view in the 100% of the overall parent ViewGroup. e.g.: button1 has weight=2, button2 has weight=3, button3 has weight=5. so 2+3+5=10 10=100% and 1=10% of the parent ViewGroup actual size.
ViewGroups:
  1. LinearLayout can be horizontally or vertically oriented
  2. RelativeLayout child views are organized relatively to parent or to each other
  3. FrameLayout - reservers space needed to show a single view (useful with Fragments)


Wednesday, September 27, 2017

How to Clone an Android Studio Project

1) Find and go to `AndroidStudioProjects` directory
2) Copy-Paste needed project and rename project folder (e.g. rename app to app_new)
3) Android Studio -> Close Project
4) Open an existing Android Studio Project -> choose name of the copied and renamed directory (app_new)
5) app -> src -> main -> AndroidManifest.xml -> change package name (something like package="com.example.android.app" to package="com.example.android.app_new" )
6) select folder (any) under java (app -> src -> main -> java) and right-click -> Refactor -> Rename -> Rename Package -> app_new -> Refactor -> Do Refactor -> Sync Now (Sync Now may not be needed)
7)  app -> src -> main -> AndroidManifest.xml -> change label of an app (something like android:label="App" to android:label="App New" )
8) Run an App 

Wednesday, September 13, 2017

Choosing name for an Android App

1) Avoid using puns
2) Use https://keywordtool.io/ AppStore for free keyword suggestions
3) App description must have most used  search-keywords
4) Try to use no more than 11 characters. If long name is needed - stick to camel-case. If you need even longer name - use tagline (Example - Evernote tagline is "Remember Everything” expanded along with the product to “Your Life’s Work.”)
5) Use name generators: www.nameboy.com / www.dotomator.com to make brainstorms
6) App name must be easy to pronounce
7) The name must be descriptive (Examples: Evernote / Flipboard / Wunderlist / GrubHub / Eventbrite)
8) Include the phrases “free”, “lite” or “cheap” wherever applicable. This will drive additional traffic to your app.
9) Google Play title (name=brandname + very short description) must be not more than 50 characters

Monday, August 14, 2017

Excluding interface form bridge-group on a Cisco Router

When you have several interfaces in one bridge group and want to exclude interface which is used to access the remote device, doing this manually can end with losing the ability to access device and also users of this router will lose the ability to use the network services.
In such a situation Cisco event manager can help. Assume that we have such configuration:
bridge irb
!
bridge 2 protocol ieee
bridge 2 route ip
!
interface GigabitEthernet1
 description ===WAN===
 no ip address
 bridge-group 2
 no shut
!
interface BVI2
 description === WAN ===
 ip address 10.10.10.204 255.255.255.0
our default gateway is 10.10.10.26

We need following:

On Cisco router:

ip sla 1
 icmp-echo 10.10.10.26 source-ip 10.10.10.204
 threshold 1000
 timeout 1500
 frequency 3
ip sla schedule 1 life forever start-time now
track 10 ip sla 1 reachability
 delay down 10 up 60
event manager applet reconfigure_interface
 event track 10 state down
 action 0    cli command "enable"
 action 1    cli command "configure terminal"
 action 2    cli command "no int BVI 2"
 action 3    cli command "interface GigabitEthernet1"
 action 4    cli command "no bridge-group 2"
 action 5    cli command "ip address 10.10.10.204 255.255.255.0"
 action 6    cli command "exit"
 action 7    cli command "no event manager applet reconfigure_interface"
 action 8    cli command "no track 10"
 action 9.1 cli command "no ip sla 1"
 action 9.2 cli command "end"

On default gateway:

we deny icmp from 10.10.10.204

When ping is disabled, track senses this via ip sla and in the end event manager executes commands for us.
That is it ...

PS:
1) if something goes wrong you can re-enable ping and ask somebody on the remote side to restart Cisco. This will load old configuration.
2) after accessing Cisco execute write command to save changes 

Monday, July 3, 2017

git - small tutorial

[admin@localhost ~]$ sudo yum install git -y
[admin@localhost ~]$ git config --global user.name "tarasov.dmitriy"
[admin@localhost ~]$ git config --global user.name "tarasov.dmitriy@gmail.com"

Make git repository in needed directory (I'll use git_test dir):
[admin@localhost ~]$ mkdir git_test
[admin@localhost ~]$ cd git_test
[admin@localhost ~]$ git init
Initialized empty Git repository in /home/admin/git_test/.git/
[admin@localhost git_test]$ cat > git_test.cfg
this is test file used to understand git
[admin@localhost git_test]$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    git_test.cfg
nothing added to commit but untracked files present (use "git add" to track)

If you have many files in directory and want to track only limited number of files, first setup gitignore file as follows (we also can add allfiles in directory via `git add .`):
[admin@localhost git_test]$ echo "*" > .gitignore
[admin@localhost git_test]$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
[admin@localhost git_test]$ ls -1
git_test.cfg

Now we'll add needed files (git_test.cfg in our example):
[admin@localhost git_test]$ git add git_test.cfg
The following paths are ignored by one of your .gitignore files:
git_test.cfg
Use -f if you really want to add them.
fatal: no files added
Aha..
[admin@localhost git_test]$ git add -f git_test.cfg
[admin@localhost git_test]$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#    new file:   git_test.cfg
#

After adding all needed files, we must commit:
[admin@localhost git_test]$ git commit -m "initial configuration commit"
[master (root-commit) 30d2109] initial configuration commit
 Committer: tarasov.dmitriy@gmail.com <admin@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+)
 create mode 100644 git_test.cfg

Now we can make symbolic link to that file (git_test.cfg) and place this link to the needed directory so that we can use actual version of this file:
[admin@localhost git_test]$ ln -s ~/git_test/git_test.cfg ~/Desktop/

I prefer to use cp -s because it's more verbose, i.e.:
cp -s git_test.cfg /home/admin/Desktop/
cp: ‘/home/admin/Desktop/git_test.cfg’: can make relative symbolic links only in current directory

Now if we'll check the status of our git repository:
[admin@localhost git_test]$ git status
# On branch master
nothing to commit, working directory clean

To list all files in a repo, use this command:
[admin@localhost git_test]$ git ls-files
git_test.cfg


see:
1) http://www.zyxware.com/articles/2515/track-server-configuration-file-changes-using-git-versioning-system
2) http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
3) https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/