Yaru Gtk Themes Available in Dark and Light Variants for Ubuntu 18.04

Yaru-light and Yaru-dark based on ‘Yaru theme (Ubuntu community theme)’ https://github.com/ubuntu/yaru powered by the community on the Ubuntu hub. Yaru theme design for GTK 3, GTK 2 and Gnome-Shell. Some of the additional tweaks:

  • Switch gtk control with round radius.
  • Transparent gnome-shell.

Installation :

  1. Just unzip the file and place it in your themes directory i.e. ~/.themes/or /usr/share/themes/
  2. Install gnome-tweak-tool
    sudo apt install gnome-tweak-tool
  3. Select the theme as ‘Yaru-light’ or ‘Yaru-dark’

Download : https://www.gnome-look.org/p/1252100/
Base : https://github.com/ubuntu/yaru

sysctl – changing kernel parameters at runtime

#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3

##############################################################3
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1


###################################################################
# Additional settings - these settings can improve the network
# security of the host and prevent against some network attacks
# including spoofing attacks and man in the middle attacks through
# redirection. Some network environments, however, require that these
# settings are disabled so review and enable them as needed.
#
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
#net.ipv4.conf.all.send_redirects = 0
#
# Do not accept IP source route packets (we are not a router)
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#

###################################################################
# Magic system request Key
# 0=disable, 1=enable all
# Debian kernels have this set to 0 (disable the key)
# See https://www.kernel.org/doc/Documentation/sysrq.txt
# for what other values do
#kernel.sysrq=1

###################################################################
# Protected links
#
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted) 
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
#fs.protected_hardlinks=0
#fs.protected_symlinks=0

###################################################################
# Improving performance
# Virtual memory
# Consensus is that setting vm.dirty_ratio to 10% of RAM is a sane value if RAM is say 1 GB (so 10% is 100 MB). But if the machine has much more RAM, say 16 GB (10% is 1.6 # GB), the percentage may be out of proportion as it becomes several seconds of writeback on spinning disks. A more sane value in this case may be 3 (3% of 16 GB is #approximately 491 MB).

vm.swappiness=10
vm.dirty_ratio=10
vm.dirty_background_ratio=5
vm.vfs_cache_pressure=50
vm.dirty_background_bytes=4194304
vm.dirty_bytes=4194304

# Networking
# Increasing the size of the receive queue.
net.core.netdev_max_backlog=100000
net.core.netdev_budget=50000
net.core.netdev_budget_usecs=5000
#
# Increase the maximum connections default 128
net.core.somaxconn=1024
#
# Increase the memory dedicated to the network interfaces
net.core.rmem_default=1048576
net.core.rmem_max=16777216
net.core.wmem_default=1048576
net.core.wmem_max=16777216
net.core.optmem_max=65536
net.ipv4.tcp_rmem=4096 1048576 2097152
net.ipv4.tcp_wmem=4096 65536 16777216
#
# increase the default 4096 UDP limits
net.ipv4.udp_rmem_min=8192
net.ipv4.udp_wmem_min=8192
#
# Enable TCP Fast Open
net.ipv4.tcp_fastopen=3
#
# Tweak the pending connection handling
net.ipv4.tcp_max_syn_backlog=30000
net.ipv4.tcp_max_tw_buckets=2000000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_slow_start_after_idle=0
#
# Change TCP keepalive parameters
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=6
#
# Enable MTU probing
net.ipv4.tcp_mtu_probing=1
#
# TCP Timestamps
net.ipv4.tcp_timestamps=0
#
# TCP/IP stack hardening
# TCP SYN cookie protection
net.ipv4.tcp_syncookies=1
#
# TCP rfc1337
net.ipv4.tcp_rfc1337=1
#
# Reverse path filtering
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
#
# Log martian packets
net.ipv4.conf.default.log_martians=1
net.ipv4.conf.all.log_martians=1
#
# Disable ICMP redirecting
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
#
# disable ICMP redirect sending when on a non router
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
#
# Enable Ignoring to ICMP Request
net.ipv4.icmp_echo_ignore_all=1

 
Source : https://wiki.archlinux.org/index.php/Sysctl

