Skip to content

Instantly share code, notes, and snippets.

View twiceyuan's full-sized avatar

twiceYuan twiceyuan

View GitHub Profile
@twiceyuan
twiceyuan / libs.versions.toml
Last active January 17, 2024 06:19
[常用三方库定义 VersionCatalog] #Gradle #Pinned
# Library 定义
[libraries]
# AndroidX 系列
androidx-core = "androidx.core:core:1.8.0"
androidx-legacy = "androidx.legacy:legacy-support-v4:1.0.0"
androidx-fragment = "androidx.fragment:fragment-ktx:1.3.6"
androidx-appcompat = "androidx.appcompat:appcompat:1.3.1"
androidx-recyclerview = "androidx.recyclerview:recyclerview:1.2.1"
androidx-transition = "androidx.transition:transition:1.4.1"
@twiceyuan
twiceyuan / ByteBufferSource.kt
Created December 24, 2023 15:58
[ByteBufferSource] 直接接收 ByteArray 作为数据来源的 okio Source 实现 #Kotlin #Okio
/**
* 直接接收 ByteArray 作为数据来源的 okio Source 实现
*/
class ByteBufferSource : Source {
private val buffer = Buffer()
private val queue: BlockingQueue<ByteArray> = ArrayBlockingQueue(1024)
private val isClosed = AtomicBoolean(false)
fun onDataReceived(data: ByteArray) {
queue.put(data)
@twiceyuan
twiceyuan / init.gradle.kts
Created July 3, 2023 02:08 — forked from bennyhuo/init.gradle.kts
How to config mirrors for repositories in Gradle without changing the source code of your project?
fun RepositoryHandler.enableMirror() {
all {
if (this is MavenArtifactRepository) {
val originalUrl = this.url.toString().removeSuffix("/")
urlMappings[originalUrl]?.let {
logger.lifecycle("Repository[$url] is mirrored to $it")
this.setUrl(it)
}
}
}
@twiceyuan
twiceyuan / note.md
Created August 1, 2018 08:12
[Jenkins 远程构建 403 问题] #Jenkin

在开启用户鉴权后使用 GitLab 的 WebHook 来触发 Jenkins 构建时,test 请求就会提示 403 鉴权错误,网上搜索了一波资料,大多都是提示修改一些安全设置或者开启匿名用户的 job read 权限。开启 job 的 read 权限后副作用是任何人都可以查看你在 jenkins server 上的构建任务,这对于位于公网上的 jenkins 实例无疑是不安全的,最后发现最佳的实践方式是通过 Jenkins 的 token 来完成鉴权并向 trigger 的 url 发送请求。步骤如下:

  1. 首先获取 Jenkins 用户的 Application ID 和 token。使用一个有效账户登录 Jenkins,然后在左侧边栏中进入 People,选择自己的账户,再点击右侧 Configure,在右部面板找到 API Token 这一栏,点击 Show API Token 即可查看当前用户的 Application ID 和 Token,同时也可以在这里重置 Token。
  2. 获取请求地址,在 Job 的 configure 界面,勾选 Build Triggers 下的 Trigger builds remotely,token 自己填写一个,然后得到地址 JENKINS_URL/job/JOB_NAME/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME
  3. 在需要继承系统的 WebHook 中填写该 URL,在 host 前面加上 [Application ID]:[Token]@,比如 https://myid:mytoken@myjenkins.com/job/myJobName/build?token=my_job_token
@twiceyuan
twiceyuan / note.md
Created November 4, 2021 09:32
[重启 macOS 音频服务] #macOS
sudo kill -9 `ps ax|grep 'coreaudio[a-z]' | awk '{print $1}'`

经常遇到 macOS 在 Zoom 或者飞书语音时连着的 AirPods 怎么都没办法用,重启下音频服务就行了。

垃圾苹果

@twiceyuan
twiceyuan / note.groovy
Last active July 11, 2021 01:11
[Gradle 配置 上传 source.jar] #Gradle
// build a jar with source files
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
archiveClassifier.set('sources')
}
task javadoc(type: Javadoc) {
failOnError false
source = android.sourceSets.main.java.sourceFiles
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
@twiceyuan
twiceyuan / PyRequestManager.java
Last active February 10, 2021 04:16
[Chain Demo Code] 模拟 OkHttp 中 Interceptor 的工作原理 #Java #Pattern
import java.util.ArrayList;
import java.util.List;
/**
* Created by twiceYuan on 2017/7/20.
* 参考 Python Decorator 重写后的版本
*/
public class PyRequestManager {
public static void main(String args[]) {
@twiceyuan
twiceyuan / ss-rules-guide.md
Last active October 11, 2020 17:15
SS Rules 使用说明

准备工作

  1. 建议先升级到 shadowsocks 最新版(3.3.1)
  2. 设备已 root

开始

  1. 进入之后会要求 root 授权,第一次询问可能慢一些。
  2. 然后进入的是规则列表。如果没有显示到任何文件,说明机型或者 ss 版本没有适配好,可以反馈邮箱 twiceyuan.app@gmail.com
  3. 如果点进去一个规则可以看到规则的内容(很多行),代表该应用是可以正常工作的。这时可以关掉了。
@twiceyuan
twiceyuan / SingleLiveEvent.kt
Last active October 27, 2019 16:51 — forked from hadilq/SingleLiveEvent.kt
[单次事件的 LiveData] #Android
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val observers = CopyOnWriteArraySet<ObserverWrapper<T>>()
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
val wrapper = ObserverWrapper(observer)
observers.add(wrapper)
super.observe(owner, wrapper)
}
@twiceyuan
twiceyuan / note.kt
Created August 30, 2019 09:12
[键盘显示隐藏监听] #Android
class KeyboardVisibilityListener(
private val activity: Activity,
private val rootLayout: ViewGroup,
private val listener: (isShow: Boolean) -> Unit
) {
private val keyboardLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
val heightDiff = rootLayout.rootView.height - rootLayout.height
val contentViewTop = activity.window.findViewById<View>(ID_ANDROID_CONTENT).top
listener(heightDiff > contentViewTop)
}