Skip to content

Instantly share code, notes, and snippets.

View wafer-li's full-sized avatar
💭
I may be slow to respond.

Wafer Li wafer-li

💭
I may be slow to respond.
View GitHub Profile
@wafer-li
wafer-li / dmr_contacts.py
Last active December 18, 2023 06:13
Get Contacts in China from RadioID.net and change to YSHON AR-55A format
import requests
import csv
def main():
response = requests.get('https://database.radioid.net/static/user.csv')
with open('user.csv', 'wb') as csv_file:
csv_file.write(response.content)
with open('user.csv', newline='') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
@wafer-li
wafer-li / EquivalentUntilWindowedFlow.kt
Last active August 9, 2021 12:40
Kotlin Flow emit when the upstream emit the same value [windowSize] times
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.collect
import java.util.concurrent.atomic.AtomicInteger
private val defaultKeySelector: (Any?) -> Any? = { it }
private val defaultAreEquivalent: (Any?, Any?) -> Boolean = { old, new -> old == new }
@wafer-li
wafer-li / App.kt
Created July 15, 2021 11:42
CameraX Custom SurfaceCombination
@SuppressLint("RestrictedApi")
class App : Application(), CameraXConfig.Provider {
override fun getCameraXConfig(): CameraXConfig {
val defaultConfig = Camera2Config.defaultConfig()
val provider = CameraDeviceSurfaceManager.Provider { context, cameraManager, availableCameraIds ->
Camera2DeviceSurfaceManagerModified(context, cameraManager, availableCameraIds)
}
@wafer-li
wafer-li / TouchDelegateComposite.java
Last active June 10, 2020 08:14
TouchDelegateComposite to handle multiple view delegate their touch event to one specific view
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class TouchDelegateComposite extends TouchDelegate {
@wafer-li
wafer-li / GridSpaceItemDecoration.kt
Last active May 12, 2020 09:01
基于公式法写的一个 GridSpaceItemDecoration, 实现 GridLayoutManager 居中元素空隙
import android.graphics.Rect
import android.view.View
import androidx.annotation.Dimension
import androidx.core.text.TextUtilsCompat
import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import li.wafer.nbnhhshandroid.common.extensions.dipToPx
import java.util.*
import kotlin.math.roundToInt
@wafer-li
wafer-li / RandomSequencer.kt
Last active December 21, 2019 02:40
A Random Sequencer generate sequence of random item within range which ensure no duplicate item in a range block
package profile.adapter
import profile.adapter.RandomSequencer.Companion.fromCharRange
import profile.adapter.RandomSequencer.Companion.fromIntRange
import profile.adapter.RandomSequencer.Companion.fromLongRange
import kotlin.random.Random
/**
* A Random Sequencer which accomplish :
* 1. Generate a sequence of random items within range.
@wafer-li
wafer-li / cidr-to-range.py
Created May 30, 2019 03:44
CIDR to IP range
import argparse
from netaddr import IPNetwork
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('filename', help='The filename of the file you need to convert')
args = arg_parser.parse_args()
src_filename = args.filename
output_filename = 'ip-range.txt'
@wafer-li
wafer-li / pack.py
Created May 28, 2019 17:41
Soartex-Modded texture pack script. Use it in the root of Soartex-Modded-1-12-2 and it will pack all mods's textures into one.
import os
import zipfile
zip_file = zipfile.ZipFile('Soartex-Modded-1-12-2.zip', 'w', zipfile.ZIP_DEFLATED)
for root,dirs,files in os.walk('.'):
relative_path = root[2:]
if relative_path.count(os.sep) > 1: # root == App/asserts/lowcase
for f in files:
@wafer-li
wafer-li / gpgkey.pub
Created January 21, 2018 17:29
My Public PGP Key
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org
mQINBFpkXgwBEADt11KmhByhH8pm1y5OwojS20vxpvo/yEiC7xfiKjq1Y61fR41X
JpTUFjVx/DJJgxy4XJ109ccGijySMZfRzBglnYRApgC5YsdP2d/cezKw5tYhRLgC
qbXsMVh6YJT/y8cMeP7LQ2LBGamki/jxj38yno0dr/ZPYTONsLPVCfp0NC5HxoWs
rDjyI6Ii581nDdE/vFm0QwM6CBGzpCbAMN/Xy8A/BXYIeQWJU19K7wRb4J6yjjdR
Wg9N7va9IMkBcHgAujeg0lEk+NDVRh7l2xY+Jcoqf5wEoEeNvbeguPOBltXZN1+Q
1daETq0/IfKzhsVjGSXHx408z7/nNQlv3d8qE8cOOltr1HUzK2+V11EJi1U+XtDL
aI/jcdB3ZcYN+KqDkrkv9jNvUgqgwI62OldS9OitTiBJPSh4Cj6v4WOtEOvj+Sa5
@wafer-li
wafer-li / git_reset_mtime.py
Last active July 31, 2021 10:30
Restore file last modified time in a newly clone repo.Which base on the file's last commited time. Tested with python 3.4 and above
# -*- coding: utf-8 -*-
import subprocess
import os
import shlex
if __name__ != '__main__':
raise ImportError("%s should not be used as a module." % __name__)
# 'git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ct {}" {} | sort'