สร้าง docker container สำหรับทำ REST API กัน – Full fake data

ในวันที่ต้อง Mock API แบบด่วน ๆ สำหรับทดสอบ Front-end (แต่ Back-end จริง ๆ มันยังอยู่แค่ในร่างออกแบบ) งั้นก็เริ่มกันเลย

เราใช้ json-server เป็นตัวช่วยทำ Mock API ซึ่งก็ตอบโจทย์และเร็วสุดละ สิ่งที่เราต้องทำเพิ่มคือสร้างชุดข้อมูลสำหรับทดสอบเท่านั้นเอง

npm install -g json-server

ส่วนการสร้างชุดข้อมูลก็ใช้ faker.js (เราใช้ lodash เพิ่ม ก็ติดตั้งเข้าไปพร้อมกันเลย)

npm install faker lodash

สร้างชุดข้อมูลแบบ random ด้วยไฟล์ชื่อ generator.js เข้าไป

// generator.js
module.exports = function () {
    var faker = require("faker");
    var _ = require("lodash");
    return {
        customers: _.times(Math.floor((Math.random() * 1000) + 1), function (n) {
            return {
                id: n+1,
                firstname: faker.name.firstName(),
                lastname: faker.name.lastName(),
                birthdate: faker.date.past(50, new Date("Sat Sep 20 1992 21:35:02 GMT+0700 (ICT)")),
                address: faker.address.streetAddress(),
                city: faker.address.city(),
                country: faker.address.country(),
                email: faker.internet.email(),
                avatar: faker.internet.avatar()
            }
        })
    }
}

หลังจากที่เรา Start Server ด้วยคำสั่ง json-server generator.js ข้อมูลที่เรา generate ขึ้นหน้าตาก็ประมาณนี้

ท้ายสุดเราก็แพ็คลง Container เลย โดยสร้าง Dockerfile ไว้ใช้งานยาว ๆ  (เป็นลางว่า Back-end จะยังไม่เสร็จในเร็ววันใช่ไหม 55555)

FROM node:10-alpine

LABEL author="mf"
LABEL version="latest"

ENV NPM_CONFIG_LOGLEVEL info
ENV TZ Asia/Bangkok

RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Bangkok /etc/localtime \
    && echo "Asia/Bangkok" >  /etc/timezone \
    && rm -rf /var/cache/apk/*

# Create application directory
RUN mkdir -p /data \
    && npm install -g json-server lodash faker
WORKDIR /data

VOLUME [ "/data" ]
EXPOSE 3000

# Default command
ENTRYPOINT ["json-server"]
CMD ["--help"]

หลังจาก build Dockerfile แล้วก็ลองรันกันเลย ถ้าไม่ทำอะไรผิดพลาดผลลัพธ์มันก็ควรจะเป็นดังรูป

docker run -d -p 3000:3000 -v `pwd`/app:/data mf/mockup-api --watch generator.js --host 0.0.0.0

จบปิ๊งง ^_^

Dockerized (SQLiv) massive SQL injection

SQLiv
Massive SQL injection scanner

FROM alpine:latest
MAINTAINER M
LABEL version="latest"

RUN apk add --no-cache python py-pip openssl git && pip install --upgrade pip && \
rm -rf /var/cache/apk/* && \
mkdir -p /opt && cd /opt && git clone https://github.com/Hadesy2k/sqlivulscan.git && \
cd /opt/sqlivulscan && \
chmod 755 /opt/sqlivulscan/setup.py && \
python2 setup.py -i

RUN rm -rf /opt && chmod 755 /usr/share/sqliv/sqliv.py

WORKDIR /usr/share/sqliv

ENTRYPOINT ["python", "sqliv.py"]
CMD ["--help"]

ป.ล.

  • ไว้ใช้สำหรับหาข้อผิดพลาดเพื่อป้องกัน ไม่แนะนำให้ใช้มีดแทงตัวเอง นะจ๊ะ นะจ๊ะ
  • อยู่ในแลปช่วงหัดเขียน Dockerfile
  • ข้อมูลเพิ่มเติมที่ https://en.kali.tools/all/?tool=1334
  • build เอาหล่ะกันนะจ๊ะ นะจ๊ะ

 

Automatically backup MySQL database to Google Drive

ประเด็นหลัก ๆ ของบล็อกนี้ก็เรื่องของการสำรองฐานข้อมูลนั่นแหล่ะ ต่างกันนิดหน่อยกับคำว่าตัวสำรอง เราสำรองเพราะเห็นว่าสิ่งนั้นสำคัญแต่ตัวสำรองคือยังไม่สำคัญนะให้รอ ก็ได้แค่นั้นแค่ตัวสำรอง

เดี๋ยวลองไล่ลำดับ ขั้นตอนในกระบวนการนี้ด้วยกัน

  1. เริ่มสำรองข้อมูล ในที่นี้คือฐานข้อมูลของ MySQL ด้วย Tool มาตรฐานคือ mysqldump (ส่วนเรื่องพารามิเตอร์ในคำสั่ง อะไรยังไง จะเอาอะไร ไม่เอาอะไร อ่านต่อได้ที่นี่)
  2. บีบอัดไฟล์ให้ขนาดเล็กลง
  3. เก็บไฟล์ไว้ที่เครื่องโลคอลนิดหน่อยอีก 30 วันค่อยมาลบหล่ะกัน (ทั้งนี้ทั้งนั้นก็ขึ้นกับความต้องการด้วยนะว่าเหมาะสมแค่ไหน)
  4. ทำการอัพโหลดข้อมูลที่สำรองได้ขึ้น Google Drive ผ่าน Google Drive CLI Client ตัวนึงที่ชื่อว่า gdrive (จุดประสงค์หลักคือเพื่อให้มีแหล่งเก็บอื่นเพิ่ม) ก่อนการใช้งานจำเป็นต้องอนุญาตให้ gdrive สามารถเข้าถึง Google Drive ของเราได้ก่อน
    1. อนุญาตสิจ๊ะ
    2. คัดลอก Token ที่ได้ เพื่อมาใช้ในโปรแกรม
  5. ทั้งหมดทั้งมวลให้ทำงานอัตโนมัติ โดยการใช้ crontab (สงสัยวิธีใช้งานก็ตามอ่านกันที่นี่นะ #เหมือนจะขี้เกียจ #55555)

โดยขั้นตอนข้างต้นเราเขียนเชลล์สคริปท์สั้น ๆ สำหรับทำงานแบบรูทีนตามนี้

ผลลัพธ์ที่ได้ก็ตามนี้

ป.ล. 1
การสำรองข้อมูลเป็นเรื่องที่สำคัญพอ ๆ กับการทดสอบไฟล์ที่สำรองได้นั้นสามารถใช้งานได้หรือไม่

ป.ล 2
gdrive – gdrive is a command line utility for interacting with Google Drive.
pv – monitor the progress of data through a pipe.

 

Smart Card Reader เสียรึเปล่าเนี่ย ?

Smart Card Reader เสียรึเปล่าเนี่ย ?

คำถามแรกเลยเวลาที่เปิดใช้งานโปรแกรมที่จำเป็นต้องติดต่อกับ Smart Card (สำหรับหน่วยงานราชการเกี่ยวกับเงิน ๆ ทอง ๆ นี่หลายโปรแกรมกันเลยทีเดียวเชียว) แล้วผลปรากฏว่า นิ่ง นิ่ง โปรแกรมไม่อ่านการ์ด/บัตร แล้วก็จะเกิดคำถามต่อ ๆ มา

  • Driver เครื่องอ่านติดตั้งรึยัง ติดตั้งแล้วใช้ได้ไหม
  • โปรแกรมต้องการคอมโพเนนท์/ไลบรารี่อะไรเพิ่มเติมอีกไหม
  • การ์ด/บัตร ยังอ่านได้ไหม มันเลือนไปอ่านไม่ได้เหมือนหัวใจใครบางคนรึเปล่า
  • แล้วเครื่องนี่ยังใช้ได้ไหม (วะ) เนี่ยยยยย

ปกติเราก็มักจะจำกัดขอบเขตของปัญหาใช่ไหม ถ้าเครื่อง Smart Card Reader เจ๊งจริงก็จะได้รู้ไง โดยฝั่ง Linux ก็สามารถใช้ pcsc_scan ตรวจสอบ ผลที่ได้ก็จะประมาณนี้ถ้าทุกอย่างโอเค

ในฝั่ง Windows เองมักใช้โปรแกรมที่ติดมากับ Smart Card Reader ซึ่งปกติก็มักหายไปกับแผ่น Driver เรียบร้อยแล้วหรือใครเพียรพยายามเก็บไว้ก็ดีไป ส่วนเราจะอิ๊อ๊ะอยู่ใย ก็ทำเองเลย โดยความต้องการพื้นฐานสำหรับรันโปรแกรมนี้ คือ

  • .NET Framework 2.0 ขึ้นไป
  • Smart Card Reader
  • การ์ด/บัตร ประชาชนคนไทย 😛

โปรแกรมชื่อ Reader Checker สามารถตรวจสอบว่าเครื่องอ่านหรือบัตรใช้งานได้จริงหรือไม่ วิธีง่าย ๆ ก็ให้โปรแกรมอ่านการ์ด/บัตรนั่นแหล่ะ กรณีที่มีการติดตั้งเครื่องอ่านสมาร์ทการ์ดมากกว่าหนึ่งเครื่องก็สามารถเลือกได้จากลิสต์ ดังรูป

กรณีพบความผิดพลาดไม่สามารถอ่านบัตรได้หรือกรณีอื่นก็สามารถตรวจสอบได้จากข้อความแจ้งเตือนจากโปรแกรม ถ้าทุกอย่างโอเค โปรแกรมจะทำการอ่านข้อมูลในการ์ด/บัตรออกมา แบบนี้

ป.ล.

  • โปรแกรมสามารถส่งออก/Export รูปที่อ่านได้ ถ้าต้องการ
  • ไลบรารี่ที่เกี่ยวข้อง กรณีต้องการพัฒนาโปรแกรมที่เกี่ยวกับ บัตรประชาชนคนไทยก็ ตามไปที่ GitHub ของคุณ Chakphanu Komasathit หรือในกลุ่มของ HOSXP
  • Specification ของ PC/SC
  • Windows PC/SC 1.0 (Smart Card)
  • สามารถสนับสนุนค่ากาแฟเราได้นะ Bitcoin Wallet Address :
    3DchASXQrisoqmJfxU6uRsbC5NV3Wsspyb

 

 

 

HDC & Smart Card On Ubuntu

จากที่ระบบ HDC ของกระทรวงสาธารณสุขปรับปรุงจนถึงเวอร์ชั่น 4.0 และก็มีการปรับปรุงเรื่องการตรวจสอบสิทธิ์การเข้าถึงข้อมูลด้วย Smart Card ซึ่งมันก็เป็นเรื่องที่น่ายินดีเลย (เราเองก็เพิ่งได้อบรมเชิงปฏิบัติการจากจังหวัดไปเมื่อวันนี้ สด ๆ ร้อน ๆ)

ด้วยความที่เครื่องทำงานหลัก ๆ อยู่บน Ubuntu งั้นเราก็มาลองใช้ Smart Card ตรวจสอบเพื่อเข้าระบบ HDC ผ่าน Ubuntu กัน (สำหรับดิสโทรอื่นก็คงไม่ต่างกันมากนัก) และ Smart Card Agent ก็ถูกพัฒนาขึ้นโดยใช้ Java เพราะฉะนั้นก็การันตีในระดับนึงว่าแพลตฟอร์มอื่นก็รันได้เช่นกัน

  1. เดิม ๆ เครื่องไม่รู้จัก Smart Card รัน Agent จะขึ้นไดอะล็อกแบบนี้ ไม่ต้องตกใจ มันแจ้งเตือนถูกแล้ว
  2. เพราะฉะนั้นก็ทำให้เครื่องเรารู้จัก Smart Card ซะ มีแพคเกจที่จำเป็นสำหรับติดต่อ Smart Card ก็ติดตั้งได้เลยตามนี้
    sudo apt install pcscd pcsc-tools
  3. ตรวจสอบอีกทีว่าติดต่อ Smart Card ได้แล้ว ด้วย pcsc_scan


    เจอข้อความตามภาพก็เป็นอันว่าเครื่องรู้จัก Smart Card Reader และสามารถอ่านบัตรประชาชนชาวไทยได้เรียบร้อยแล้ว

  4. ขั้นตอนต่อไปก็รัน Smart Card Agent ได้เลย (ข้ามเรื่องติดตั้ง JRE ไปเลยนะ ถ้าไม่มีก็ติดตั้งซะ)
    java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1 -jar javadaemon.jar 8080

    **มีเรื่องที่ต้องตรวจสอบ 2 เรื่องคือ
    – Port 8080 ไม่ควรถูกใช้ถ้าใช้ก็ปิด Service ที่ใช้ชั่วคราว
    – เพื่อให้ไลบรารี่ smartcardio ของ java ทำงานได้ ก็ใช้คำสั่งตามข้างบน อ้างอิง

  5. เปิดหน้า Login ของ HDC ก็เป็นอันสามารถเข้าใช้งานได้ เคลียร์ !!!

Watermark images with file name

เช้าวันนี้ (2 พฤศจิกายน 2559) มาพร้อมกับงานด่วน
– Watermark ไฟล์รูปด้วยชื่อไฟล์ (ต้นฉบับมาแบบนี้ -*-)
– ไฟล์รูปมีคร่าว ๆ ก็เกือบ 100 รูป ความขี้เกียจเข้าครอบงำโดยพลัน
selection_030

selection_031

#!/bin/bash
#
# NAME:		WatermarkFilename	
# AUTHOR:	MF
# A script to add a watermark and overwrite all images in a directory.


savedir=".originals"
mkdir -p $savedir

for image in *png *jpg *jpeg *gif
do
	if [ -s $image ] ; then   # non-zero file size

		width=$(identify -format %w $image)
		filename=$(basename "$image")
		fname="${filename%.*}"
		ext="${filename##*.}"
		fullpath="$(dirname $(readlink -f "${image}"))/${image##*/}"

		convert -background '#cccccc' \
		-fill white -gravity center \
		-font loma -pointsize 30 -size ${width}x60 caption:$fname \
		$image +swap -gravity south -composite new-$image
		mv $image $savedir
		mv new-$image $image
		echo "Watermarked $image successfully"		
	fi
