Skip to content

Instantly share code, notes, and snippets.

View FrancescoJo's full-sized avatar
🤒
Out sick

Hwan Jo FrancescoJo

🤒
Out sick
View GitHub Profile
@FrancescoJo
FrancescoJo / fancy-console.js
Created August 2, 2019 14:25
Facebook "STOP!" code for Google chrome
console.log("%cGood to go!", "font: 2em roboto; color: yellow; background-color: green;");
@FrancescoJo
FrancescoJo / example.jsh
Created January 18, 2022 05:41
Run jshell as script engine
//usr/bin/env jshell --show-version "$0" "$@"; exit $?
public class Runner {
public static void main(final String[] args) {
System.out.println("Runner#main");
}
}
System.out.println("Executing class");
Runner.main(new String[0]);
@FrancescoJo
FrancescoJo / SecureSharedPreferences.kt
Last active March 17, 2022 05:32
A SharedPreferences wrapper implementation with encryption/decryption, using CipherHelper implementation.
import android.content.SharedPreferences
/**
* A [android.content.SharedPreferences] wrapper that helps easy reading/writing values.
*
* @author Francesco Jo(nimbusob@gmail.com)
* @since 22 - Mar - 2018
*/
class SecureSharedPreferences(private val sharedPref: SharedPreferences) {
fun contains(key: String) = sharedPref.contains(key)
@FrancescoJo
FrancescoJo / CustomBeanConfig.kt
Created May 26, 2022 12:31
Spring Framework Custom annotation as Bean loader
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.factory.support.BeanDefinitionRegistry
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
import org.springframework.context.annotation.Configuration
import org.springframework.core.type.filter.AnnotationTypeFilter
@Configuration
class AnnotationConfig : BeanDefinitionRegistryPostProcessor {
override fun postProcessBeanFactory(beanFactory: ConfigurableListableBeanFactory) {
@FrancescoJo
FrancescoJo / codegen.kt
Last active August 2, 2022 02:04
Are there a spring RestController based codegen like this?
// given:
interface SomeController {
@RequestMapping(GET, "/someApi")
fun someApi(): Response1
}
@RestController
class SomeControllerImpl : SomeController {
override fun someApi1(): Response1 {
// ...
@FrancescoJo
FrancescoJo / AndroidAESCipherHelper.kt
Last active December 3, 2022 20:18
Android AES cipher helper with system generated key. No more static final String key in our class - an approach which is very vulnerable to reverse engineering attack. Available only API Level 23(M)+
import android.annotation.TargetApi
import android.os.Build
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import android.util.Base64
import timber.log.Timber
import java.security.GeneralSecurityException
import java.security.KeyStore
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
@FrancescoJo
FrancescoJo / SpringDIQualifierUsage.kt
Last active March 31, 2023 08:54
How can we avoid DI error in this scenario without any annotations such as @primary, @qualifier, @resource?
@Repository(UserReadonlyRepository.NAME)
interface UserReadonlyRepository {
suspend fun findById(userId: UUID): User?
companion object {
const val NAME = "a.b.c.UserReadonlyRepository"
}
}
@Repository(UserRepository.NAME)
@FrancescoJo
FrancescoJo / AndroidRsaCipherHelper.kt
Last active July 5, 2023 03:08
Android RSA cipher helper with system generated key. No more static final String key in our class - an approach which is very vulnerable to reverse engineering attack.
import android.os.Build
import android.security.KeyPairGeneratorSpec
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import android.util.Base64
import timber.log.Timber
import java.math.BigInteger
import java.security.GeneralSecurityException
import java.security.KeyPairGenerator
import java.security.KeyStore
@FrancescoJo
FrancescoJo / JPA_ERRORS.kt
Last active November 16, 2023 02:35
Hibernate error while upgrading Spring boot 2.7 to 3.0(Hibernate 5.x to 6.1)
// UserEntity.kt
@Entity
@Table(name = "users")
class UserEntity(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
val id: Long = 0L,
@Column(name = "isDeleted")
var isDeleted: Boolean = false,