Todo lo que necesitas saber sobre tecnología

Etiqueta: GitHub

El arsenal de Android: historias de usuarios

Você pode ler em português (https://github.com/welbert6/MaterialStoryView/edit/master/ReadmePT.md) Capturas de pantalla Introducción MaterialStoryView es una biblioteca de Android para implementar un carrusel de historias, similar a las que se encuentran en redes sociales como Instagram y Facebook. . Esta biblioteca facilita la adición de un componente de visualización de historias a su aplicación de Android, lo que permite una integración rápida y sencilla. ✅ Guarda la historia como se ve en SharedPreferences: garantiza que los usuarios no vean repetidamente la misma historia, lo que mejora la experiencia del usuario. ✅ Botón de acción en la historia: permite interacciones directas, como visitar un enlace o realizar una acción específica, directamente desde la historia. ✅ Navegación entre historias tocando en el lado derecho e izquierdo de la pantalla: Facilita la navegación por las historias, permitiendo a los usuarios avanzar o retroceder con un simple toque. ✅ Admite RTL y LTR: se adapta a usuarios de idiomas que se leen de derecha a izquierda (RTL) y de izquierda a derecha (LTR), lo que garantiza una experiencia de usuario global e inclusiva. ✅ Admite historias con y sin títulos: ofrece flexibilidad para mostrar historias tanto con títulos para contexto como sin títulos para un diseño más limpio. ✅ Personalización 100%: permite una personalización completa de la apariencia de la historia, incluida la duración, el color del indicador, el tamaño del radio de la imagen, el color del texto, etc., para que coincida perfectamente con la identidad visual de su aplicación. Configuración 1. Agregue la dependencia de gradle. Agregue el repositorio JitPack a su build.gradle raíz al final de los repositorios: allprojects { repositories { … maven { url ‘https://jitpack.io’ } } } Agregue la dependencia: dependencies { implementación ‘com.github.welbert6:MaterialStoryView:1.0.0’ } 2. Uso Agregue CarouselStoryView a su diseño XML:
Inicialice y configure CarouselStoryView en su actividad: val carrosselStoryView: CarouselStoryView = findViewById(R.id.carouselStoryView) //Asegúrese de llamar a init With Activity para iniciar lib carrosselStoryView.initWithActivity(this) // Puede agregarStory o addStories si tiene una lista de historias carrosselStoryView.addStory(getCopasaStories()) carrosselStoryView.addStory(getCemigStories()) carrosselStoryView.addStory(getCminStories()) carrosselStoryView.addStories(getModelStorys()) Personalización MaterialStoryView ofrece varias opciones de personalización a través de atributos XML, permitiendo modificaciones de: Texto tamaño y color Colores de los indicadores de historias visitadas y pendientes Radio de la imagen de la historia Ancho del indicador del elemento de la historia Duración de la historia Para obtener más detalles sobre las opciones de personalización, consulte las opciones disponibles en la sección de atributos XML declarables. miniStoryTextSize (Tamaño del texto de la mini historia): establece el tamaño del texto de los subtítulos de la mini historia, lo que permite personalizar la escala del texto para una mejor legibilidad. miniStoryTextColor (Color del texto de la mini historia): especifica el color del texto para los subtítulos de la mini historia, ofreciendo la posibilidad de hacer coincidir el color del texto con el tema de la aplicación. miniStoryTextFont (fuente de texto para mini historias): permite configurar la fuente del texto para mini historias a través de una referencia, lo que permite personalizar la tipografía para alinearla con la identidad visual. miniStoryVisitedIndicatorColor (Color del indicador de minihistoria visitada): define el color del indicador de las historias que ha visto el usuario, lo que ayuda a distinguir entre contenido nuevo y revisado. miniStoryPendingIndicatorColor (Color indicador pendiente de mini historia): Especifica el color del indicador para las historias que aún no han sido vistas, facilitando la identificación de contenido nuevo. miniStoryImageRadius (Radio de imagen de mini historia): determina el radio de las imágenes en mini historias, lo que permite redondear las esquinas de las imágenes para una apariencia más suave. miniStorySpaceBetweenImageAndIndicator (Espacio entre la imagen de la mini historia y el indicador): establece el espacio Créditos/StoriesProgressView: esta biblioteca se utilizó para mostrar el progreso de las historias desarrolladas por Welbert Moreira. No dudes en contribuir con mejoras, correcciones de errores o nuevas funciones. ¡Tu contribución es bienvenida! Licencia Licencia MIT Copyright (c) 2024 Welbert Moreira Por el presente se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el «Software») para operar con el Software sin restricciones, incluidas, entre otras, los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y de permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones: El aviso de derechos de autor anterior y este aviso de permiso se incluirá en todas las copias o partes sustanciales del Software. EL SOFTWARE SE PROPORCIONA «TAL CUAL», SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.

Source link

El arsenal de Android: redes

Biblioteca de Android NetworkStateObserver Una biblioteca que le ayuda a verificar el estado de su red, si está disponible, perdida o no disponible y también verificar la accesibilidad de su red cuando su servidor no funciona o su ISP está conectado pero no tiene suscripción de datos. Demostración: 1. Agregar NetworkStateObserver a su proyecto Incluya jitpack en su archivo raíz settings.gradle. pluginManagement { repositorios { … maven { url ‘https://jitpack.io’ } } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositorios { … maven { url ‘https://jitpack.io’ } } } Y agregue su dependencia al archivo build.gradle a nivel de aplicación: dependencias { implementación ‘com.github.RhymezxCode:NetworkStateObserver:1.1.3’ //Implementación de Livedata ‘androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0’ implementación ‘androidx.lifecycle:lifecycle-livedata-core-ktx:2.7.0’ implementación ‘androidx.lifecycle:lifecycle-runtime-ktx:2.7.0’ implementación ‘android.arch.lifecycle:extensions:1.1.1’ } Sincronización tu proyecto, y ???? auge???? ha agregado NetworkStateObserver con éxito. ❗ 2. Uso Primero inicialice la clase de constructor: val network = NetworkStateObserver.Builder() .activity(activity = this@NetworkStateObserverExample) .build() Si solo desea verificar la conectividad, antes de realizar una tarea o trabajo(): if (CheckConnectivity.isNetworkAvailable(requireContext())){ showToast( this@NetworkStateObserverExample, «Red restaurada») } Utilice el método de datos en vivo para determinar el estado de su red y reemplace el código en lifecycleScope.launchWhenStarted { ….your codifique aquí } para hacer lo que quiera: network.callNetworkConnection().observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasServerConnected( contexto = this@NetworkStateObserverExample, serverUrl = «https://www.your-server-url.com» ) -> lifecycleScope.launch{ showToast( «La URL del servidor funciona») } Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launch{ showToast( «Red restaurada» ) } else -> lifecycleScope.launch{ showToast( «La red se perdió o hay problemas con el servidor») } } } else { //verificar si hay conexión perdida lifecycleScope.launch{ showToast( «Sin conexión de red») } } } } } Utilice el método de flujo para determinar el estado de su red y también vuelva a intentarlo cuando se produzca una excepción: lifecycleScope.launch { network.callNetworkConnectionFlow() .observe() .collect { when (it) { NetworkObserver.Status.Available -> { lifecycleScope.launch { cuando { Reachability.hasServerConnectedFlow( contexto = this@NetworkStateObserverExample, serverUrl = «https://www.github.com» ).retryWhen { causa, intento -> si (la causa es IOException && intento < 3) { delay(2000) return@retryWhen true } else { return@retryWhen false } }.buffer().first() -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «La URL del servidor funciona») } Reachability.hasInternetConnectedFlow( contexto = this@NetworkStateObserverExample ).retryWhen { causa, intento -> si (la causa es IOException && intento < 3) { delay(2000) return@retryWhen true } else { return@retryWhen false } }.buffer().first() -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «Red restaurada») } else -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «La red se perdió o hay problemas con el servidor») } } } } NetworkObserver.Status.Unavailable -> { showToast( «¡La red no está disponible!» ) } NetworkObserver.Status.Losing -> { showToast( «¡Estás perdiendo tu red!» ) } NetworkObserver.Status.Lost -> { showToast( «¡La red está perdida!» ) } } } } Puede verificar si su conexión a Internet es estable solo si no tiene una URL de servidor: network.callNetworkConnection().observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launchW{ showToast( «Red restaurada») } else -> lifecycleScope.launch{ showToast( «La red se pierde o hay problemas con el servidor») } } } else { //comprueba si hay conexión perdida lifecycleScope.launch{ showToast( «Sin conexión de red») } } } } } 3. También puedes inyectar NetworkStateObserver y usarlo en todas partes de tu aplicación con Hilt ???? : Cree un objeto para NetworkStateModule en su paquete di: @Module @InstallIn(ActivityComponent::class) object NetworkStateModule { @Provides fun provideNetworkStateObserver( actividad: Actividad ): NetworkStateObserver { return NetworkStateObserver.Builder() .actividad(actividad = actividad) .build() } } Declara la variable en tu clase como fragmento o actividad, funciona en ambos: @AndroidEntryPoint clase myFragment : Fragment(){ @Inject lateinit var network: NetworkStateObserver private fun callNetworkConnection() { network.callNetworkConnection() .observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launch{ showToast( «Red restaurada») } else -> lifecycleScope.launch{ showToast( «La red se perdió o hay problemas con el servidor») } } } else { //verificar si hay conexión perdida lifecycleScope.launch{ showToast( «No hay conexión de red» ) } } } } } } anular diversión enResume () { super.onResume() callNetworkConnection() } } Agrega el método en onResume() de tu fragmento o actividad para tener una gran experiencia: override fun onResume() { super.onResume() callNetworkConnection() } ???? Por favor, no dudes en regalarme una estrella ????, también me encantan los destellos ✨ ☺️

Source link

El arsenal de Android: notificaciones push/pull

Actualice el estado de la interfaz de usuario de sus aplicaciones de Android e iOS en tiempo de ejecución. Motivación Actualizar el estado de la interfaz de usuario en tiempo de ejecución es una herramienta muy útil para fines de validación y creación rápida de prototipos. También agrega el beneficio de que puede ser utilizado por todo el equipo de pruebas, ya sean desarrolladores, diseñadores, control de calidad, etc. demo.mov ¿Cómo funciona? Android Android Debug Bridge (ABD) se utiliza para enviar una señal de transmisión al aplicación deseada con una carga útil json como extra. adb shell estoy transmitiendo -p [package] -a [action] -mi [extra key] [extra value]

En el lado de la aplicación hay un BroadcastReceiver que escucha estas cargas útiles. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores y/o dispositivos físicos (incluso con depuración wifi) conectados. iOS Las herramientas de desarrollo Xcode de Apple proporcionan una herramienta de línea de comandos para interactuar con el simulador de iOS. Esta herramienta le permite simular el proceso de envío de notificaciones automáticas a un dispositivo: xcrun simctl push [UDID] [bundle id] [path to .apns]

En el lado de la aplicación hay un NotificationBroadcaster que monitorea activamente las notificaciones entrantes. Luego, estas notificaciones se transmiten a los observadores internos dentro de la aplicación. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores arrancados. Instalación Android Agregue la dependencia de la biblioteca: implementación(«com.github.guilhe:json-broadcast-handler:${LATEST_VERSION}'») Administrador de paquetes Swift Las implementaciones de Swift están disponibles a través del Administrador de paquetes Swift. En Xcode, vaya a Archivo > Agregar paquetes… y proporcione la URL https://github.com/GuilhE/JsonBroadcaster.git; Utilice el hash de confirmación de la última etiqueta JsonBroadcasterHandler-x. CocoaPods Si usa CocoaPods, agregue lo siguiente a su Podfile: pod ‘JsonBroadcasterHandler’, :git => ‘https://github.com/GuilhE/JsonBroadcaster.git’, :tag => ‘JsonBroadcasterHandler-x’ Uso: desarrolladores Android Sus clases UiState deben estar anotadas con kotlinx.serialization.Serializable (dependencia): @Serializable data class UiState(val memberA: String, val memberB: String) Cree una implementación BroadcastUiModelHost para escuchar las actualizaciones de estado, como se muestra a continuación: host val privado = objeto: BroadcastUiModelHost(coroutineScope, UiState.serializer()) { override fun updateState(new: UiState) { //… } } Agréguelo donde mejor se adapte a su proyecto, ejemplos: si está utilizando androidx.lifecycle.ViewModel, puede hacerlo lo siguiente: clase MatchViewModel : ViewModel() { valor privado _uiState = MutableStateFlow(MatchUiState(home = Team(«PRT», «?????????»), away = Team(«BRA», «??? ?????»))) val uiState: StateFlow = _uiState host val privado = objeto: BroadcastUiModelHost(viewModelScope, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { _uiState.update { new } } } } Pero en realidad no necesitas un ViewModel, simplemente puedes usar un @Composable, por ejemplo: @Composable divertido MatchScreen() { var uiState: MatchUiState por recordar { mutableStateOf(MatchUiState(casa = Equipo(«PRT», «?????????»), lejos = Equipo(«BRA», «????? ???»))) } LaunchedEffect(Unidad) { val host = objeto: BroadcastUiModelHost(this, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { uiState = new } } } Match(uiState) } Y lo bueno de esto es que puedes elegir lo que más te convenga: ViewModel, @Composable, Actividad, Fragmento, etc. Para deshabilitarlo, por ejemplo en compilaciones de lanzamiento, anule la declaración del receptor en AndroidManifest agregando una propiedad manifestPlaceholders en build.gradle: android { buildTypes { getByName(«release») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = falso } getByName(«depurar») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = verdadero } } }



iOS Sus clases UiState deben implementar el protocolo Codable: struct UiState: Codable { let memberA: String let memberB: String } Cree una instancia BroadcastUIModelHost dentro de una clase para escuchar las actualizaciones de estado, como se muestra a continuación: var privada uiModelHost: BroadcastUIModelHost! init() { uiModelHost = BroadcastUIModelHost(initState) { [weak self] newState en //… } } Agréguelo donde mejor se ajuste a su proyecto, ejemplo: Si está utilizando un ObservableObject, puede hacer lo siguiente: import SwiftUI import JsonBroadcasterHandler class MatchViewModel: ObservableObject { private var uiModelHost: BroadcastUIModelHost! @Estado var publicado: MatchUiState = MatchUiState(local: Equipo(país:»PRT», bandera:»?????????»), visitante: Equipo(país:»BRA», bandera:»???? ????»)) init() { uiModelHost = BroadcastUIModelHost(estado) { [weak self] newState in self?.state = newState } } } Y lo bueno de esto es que puedes elegir lo que más te convenga, SwiftUI o UIKit: struct MatchScreen: View { @StateObject private var viewModel = MatchViewModel() var body: some View { ZStack { } .onReceive(viewModel.$state) { nuevo en //… } } clase MatchScreen: UIViewController { var privada viewModel: MatchViewModel! cancelables var privados = Establecer() anular la función viewDidLoad() { super.viewDidLoad() viewModel = MatchViewModel() viewModel.$state .receive(on: DispatchQueue.main) .sink { [weak self] state in self?.updateUI(with: state) } .store(in: &cancellables) } función privada updateUI(with state: MatchUiState) { //… } } Dentro de su AppDelegate regístrese para RemoteNotifications y reenvíelos con NotificationBroadcaster: importar UIKit importar JsonBroadcasterHandler clase AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func aplicación(_ aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = self application.registerForRemoteNotifications() devuelve verdadero } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { NotificationBroadcaster .broadcast(notification) } } consejo: puede crear indicadores personalizados del compilador, DEBUG_MODE, para encapsular NotificationBroadcaster: func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { #if DEBUG_MODE NotificationBroadcaster.broadcast(notificación) #endif } Uso: equipo de pruebas Android El SDK de Android de Google debe estar instalado para poder utilizar herramientas de línea de comandos; Solicite una versión instalada de la aplicación (depuración wifi o cable conectado); Utilice la GUI de la aplicación de escritorio. Se debe instalar XCode de iOS Apple para poder utilizar herramientas de línea de comandos; Abra XCode y ejecute un simulador con la aplicación; Utilice la GUI de la aplicación de escritorio. Aplicación de escritorio Aunque podemos usar la terminal para enviar comandos, no es práctico. La aplicación de escritorio proporciona una interfaz de usuario sencilla para ayudarnos con esa tarea. Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :desktopApp:run en la terminal. Descargue un .dmg (solo MacOS) e instálelo. Consiguelo aqui. nota: por razones de seguridad, dado que esta aplicación no es de un Desarrollador Identificado, MacOS bloqueará su ejecución. Para evitarlo, deberá hacer clic en «Abrir de todos modos» en Configuración del sistema en Seguridad. Solo es necesario una vez: (Esto no sucederá con el primer enfoque) Patios de juegos Utilice la siguiente carga útil para comenzar: { «home»:{ «country»:»PRT», «flag»:»??????? ?» }, «lejos»:{ «país»:»BRA», «bandera»:»????????? }, «homeGoals»:0, «awayGoals»:0, «started»: false, «running»: false, «finished»: false } Android Dentro del módulo de muestra encontrarás una aplicación de juegos lista para que la pruebes . Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :androidApp:installDebug en la terminal. Descargue el .apk de muestra e instálelo. Consiguelo aqui. El ID de aplicación es com.jsonbroadcaster.matchday iOS. Dentro de la carpeta sample-ios encontrará una aplicación de juegos lista para que la pruebe. Para ejecutarlo: ábralo en Xcode y ejecute la configuración estándar. Importe JsonBroadcaster utilizando el método que prefiera. LICENCIA Copyright (c) 2022-presente GuilhE Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android – Base de datos

Un marco de almacenamiento de objetos modular para proyectos multiplataforma de Kotlin. Uso ObjectStore proporciona una interfaz de almacenamiento de clave/valor simple que, de forma predeterminada, utiliza detalles de tipo para derivar la clave automáticamente. Para crear un ObjectStore necesita dos cosas: ObjectStoreWriter: proporciona el mecanismo de persistencia para almacenar datos para acceso posterior. ObjectStoreSerializer: proporciona el mecanismo de serialización para transformar objetos para su almacenamiento. val store = ObjectStore( storeWriter = SharedPreferencesStoreWriter(«prefs», context), storeSerializer = JsonStoreSerializer() ) // Almacenar un objeto store.put(User(«username», «email», …)) // Obtener un objeto o usuario de valor nulo: ¿Usuario? = tienda.getOrNull() // Obtener un objeto o lanzar val usuario: Usuario = store.get() // Obtener un objeto o valor predeterminado usuario: Usuario = store.get(default = Usuario(…)) // Obtener un valor StateFlow userFlow: StateFlow = tienda.getFlow() // Se emitirán llamadas para `poner` nuevos objetos de usuario userFlow.collect { println(it) } // Obtener todas las claves store.keys() // Eliminar un objeto store.remove() // Eliminar todos los objetos store.clear() Al almacenar tipos básicos como String, Boolean, etc., debe proporcionar una clave para el registro. store.put(false, clave = «mi_clave») store.get(predeterminado = falso, clave = «my_key») NOTA: Cuando se apunta a Javascript, todas las clases utilizadas con ObjectStore deben estar anotadas con @Serializable. Esto se usa para derivar claves basadas en nombres de parámetros y clases; otras plataformas no usan la biblioteca Kotlinx.serialization en objectstore-core. Serializadores Para convertir objetos en datos adecuados para el almacenamiento se requiere una implementación de ObjectStoreSerializer. Los siguientes módulos proporcionan capacidades de serialización utilizando el módulo Kotlinx.serialization correspondiente. objectstore-cbor: CborStoreSerializer() objectstore-json: JsonStoreSerializer() objectstore-protobuf: Escritores ProtoBufStoreSerializer() El almacenamiento de datos de objetos requiere una implementación de ObjectStoreWriter. Los siguientes escritores se proporcionan en el módulo objectstore-core: Android: SharedPreferencesStoreWriter(«prefs_name», context) iOS/macOS/tvOS/watchOS: UserDefaultsStoreWriter() Navegador JS: LocalStorageStoreWriter() Todos: InMemoryStoreWriter() File Writer The objectstore-fs proporciona almacenamiento basado en archivos usando okio. Todos los destinos son compatibles excepto iosArm32 y jsBrowser. val store = ObjectStore( storeWriter = FileStoreWriter(«/storage-directory») ) La ruta proporcionada no debe existir o ser un directorio existente donde se puedan almacenar archivos. Cada valor se almacenará en un archivo separado utilizando la clave codificada en hexadecimal como nombre de archivo. Escritores seguros Para almacenar datos de forma segura, el módulo objectstore-secure proporciona escritores que cifran los datos cuando se almacenan en el disco. iOS/macOS/tvOS/watchOS: KeychainStoreWritre(«com.service.name», «com.service.group») Android: EncryptedSharedPreferencesStoreWriter(«prefs_name», context) Escritores envueltos ValueTransformingStoreWriter proporciona un enlace para codificar/decodificar valores antes de que se escriben en el disco. Los métodos de transformación se definen como (tipo: KType, valor: T) -> T, cuando no se controlan debe devolver el valor original. val storeWriter = InMemoryStoreWriter().transformValue( transformGet = { _, valor -> (valor como? Cadena)?.base64Decoded() ?: valor }, transformSet = { _, valor -> (valor como? Cadena)?.base64Encoded () ?: valor } ) MemCachedStoreWriter proporciona almacenamiento en caché diferido en memoria alrededor de cualquier implementación de ObjectStoreWriter. val storeWriter = FileStoreWriter(«/data»).memCached() Descargar repositorios { mavenCentral() // O instantáneas maven(«https://s01.oss.sonatype.org/content/repositories/snapshots/») } dependencias { implementación(«org.drewcarlson:objectstore-core:$VERSION») // Serializadores implementación(«org.drewcarlson:objectstore-cbor:$VERSION») implementación(«org.drewcarlson:objectstore-json:$VERSION») implementación( «org.drewcarlson:objectstore-protobuf:$VERSION») // Implementación de escritores(«org.drewcarlson:objectstore-fs:$VERSION») implementación(«org.drewcarlson:objectstore-secure:$VERSION») } Toml (Haga clic expandir) [versions]
almacén de objetos = «1.0.0-INSTANTÁNEA»

[libraries]
objectstore-core = { module = «org.drewcarlson:objectstore-core», version.ref = «objectstore» } objectstore-fs = { module = «org.drewcarlson:objectstore-fs», version.ref = «objectstore» } objectstore-cbor = { module = «org.drewcarlson:objectstore-cbor», version.ref = «objectstore» } objectstore-json = { module = «org.drewcarlson:objectstore-json», version.ref = «objectstore» } objectstore-protobuf = { module = «org.drewcarlson:objectstore-protobuf», version.ref = «objectstore» } objectstore-secure = { module = «org.drewcarlson:objectstore-secure», version.ref = «objectstore» } Licencia Este proyecto tiene la licencia Apache-2.0, que se encuentra en LICENCIA.

Source link

El arsenal de Android: procesamiento de imágenes

Una biblioteca de Android para aplicar 62 (se agregarán más) filtros LUT fáciles, rápidos y efectivos a las fotos. Con RenderScript, el objetivo es procesar los espacios de color en la LUT y aplicarlos a la imagen en forma de filtro. ¿Qué es LUT? La traducción directa de LUT («Tabla de búsqueda») del inglés significa «tabla de búsqueda». En informática, significa datos donde se asignan y calculan los valores de entrada (entrada) y los valores de salida (salida). Instalación inicial Gradle Agregue los siguientes códigos a su archivo raíz build.gradle (no al archivo build.gradle de su módulo). allprojects { repositories { maven { url ‘https://jitpack.io’ } } } Y agregue un código de dependencia al archivo build.gradle de su módulo. dependencias { implementación ‘com.github.zekierciyas:FancyFilter:Tag’ } Uso La biblioteca Fancy Filter, que es rápida y fácil de usar, generalmente incluye un patrón de construcción simple. Se basa en proporcionar los parámetros necesarios y obtener la imagen filtrada en tipo mapa de bits. FancyFilter.Builder() .withContext(this) .filter(FancyFilters.NO_1) .bitmap(bitmap) .applyFilter { bitmap -> // Obteniendo el mapa de bits filtrado aquí } Copyright 2022 github/zekierciyas (Zeki Erciyas) Con licencia Apache , Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android – Vistas

¡Una biblioteca de Android ligera con animaciones emergentes! Fácil de usar Tamaño pequeño Altamente personalizable Primeros pasos Para usar esta biblioteca en su proyecto, agregue la siguiente dependencia a su archivo build.gradle: allprojects { repositories { … maven { url ‘https://jitpack.io’ } } } dependencias { implementación ‘com.github.gold24park:PopcornView:release-1.0.2’ } Uso Agregue PopcornView a su archivo XML de diseño:
O configure las propiedades de las palomitas de maíz e inicie la animación mediante programación: val popcornView = findViewById(R.id.popcornView) val forma = PopcornShape.DrawableShape( tamaño = 100F, dibujable = ContextCompat.getDrawable(context, R.drawable.popcorn)!!, ) popcornView.start( forma = forma, cantidad = 40, intervalo = 10, ) gravedad: La aceleración debida a la gravedad en píxeles por segundo al cuadrado. (Predeterminado: 0.37F) minVelocity: La velocidad mínima de las palomitas de maíz en píxeles por segundo. (Predeterminado: 20) maxVelocity: La velocidad máxima de las palomitas de maíz en píxeles por segundo. (Predeterminado: 40) angleRangeStart: el ángulo mínimo de lanzamiento de las palomitas de maíz en grados. (Predeterminado: 45) angleRangeEnd: El ángulo máximo de lanzamiento de las palomitas de maíz en grados. (Predeterminado: 135) elasticidad: La elasticidad de las colisiones entre las palomitas de maíz y las paredes. (Predeterminado: 0.6F) fricción: El coeficiente de fricción de las palomitas de maíz en las paredes. (Predeterminado: 0.39F) ttl: El tiempo de vida de las palomitas de maíz en milisegundos. (Predeterminado: 30,000L) desvanecimiento: si las palomitas de maíz deben desvanecerse antes de desaparecer. (Valor predeterminado: verdadero) Personalizar formas con PopcornShape TextShape TextShape representa una forma que se dibuja como texto. Tiene las siguientes propiedades: val forma = PopcornShape.TextShape( tamaño = 100F, texto = «Pop!», textColor = ContextCompat.getColor(this, R.color.amarillo) ) tamaño (obligatorio): El tamaño del texto a ser dibujado. texto (obligatorio): El texto que se va a dibujar. textColor (opcional): el color del texto que se va a dibujar. (Predeterminado: Color.NEGRO). DrawableShape val shape = PopcornShape.DrawableShape( size = 100F, drawable = ContextCompat.getDrawable(this, R.drawable.popcorn)!!, ) DrawableShape representa una forma que se dibuja como un elemento de diseño. Tiene las siguientes propiedades: tamaño (obligatorio): El tamaño del elemento de diseño que se va a dibujar. dibujable (obligatorio): El dibujable que se va a dibujar. Configuración de la posición para hacer estallar Puede especificar la posición desde donde se generarán las palomitas de maíz en el método start(). PopcornView.start(…startX: Float, startY): genera palomitas de maíz a partir de las coordenadas (startX, startY). Alternativamente, puede usar StartPosition: StartPosition StartPosition( xAxis: XAxisPosition.CENTER, yAxis: YAxisPosition.CENTER,) xAxis: XAxisPosition.LEFT | XAxisPosition.CENTRO | XAxisPosition.RIGHT Eje y: YAxisPosition.TOP | YAxisPosition.CENTRO | YAxisPosition.BOTTOM Contribuir Le invitamos a contribuir a este proyecto. Si encuentra algún error, tiene alguna solicitud o sugerencia de función, o simplemente desea mejorar el código, no dude en abrir un problema o enviar una solicitud de extracción. Se agradecen mucho sus contribuciones. Licencia Este proyecto tiene licencia según los términos de la licencia MIT. Consulte LICENCIA para obtener más información.

Source link

Informe de tendencias de código abierto y nuevos productos de seguridad de IA

GitHub Advanced Security obtiene funciones de IA y GitHub Copilot ahora incluye una opción de chatbot. Se espera que GitHub Copilot Enterprise esté disponible en febrero de 2024. Imagen: Adobe/sdx15 En la conferencia GitHub Universe celebrada en San Francisco y virtualmente los días 8 y 9 de noviembre de 2023, la compañía reveló su nuevo informe de tendencias de código abierto, así como cambios en GitHub Copilot y mejoras de IA para GitHub Advanced Security. GitHub Copilot y GitHub Advanced Security están disponibles a nivel mundial. Sin embargo, algunos servicios de GitHub, incluido Copilot, están sujetos a controles comerciales de EE. UU. y no están disponibles en los países sancionados que se enumeran aquí. Saltar a: La IA generativa es popular entre los proyectos de código abierto Los proyectos de IA generativa de código abierto se unieron a la lista de GitHub de los 10 proyectos de código abierto más populares por número de contribuyentes en 2023. En 2022, alrededor de 17.000 desarrolladores de GitHub trabajaron en proyectos de IA generativa; en 2023, esa cifra se disparó a alrededor de 60.000. Los proyectos de IA se están volviendo más comunes, dijo GitHub. Es probable que en el futuro más organizaciones comiencen a utilizar modelos de IA previamente entrenados a medida que los desarrolladores se familiaricen con ellos, predijo GitHub. Tendencias de Git hacia aplicaciones nativas de la nube a escala GitHub descubrió que los desarrolladores utilizan cada vez más el sistema de control de versiones de Git para lenguajes declarativos que utilizan infraestructura basada en Git como flujos de trabajo de código. El estudio también encontró una mayor estandarización en las implementaciones de la nube y un fuerte aumento en la velocidad a la que los desarrolladores usaban Dockerfiles y contenedores, infraestructura como código y otras tecnologías nativas de la nube. El uso del lenguaje de configuración de Hashicorp (HCL), que es un indicador de operaciones y trabajo de infraestructura como código, creció un 36 % año tras año. El número de nuevos desarrolladores en GitHub creció un 26%, y India tiene la población de desarrolladores de más rápido crecimiento. GitHub define a un desarrollador como cualquier persona con una cuenta de GitHub que no sea spam. Los proyectos de código abierto con respaldo comercial llaman la atención Los proyectos de código abierto con respaldo comercial tuvieron el mayor número de contribuciones y el mayor número de contribuyentes por primera vez. El número de proyectos privados creció un 38% año tras año. Proteger dependencias y sucursales son proyectos populares. En términos de seguridad en código abierto, cada vez más desarrolladores están recurriendo a la automatización para proteger las dependencias, y los mantenedores de código abierto están prestando mucha atención a proteger sus sucursales. El desarrollo front-end es prometedor El desarrollo front-end es un tipo de proyecto de rápido crecimiento entre los desarrolladores de código abierto. GitHub Copilot Chat y GitHub Copilot Enterprise revelados En GitHub Universe, la compañía anunció GitHub Copilot Chat (Figura A), que es un asistente de IA generativa que explica el código en lenguaje natural, y GitHub Copilot Enterprise. GitHub Copilot Chat estará disponible en diciembre de 2023 para los clientes con suscripciones a GitHub Copilot individuales o para toda la organización. Figura A GitHub Copilot Chat explica el código en lenguaje natural. Imagen: GitHub GitHub Copilot Enterprise, personalizado para uso empresarial, llegará en febrero de 2024 a un precio de 39 dólares por usuario al mes. Compare esto con Copilot Business, que cuesta $19 por mes y ya está disponible. Funciones adicionales de IA agregadas a GitHub Advanced Security Cobertura de lectura obligada para desarrolladores Tres funciones más impulsadas por IA llegarán a GitHubAdvanced Security: corrección automática de escaneo de código, escaneo de secretos en busca de secretos genéricos y un generador de expresiones regulares. VER: GitHub no es la única plataforma de colaboración y control de versiones. Consulte las alternativas de GitHub que están floreciendo en 2023. (TechRepublic) “Los desarrolladores necesitan la capacidad de proteger de forma proactiva su código justo donde se crea”, afirmó la vicepresidenta de gestión de productos de GitHub, Asha Chakrabarty, y directora de marketing de productos del laboratorio de seguridad y seguridad de la plataforma de GitHub. Laura Paine, escribió en una publicación de blog. Corrección automática del escaneo de código El escaneo de código ahora propondrá correcciones generadas por IA directamente en la solicitud de extracción, lo que permitirá a los desarrolladores corregir instantáneamente las vulnerabilidades mientras codifican; esto conducirá a un tiempo de remediación más rápido. Se pueden crear correcciones generadas por IA para alertas de CodeQL, JavaScript y TypeScript. Esto funciona cuando GitHub consulta un modelo de lenguaje grande en segundo plano para encontrar correcciones para cualquier alerta nueva, que luego se publica como sugerencias de código dentro de la solicitud de extracción. Autofix ahora está disponible para escanear códigos dentro de GitHub Advanced Security. Escaneo secreto El escaneo secreto con IA generativa, que ahora se encuentra en versión beta pública limitada, está diseñado para reducir los falsos positivos que a menudo surgen al buscar contraseñas posiblemente activas filtradas (Figura B). Figura B El escaneo secreto alerta a los usuarios sobre una contraseña que puede haber sido expuesta. Imagen: GitHub Generador de expresiones regulares El generador de expresiones regulares mejora las opciones de los desarrolladores cuando se trata de escaneo secreto, permitiéndoles crear patrones personalizados con expresiones regulares creadas con algunas consultas en lenguaje natural enviadas a la IA generativa. Está diseñado para agilizar la escritura de expresiones regulares y permite a los desarrolladores realizar ensayos en tiempo real para asegurarse de que todo funcione antes de guardar el patrón. La generación de expresiones regulares ya está disponible. Más características nuevas en GitHub Advanced Security Otras características nuevas de GitHub Advanced Security incluyen la creación de patrones personalizados con IA generativa y un nuevo panel de descripción general de seguridad. El personal de seguridad interesado puede unirse a una lista de espera para estas funciones.

Source link

La campaña EleKtra-Leak utiliza claves de nube de AWS encontradas en repositorios públicos de GitHub para ejecutar operaciones de criptominería

En la campaña activa Elektra-Leak, los atacantes buscan credenciales de Amazon IAM dentro de los repositorios públicos de GitHub antes de usarlas para la criptominería. Obtenga consejos para mitigar esta amenaza a la ciberseguridad. Imagen: WhataWin Una nueva investigación de la Unidad 42 de Palo Alto Networks expone una campaña de ataque activo en la que un actor de amenazas busca credenciales de Amazon IAM en tiempo real en repositorios de GitHub y comienza a usarlas menos de cinco minutos después. La carga útil final ejecuta software de criptominería Monero personalizado en máquinas virtuales implementadas en las instancias de Amazon. Saltar a: Credenciales de IAM expuestas en GitHub GitHub ofrece a sus usuarios muchas funciones para manejar su código dentro de la plataforma. Una de estas características consiste en proporcionar una lista de todos los repositorios públicos a cualquier usuario que la solicite, lo que ayuda a los desarrolladores a rastrear fácilmente varios desarrollos que les interesan. El seguimiento se realiza en tiempo real y permite que cualquiera, incluidos los actores de amenazas, vea nuevos repositorios. tan pronto como sean enviados a GitHub. VER: Las 8 mejores soluciones de gestión de identidad y acceso (IAM) para 2023 (TechRepublic) Los investigadores de la Unidad 42 de Palo Alto Networks informan que es posible encontrar credenciales de gestión de identidad y acceso de Amazon Web Services dentro de los repositorios públicos de GitHub y que estas credenciales se buscan activamente por los ciberdelincuentes. Para analizar el riesgo en mayor profundidad, los investigadores decidieron almacenar las credenciales de IAM en GitHub y verificar toda la actividad a su alrededor. Esa prueba de honeypot reveló que las claves de AWS filtradas que estaban codificadas en base64 y almacenadas en GitHub no fueron encontradas ni utilizadas por los actores de amenazas, que solo obtuvieron claves de AWS de texto sin cifrar ocultas detrás de una confirmación anterior en un archivo aleatorio. El honeypot permitió a los investigadores William Gamazo y Nathaniel Quist detectar una campaña de ataque particular que comenzó cinco minutos después de que se colocaron las credenciales en GitHub. Detalles técnicos sobre esta campaña de ataque La campaña, denominada EleKtra-Leak por los investigadores en referencia a la ninfa de la nube griega Electra y el uso de Lek como los primeros 3 caracteres en las contraseñas utilizadas por el actor de amenazas, ha estado activa desde al menos diciembre. 2020, según la Unidad 42. Una vez que se encuentran las credenciales de IAM, el atacante realiza una serie de acciones de reconocimiento para saber más sobre la cuenta de AWS a la que se accede (Figura A). Figura A Acciones de reconocimiento ejecutadas por el actor de amenazas en la cuenta de AWS. Imagen: Palo Alto Networks Una vez realizadas esas acciones, el actor de amenazas crea nuevos grupos de seguridad de AWS antes de lanzar varias instancias de Amazon Elastic Compute Cloud por región en cualquier región de AWS accesible. Gamazo y Quist pudieron observar más de 400 llamadas API en siete minutos, todas realizadas a través de una conexión VPN, lo que demuestra que el actor ha automatizado el ataque contra esos entornos de cuentas de AWS. Cobertura de seguridad de lectura obligada El actor de amenazas apuntó a máquinas virtuales en la nube de gran formato para realizar sus operaciones, ya que tienen mayor poder de procesamiento, que es lo que buscan los atacantes cuando ejecutan operaciones de criptominería. El actor de amenazas también eligió imágenes privadas para Amazon Machine Images; algunas de esas imágenes eran distribuciones antiguas de Linux Ubuntu, lo que llevó a los investigadores a creer que la operación se remonta al menos a 2020. El actor de amenazas también pareció bloquear cuentas de AWS que habitualmente exponen credenciales de IAM, ya que este tipo de comportamiento podría originarse en investigadores de amenazas o sistemas de honeypot. El objetivo de esta campaña de ataque: Criptominería. Una vez que se realiza todo el reconocimiento y se inician las máquinas virtuales, se entrega una carga útil, que se descarga desde Google Drive. La carga útil, cifrada en el almacenamiento de Google, se descifra al descargarla. La Unidad 42 afirma que la carga útil es una conocida herramienta de criptominería aparentemente utilizada en 2021 y reportada por Intezer, una empresa especializada en plataformas autónomas de sistemas operativos de seguridad. En la campaña de ataque reportada, Intezer indicó que un actor de amenazas había accedido a instancias de Docker expuestas en Internet para instalar software de criptominería para extraer la criptomoneda Monero. Ese software de criptominería personalizado es el mismo que se utiliza en la nueva campaña expuesta por Palo Alto Networks. El software está configurado para utilizar el grupo de minería SupportXMR. Los grupos de minería permiten que varias personas agreguen su tiempo de computación al mismo espacio de trabajo, lo que aumenta sus posibilidades de ganar más criptomonedas. Como afirmó Palo Alto Networks, el servicio SupportXMR solo proporciona estadísticas por tiempo limitado, por lo que los investigadores obtuvieron las estadísticas de minería durante varias semanas, ya que se usó la misma billetera para las operaciones de minería de AWS (Figura B). Figura B Estadísticas de SupportXMR asociadas con la billetera del actor de la amenaza. Imagen: Palo Alto Networks Entre el 30 de agosto de 2023 y el 6 de octubre de 2023, aparecieron un total de 474 mineros únicos, siendo cada uno de ellos una instancia única de Amazon EC2. Aún no es posible obtener una estimación de la ganancia financiera generada por el actor de la amenaza, ya que Monero incluye controles de privacidad que limitan el seguimiento de este tipo de datos. Medidas automatizadas de GitHub para detectar secretos GitHub escanea automáticamente en busca de secretos en los archivos almacenados en la plataforma y notifica a los proveedores de servicios sobre secretos filtrados en GitHub. Durante su investigación, Gamazo y Quist notaron los secretos que estaban almacenando intencionalmente en GitHub, ya que GitHub detectó con éxito los datos del honeypot para su investigación y los informó a Amazon, quien a su vez aplicó automáticamente en cuestión de minutos una política de cuarentena que evita que los atacantes realicen operaciones como como acceder a AWS IAM, EC2, S3, Lambda y Lightsail. Durante el proceso de investigación, la Unidad 42 dejó la política de cuarentena vigente y estudió pasivamente las pruebas de las cuentas realizadas por los atacantes; luego, se abandonó la política para estudiar toda la cadena de ataque. Los investigadores escriben que «creen que el actor de la amenaza podría encontrar claves de AWS expuestas que no se detectan automáticamente» y que, según su evidencia, los atacantes probablemente lo hicieron, ya que podían ejecutar el ataque sin ninguna política que interfiriera. También afirman que “incluso cuando GitHub y AWS están coordinados para implementar un cierto nivel de protección cuando se filtran claves de AWS, no todos los casos están cubiertos” y que otras víctimas potenciales de este actor de amenazas podrían haber sido atacadas de una manera diferente. Cómo mitigar este riesgo de ciberseguridad Las credenciales de IAM nunca deben almacenarse en GitHub ni en ningún otro servicio o almacenamiento en línea. Las credenciales de IAM expuestas deben eliminarse de los repositorios y se deben generar nuevas credenciales de IAM para reemplazar las filtradas. Las empresas deben utilizar credenciales de corta duración para realizar cualquier funcionalidad dinámica dentro de un entorno de producción. Los equipos de seguridad deben monitorear los repositorios de GitHub utilizados por sus organizaciones. Se debe auditar los eventos de clonación que ocurren en esos repositorios porque es necesario que los actores de amenazas clonen primero los repositorios para ver su contenido. Esa característica está disponible para todas las cuentas de GitHub Enterprise. También se debe realizar constantemente un escaneo personalizado y dedicado en busca de secretos en los repositorios. Herramientas como Trufflehog podrían ayudar en esa tarea. Si no es necesario compartir los repositorios de la organización públicamente, los repositorios privados de GitHub deben ser utilizados y solo el personal de la organización debe acceder a ellos. El acceso a los repositorios privados de GitHub debe protegerse mediante autenticación multifactor para evitar que un atacante acceda a ellos con credenciales de inicio de sesión filtradas. Divulgación: trabajo para Trend Micro, pero las opiniones expresadas en este artículo son mías.

Source link

Página 2 de 2

Funciona con WordPress & Tema de Anders Norén