done

ป.ล.
– เสียเวลาไปกับการตรวจสอบข้อมูลให้ตรงกับชื่อไฟล์ซะมากกว่า
– ไฟล์ตัวอย่างจาก https://unsplash.com/
– ใช้แพคเกจ imagemagick

Dirty Lab : Import many delimited files into MySQL

ดูโค๊ดเอาหล่ะกันเน๊อะ มีความขี้เกียจตั้งแต่เห็นจำนวนไฟล์ละ (คือแบบเยอะมากกกกกกก) แต่จำเป็นต้องใช้ก็เลยเกิดแลปแบบด่วน ๆ
– ใช้โครงสร้างของ HDC
– ไฟล์ที่นำเข้าอยู่ในรูปแบบของโครงสร้างมาตรฐานข้อมูลด้านสุขภาพ กระทรวงสาธารณสุข (43 แฟ้ม)
– ปล้ำ Servlet ของ HDC โดยไม่ติดตั้งระบบนี่ดูยาก ๆ อ่ะ รอปรึกษา Phoubon Ict
– อันนี้ช่วงรอไฟล์นำเข้า

#!/bin/sh
#Import delimited file to database;

IMPORTEDFOLDER="imported"

fileCount=0
fileName=""
filePath=""

mkdir -p "../${IMPORTEDFOLDER}"

