Just enter a tcode and get the user-exits associated with it. Click here.
[macOS] Homebrew & Neofetch
First install Hoembrew, a package manager for macOS.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
With this package manager installed, further software installation is pretty easy. For Neofetch just use:
brew install neofetch
[Linux Mint] Install PyWal on Linux Mint 19.2 Cinnamon
“Pywal is a tool that generates a color palette from the dominant colors in an image. It then applies the colors system-wide and on-the-fly in all of your favourite programs.”
For the installation, look at GitHub. In my case, I had to run the following command:
sudo apt purge python3-pip && sudo apt install --install-recommends python3-pip && pip3 install pywal
To get an overview of your PyWal installation, run:
pip3 show pywal
Test it with:
wal -v
If it returns “zsh: command not found: pywal” you have to add the PIP install directory to your path
export PATH="${PATH}:${HOME}/.local/bin/"
To use PyWal, just run it with wal -i and the path to an image.
wal -i /path/to/image.jpg
[Linux Mint] Install Polybar on Linux Mint 19.2 Cinnamon
Install dependencies:
sudo apt-get install cmake cmake-data libcairo2-dev libxcb1-dev libxcb-ewmh-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-randr0-dev libxcb-util0-dev libxcb-xkb-dev pkg-config python-xcbgen xcb-proto libxcb-xrm-dev i3-wm libasound2-dev libmpdclient-dev libiw-dev libcurl4-openssl-dev libpulse-dev
Clone Polybar repo:
git clone https://github.com/jaagr/polybar.git
Build Polybar:
cd polybar && ./build.sh
During the installtion choose “install example configuration” and you will find it here:
$HOME/.config/polybar/config
Testrun the example configuration with the following command (the bar in this config is called “example”):
polybar example
Further configuration options can be found on their GitHub page.
[Shell] Zsh + Oh My Zsh + Powerlevel10k
Install Zsh (Shell)
https://github.com/robbyrussell/oh-my-zsh/wiki/Installing-ZSH
sudo apt install zsh
chsh -s $(which zsh)
Logout and login back again to use your new default shell.
echo $SHELL
Expected result: /bin/zsh
Install Oh My Zsh (Zsh framework with tools and themes)
https://github.com/robbyrussell/oh-my-zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
In addition I installed the Powerline Fonts:
apt-get install fonts-powerline
Restart your terminal to launch the Oh My Zsh configuration.
After the installation and configuration I usually add “neofetch | lolcat” at the end of my zsh config: ~/.zshrc
Install Powerlevel10K (Powerlevel10k is a theme for ZSH)
https://github.com/romkatv/powerlevel10k#oh-my-zsh
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Set ZSH_THEME=powerlevel10k/powerlevel10k
in your ~/.zshrc
.
I also installed the patched Meslo Nerd Font and set it as terminal font. Else some icons will not be displayed in Powerlevel10k.
Restart your terminal and go through the configuration steps. The result will look similar to this:
Or like this:
Next you could install a Zsh plugin like: https://nocin.eu/shell-zsh-autosuggestions/
Or check the OMZ Cheatsheet: https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet
[ZFS] Encryption
Native encryption in ZFS is supported since version 0.8.0. Check your current ZFS version with:
modinfo zfs
First activate the encryption feature on your pool:
zpool set feature@encryption=enabled pool_name
To get an overview of all pools with enabled encryption use the following command:
zpool get all | grep encryption
To create a new encrypted dataset with a passphrase:
zfs create -o encryption=aes-256-gcm -o keyformat=passphrase pool_name/dataset_name
Check the keystatus, the current encryption type and the mountpoint with the following commands:
zfs get keystatus pool_name/dataset_name
zfs get encryption pool_name/dataset_name
zfs list pool_name/dataset_name
Change the passphrase with:
zfs change-key pool_name/dataset_name
After a reboot you first have to load your key and then mount your dataset:
zfs load-key pool_name/dataset_name
zfs mount pool_name/dataset_name
Unmount and unload your key:
zfs umount pool_name/dataset_name
zfs unload-key pool_name/dataset_name
If you are sharing this dataset via NFS, it could be necessary to restart the NFS service after mounting. I just deactivate and activate again NFS on the dataset.
zfs set sharenfs=off pool_name/dataset_name
zfs set sharenfs=on pool_name/dataset_name
[Proxmox] PVE Kernel Cleaner
Script to remove old/unused kernels on your Proxmox host. Look at Github PVE Kernel Cleaner for the installation guide. To run the script use:
pvekclean
[Fiori] Send notification mail if workitem is forwarded in MyInbox
If you forward a workitem manually from the MyInbox or via function module SAP_WAPI_FORWARD_WORKITEM, the function module SWW_WI_FORWARD will be called. There the SAP implemented a BAdI call of the BAdI WF_WI_FORWARD.
The BAdI provides a method to add additional checks, when forwarding a workitem. I will use it, to send notification mails.
Create your own BAdI implementation and add a task id as filter. In my case it’s the task TS21500003 of the leave request approval workflow.
Now your implementation will only be called, if this specific workitem is forwarded. Now we implement the method CHECK_BEFORE_FORWARD. The method has enough parameters to get all necessary information to enrich the mail text.
First the workitem container is read out of the context. There we get the _WI_OBJECT_ID element, which contains the request object reference. With this information we are able to get the current request object out of the workflow. I pass this into antother class where I already have a mail sending implementation.
METHOD if_ex_wf_wi_workitem~check_before_forward.
*---------------------------------------------------------------------------------*
* This BAdI implementation is used to send an info mail when a workitem is forwarded.
*---------------------------------------------------------------------------------*
TRY.
"Get workitem container and requestId
DATA(container) = im_workitem_context->get_wi_container( ).
container->get_value_ref( EXPORTING name = |_WI_OBJECT_ID|
IMPORTING value_ref = DATA(lr_req_id) ).
ASSIGN lr_req_id->* TO FIELD-SYMBOL(<lpor>).
"Get current request object
DATA(lo_req) = NEW cl_pt_req_wf_attribs( )->bi_persistent~find_by_lpor( lpor = <lpor> ).
"Send an info mail to each new agent (should be only one)
LOOP AT im_table_new_agents INTO DATA(new_agent).
zcl_hcm_leave_request_assist=>send_mail( io_req = CAST cl_pt_req_wf_attribs( lo_req )
iv_tdname = mc_mailtext
iv_pernr = cl_hcmfab_employee_api=>get_instance( )->get_employeenumber_from_user( iv_user = new_agent-objid ) ).
ENDLOOP.
CATCH cx_hcmfab_common.
CATCH cx_swf_cnt_elem_not_found.
CATCH cx_swf_cnt_container.
"In error case, do nothing. The workitem should still be forwarded.
RETURN.
ENDTRY.
"Write Info to WF Log
MESSAGE s001(00) WITH |Forward: Mail { mc_mailtext }| INTO DATA(lv_message).
im_workitem_context->set_message_to_log( im_function = CONV #( lv_message ) "max char30
im_message = VALUE #( msgid = sy-msgid
msgty = sy-msgty
msgno = sy-msgno
msgv1 = sy-msgv1 ) ).
COMMIT WORK.
ENDMETHOD.
At the end I’m writing a little notification in the workflow log. The workitem context provides the method set_message_to_log for this. The log will look like this.
[ABAP] Access leave request attributes
cl_pt_req_badi=>get_request( EXPORTING im_req_id = request_id
IMPORTING ex_request = DATA(request) ).
request->get_all_attribs( IMPORTING ex_attribs_struc = DATA(req_attribs) ).
DATA(req_begda) = req_attribs-version-item_tab[ 10 ]-value.
Take a look in the item_tab to see the specific request values.