for zip in *.zip; do
    zip_filename="${zip%%.*}"
    unzip "${zip}" -d "${zip_filename}"
    mv -f "${zip}" "../${IMPORTEDFOLDER}"
    
    for file in $(find ./ -name '*.txt' -or -name '*.TXT'); do
        fileName=${file##*/}
        fileName=${fileName%.txt}
        filePath="$(dirname $(readlink -f "${file}"))/${file##*/}"
        
        #TODO: Extend to GNU Parallel
        sh importdelimited.sh "${filePath}" "${fileName}" 
        
        fileCount=$((fileCount+1))
    done
    
    #rm -rf "${zip_filename}"
    
done

echo "${fileCount} files completed."

สคริปสำหรับนำเข้าฐานข้อมูลของ MySQL

#!/bin/sh
#Import delimited file to database;
#Usage : sh importdelimited.sh {Source} {Target}

LOGFILE="importlog.log"
DB="hdc"
USERDB="a1a1a1"
PASSDB="b1b1b1"
SQL=""

SQL="SET SESSION sql_mode=''; LOAD DATA LOCAL INFILE '$1' REPLACE INTO TABLE $2 FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;"
echo "$(date -u) $2:${SQL}" >> "../${LOGFILE}" 2>&1
mysql -u${USERDB} -p${PASSDB} ${DB} -e "${SQL}"
rm -f $1

ส่วนใครจะปรับโค๊ดให้ดูเมพขึ้นก็ตามสบายนะครับ ถ้าให้ดีก็ดิสคัสกันต่อก็ได้ เรานูปเชลสคริปท์ อย่างอื่นก็นูป (ดัก)

Flat-Plat-Blue-Dark GTK 3.20 Theme/Style

A Material Design-like flat theme for GTK3, GTK2, and GNOME Shell.

Flatplatblue-dark-Mockup-Trans

  • This theme is currently tested on Ubuntu 16.04
  • GTK theme and Shell theme based on Flat-Plat-Blue theme

Installation

  1. Download a archive.
  2. Extract it to the themes directory.
    • For system-wide installation to /usr/share/themes
    • For user-specific installation to ~/.themes
  3. Use gnome-tweak-tool to change the theme.

GDM (Lock/Login Screen)

  1. Backup an existing .gresource file. (Skip this step when you just update it.)

    sudo cp /usr/share/gnome-shell/gnome-shell-theme.gresource /usr/share/gnome-shell/gnome-shell-theme.gresource.bk~
  2. Replace with the new one.
    • If you put this theme in /usr/share/themes:
      sudo cp /usr/share/themes/Flat-Plat-Blue-Dark/gnome-shell/gnome-shell-theme.gresource /usr/share/gnome-shell
    • If you put this theme in ~/.themes:
      sudo cp ~/.themes/Flat-Plat-Blue-Dark/gnome-shell/gnome-shell-theme.gresource /usr/share/gnome-shell
      
  3. Restart GNOME Shell (press Alt+F2, then type r).

Screenshots

Change Log

  • 2016/06/07/
    – Initial release
  • 2016/06/12
    – Fix switch and top bar
    – Improved ripple effect

P.S./ป.ล.
ช่วงนี้ดาร์ก ๆ ก็ใช้ธีมดาร์ก ๆ หล่ะกัน ^_^