반응형
반응형

태양 아래 앉아보라.
햇살이 육체를 관통해 들어오도록 하라.
태양의 온기가 내면에 들어가서, 혈액세포를
어루만지고, 뼛속까지 도달하는 것을 느껴보라.
태양은 가장 중요한 생명의 원천이다. 눈을 감고
느껴보라. 주의를 깊게 기울이고 만끽하라.
매우 정교한 조화로움과 아름다운 음악이
내면에 끊임없이 흐르는 것을
자각하게 될 것이다.


- 오쇼의《바디 마인드 밸런싱》중에서-


* 햇살을 맞으면
우리 몸의 세포들이 기지개를 켭니다.
추운 날 응달에 있다 양지로 나갔을 때,
잔뜩 흐리다가 반짝 해가 나며 햇살이 비칠 때,
초목들도 사람들도 모두 기지개를 켭니다.
햇살이 전신으로 스며들며 아름다운
선율이 몸 안에 울려 퍼지고, 만물이
생명 에너지로 충만해집니다.
얼른 햇살로 나가십시오.

반응형

'아침편지' 카테고리의 다른 글

마음이 편안해질 때까지  (0) 2024.02.22
배꼽  (0) 2024.02.21
80세 노교수의 건강 비결 두 가지  (0) 2024.02.19
생의 절정  (0) 2024.02.16
누가 나를 화나게 하는가?  (0) 2024.02.15
반응형

80년을 넘긴 나의 건강 비결 두 가지가 있다.
하나는 매일 아침 두유를 마시는 것이고, 다른 하나는
매일 저녁 잠자리에 들기 전에 더운물 샤워를 하고
맨손체조(스트레칭)를 20분 정도 하는 것이다.
한국인은 대부분 유당불내증을 갖고 있어서
두유 대신 우유를 마시면 대사과정에서
활성산소가 과도하게 생성되어 암 등
각종 질병에 걸리게 된다는 것이다.


- 이철호의 《팔십인생》 중에서 -


* 누구에게나
자기 나름의 건강 비결이 필요합니다.
오랜 습관과 경험에서 얻은 건강 비결이  
있는 것과 없는 것은 삶의 질에 차이가 많습니다.
건강의 핵심은 음식과 운동입니다. 자기 체질에 맞는
음식을 일찍 일찍 찾고, 자기 몸에 최적화된 운동을
반복하는 것입니다. 핵심은 꾸준함입니다.
꾸준한 반복이 각종 질병을 이기는
최고의 건강 비결입니다.

반응형

'아침편지' 카테고리의 다른 글

배꼽  (0) 2024.02.21
태양 아래 앉아보라  (0) 2024.02.21
생의 절정  (0) 2024.02.16
누가 나를 화나게 하는가?  (0) 2024.02.15
더 평온한 세상  (0) 2024.02.14
반응형

포기해야하는 순간에 직면할 때 우리는 이런 고민을 합니다. “손가락질 하지 않을까?” “직장을 그만두면 벌이는 어떻게 될까.” 영문학 박사를 받고 교수를 꿈꾸다, 그 꿈을 달성하기 직전 그만둔 줄리아 켈러는 훗날 시카고트리뷴의 기자로 활동하면서 퓰리처상까지 받습니다. 그는 이런 말을 합니다.

 

두려움은 당연하다

 

  • 👩 포기는 성공의 반대말(실패)이 아닙니다

 

그는 포기하는 방법을 알려준 책 <퀴팅>을 통해 이렇게 말합니다.

 

  • 👩 상황을 바꿀 수 없을때, 고민의 시간 모든 책임은 나에게만 있지는 않아요. 자책할 필요 없습니다. 사람들이 어떻게 노력했는지 자세히 들여다보지 않고 그들에게 그만두었다는 오명을 씌우며 현재 상황의 책임을 돌리면 세상은 더욱 불공정해지 않나요.

 

그러면서 그는 라이디 클로츠 <빼기의 기술>을 인용해 이렇게 말합니다.

 

  • 이분법적 사고와 싸워야 합니다. 그만둔다고 해서 무언가를 계속할 수 없다는 뜻은 아닙니다. 그만두기와 그만두지 않기는 반대개념이 아닙니다. 상황을 개선하기 위해 반응하는 방식이 다릅니다. 마이너스라고 생각한 것이 플러스가 될 수도 있고, 그만두기라고 생각한 것이 그만두지 않는 것이 될 수 있습니다.

 

그러면서 크게 세 가지 방법을 제안합니다.

 

  1. 우선순위를 정한다: 앞서 편지에서도 적었지만, 투두(To do) 리스트를 작성합니다. 내가 정말 간절히 원하는 프로젝트, 하고자 하는 일들을 적습니다.
  2. 두려움을 받아들인다: 무엇인가 새로운 것을 시작하는데는 두려움이 따릅니다. 하지만 두려운 것은 너무 당연합니다. 모든 사람이 같습니다.
  3. 방향을 바꿔본다: 프로젝트를 포기할 수 없는 상황이라면, 방향이라도 바꿔보는 것이 좋습니다. 망설이는 것도 좋고, 새 목표를 세우는 것도 좋고, 잠시 멈추는 것도 좋습니다. 새 방향을 찾는 것이 중요하니까요.

 

매우 빠른 실패를 경험하라

 

심리학자인 존 크럼볼츠, 라이언 바비노는 <빠르게 실패하기>라는 책을 통해 왜 실패는 빠르면 빠를수록 좋은지 설명을 합니다.

 

이들은 한 도예과 교수의 실험을 소개하는데요. 교수는 학생들에게 이렇게 말을 합니다. “, 다음 시험에선 두 가지 방법을 모두 인정하겠습니다. 엄청나게 많은 도자기를 내도 좋고, 아니면 우수한 도자기 몇 점만 내도 인정하겠습니다.”

 

학생들은 곧 두 그룹으로 나뉩니다. 다작을 하는 그룹, 그리고 공을 들이는 그룹. 결과는 어땠을까요. 평상시 성적이 우수한 학생들 대다수가 질보다는 양을 택했습니다. 반면 우수한 작품을 내겠다고 다짐한 학생들은 제출 시간도 제대로 엄수하지 못했습니다.

 

성공하는 이들의 공통점은 빠르게 실패하는데 있습니다. 도자기를 많이 만든 학생들은 스스로 빠른 실패를 통해 성장할 수 있었던데 반해, 품질만을 강조한 학생들은 고민하다 시간만 보냈다는 메시지입니다.

 

  • 훌륭한 뮤지션이 되고 싶다면: 엉망인 음악을 수없이 연주해 봐야 합니다.
  • 탁월한 결정을 내리는 비즈니스맨이 되고 싶다면: 진부한 결정을 내리는 일정 시간을 보내야 합니다.
  • 소설을 한 권 쓰고 싶다면: 하찮은 이야기들을 많이 써 봐야 합니다.
  • 영어를 유창하게 하려면: 형편없는 영어를 많이 말 해야 합니다.
  • 진정한 예술가가 되고 싶으면: 어설픈 예술을 창조해 봐야 합니다.

 

만약 반복적으로 해 봐서도 마음에 드는 결과를 얻지 못한다면? 포기를 할 수밖에 없을텐데요. 데카르트는 방법론을 통해 이렇게 말했습니다.

 

  • 🧓확실히 가장 좋은 길을 결정할 수 없을 때, 우리는 조금 더 좋아 보이는 길을 따라가야 합니다.
  • 🧓 이런 마음가짐은 사람들이 흔히 느끼는 후회에서 자유로울 수 있도록 해줍니다.

 

🔎 크게 보기

빠르게 실패하기의 저자들은 희망 대기 목록을 작성해 보라고 권장을 합니다. 희망 사항 목록을 작성해 보고, 당장 할 수 있는 일부터 해보라는 메시지입니다. 무겁고 큰 생각은 잠시 접어두세요. 빠르게 할 수 있는 일부터 해보는 것은 어떨까 합니다. 포기와 실패에도 연습이 필요합니다.

 

https://www.coupang.com/vp/products/6748682617

 

빠르게 실패하기:20년간 진행된 스탠퍼드대학교 <인생 성장 프로젝트>

COUPANG

www.coupang.com

 

반응형
반응형

https://devjorgecastro.medium.com/modern-android-development-in-2024-b70f194938bd

 

Hello everyone 👋🏻, we are kicking off a new year, and I don’t want to miss this chance to share with you an article titled Modern Android Developmentin its 2024 version. 🚀

If you missed my previous article, you can take a look at Modern Android Development in 2023 and review the changes for this year

Disclaimer

📝 This article reflects my personal opinions and professional insights, considering diverse viewpoints within the Android developer community. Additionally, I regularly review the guidelines presented by Google for Android.

🚨 It is crucial to emphasize that while I may not explicitly mention certain compelling tools, patterns, and architectures, this omission does not negate their potential as valuable alternatives for developing Android applications.

Use Kotlin everywhere ❤️

Kotlin is a programming language developed by JetBrains. Recommended by Google who officially announced it in May 2017 (see publication here). It is a modern programming language that has compatibility with Java and can run on the JVM, which has made its adoption in the development of Android applications very fast.

Whether you are new to Android or not, you should consider Kotlin as your first choice, don’t swim against the tide 🏊🏻 😎, Google announced this approach at Google I/O 2019. With Kotlin, you will be able to use all the features of a modern language, including the power of Coroutines and the use of modern libraries developed for the Android ecosystem.

Official kotlin documentation here

Kotlin is a multipurpose language that we can use not only for developing Android applications, although much of its popularity has been due to the latter, as we can see in the following graph.

KotlinConf ‘23

Kotlin 2.0 is here

Another important thing to highlight is the release of Kotlin 2.0, which is just around the corner. As of the article’s date, it’s in its version 2.0.0-beta3

The new K2 compiler is also another addition in Kotlin 2.0, which will bring significant performance improvements, accelerate the development of new language features, unify all platforms supported by Kotlin, and provide a better architecture for multiplatform projects.

Check out the recap of KotlinConf ’23 where you can find more information.

Compose 🚀

Jetpack Compose is Android’s recommended modern toolkit for building native UI. It simplifies and accelerates UI development on Android. Quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.

 Jetpack Compose documentacion

Jetpack Compose is part of the Android Jetpack library and uses the Kotlin programming language to easily create a native user interface. Also, it integrates with other Android Jetpack libraries, such as LiveData and ViewModel, to make it easier to build reactive and maintainable Android applications.

Some key features of Jetpack Compose include:

  1. Declarative UI.
  2. Customizable widgets.
  3. Easy integration with existing code (old view system).
  4. Live preview.
  5. Improved performance.

Resources:

Android Jetpack ⚙️

Jetpack is a suite of libraries to help developers follow best practices, reduce boilerplate code, and write code that works consistently across Android versions and devices so that developers can focus on the code they care about.

_ Android Jetpack documentation

Some of its most common tools are:

Material You / Material Design 🥰

Material You, a new customization feature introduced in Android 12 and implemented within Material Design 3, empowers users to tailor the visual appearance of their operating system to align with their personal preferences. This innovative addition complements Material Design, an adaptable system of guidelines, components, and tools crafted to uphold the highest standards of user interface design. Supported by open-source code, Material Design fosters seamless collaboration between designers and developers, enabling teams to efficiently create stunning products.

Currently, the last version for Material Design is 3, you can see more here. Furthermore, you can take advantage of Material Theme Builder as assistance in defining your application’s theme.

 

Splash screens API

The SplashScreen API in Android is essential to ensure that applications display correctly on Android 12 and later versions. Not updating can impact the application launch experience. It is crucial to quickly adopt this API for a consistent user experience on the latest versions of the operating system.

 

Clean Architecture

The concept of Clean Architecture was introduced by Robert C. Martin. It is based on the separation of responsibilities through the division of software into layers.

Characteristics

  1. Independent of Frameworks.
  2. Testable.
  3. Independent of UI.
  4. Independent of Database.
  5. Independent of any external agency.

The Dependency Rule

The dependency rule is described very well by the author in his piece, The Clean Code Blog

The overriding rule that makes this architecture work is The Dependency Rule. This rule says that source code dependencies can only point inwards. Nothing in an inner circle can know anything at all about something in an outer circle. In particular, the name of something declared in an outer circle must not be mentioned by the code in the an inner circle. That includes, functions, classes. variables, or any other named software entity.

 The Clean Code Blog

Clean Architecture in Android

  • Presentation: Activities, Composables, Fragments, View Models and others view components.
  • Domain: Use Cases, Entities, Repositories, others domain components.
  • Data: Repository implementations, Mappers, DTO’s, etc.

Architecture Patterns for Presentation Layer

An architecture pattern is a higher-level strategy that aims to help design a software architecture and is characterized by being a solution within a reusable framework for common architectural problems. Architectural patterns are similar to design patterns, but they are larger in scale and address more global issues such as the overall structure of the system, the relationships between components, and the way that data is managed.

Within the Presentation layer, we have some architecture patterns, of which I would like to highlight the following:

  • MVVM
  • MVI

I do not want to go into explaining each one because on the internet you find too much information about this. 😅

In addition, you can also see the guide to app architecture

Image by developer.android.com
 

Dependency Injection

Dependency injection is a software design pattern that allows a client to obtain its dependencies from an external source rather than creating them itself. It is a technique for achieving Inversion of Control (IoC) between objects and their dependencies.

Modularization

Modularization is a software design technique that allows you to divide an application into independent modules, each with its own functionality and responsibility.

Image by developer.android.com

Benefits of modularization

Reusability: By having independent modules, they can be reused in different parts of the application or even in other applications.

Strict visibility control: Modules enable you to easily control what you expose to other parts of your codebase.

Customizable delivery: Play Feature Delivery uses the advanced capabilities of app bundles, allowing you to deliver certain features of your app conditionally or on demand.

Scalability: By having independent modules, functionalities can be added or removed without affecting other parts of the application.

Ease of maintenance: By dividing the application into independent modules, each with its own functionality and responsibility, it is easier to understand and maintain the code.

Ease of testing: By having independent modules, they can be tested in isolation, which makes it easy to detect and fix errors.

Architecture improvement: Modularizing helps to improve the architecture of the application, allowing a better organization and structure of the code.

Improve collaboration: By having independent modules, developers can work on different parts of the application simultaneously and without interference.

Build Time: Some Gradle functionalities such as incremental build, build cache or parallel build, can leverage modularity to improve build performance.

See more in the official documentation.

Network

Serialization

In this section I would like to mention two important tools in my opinion: Moshi widely used in conjunction with Retrofit and Kotlin Serialization, the Kotlin team’s bet at JetBrains.

Moshi and Kotlin Serialization are two serialization/deserialization libraries for Kotlin and Java that allow you to convert objects to JSON or another serialization format and vice versa. Both provide a user-friendly interface optimized for use in mobile and desktop applications. Moshi primarily focuses on JSON serialization, while Kotlin Serialization has support for various serialization formats, including JSON.

Image Loading

To load an image from the internet, there are several third-party libraries available to help you handle the process. Image loading libraries do a lot of the heavy lifting for you; they handle both caching (so you don’t download the image multiple times) and networking logic to download the image and display it on screen.

_ Official Android Documentation

Reactivity / Thread Management

When it comes to reactive programming and asynchronous processes, Kotlin Coroutines stand out with their Suspension Functions and Flow. However, it is crucial to acknowledge the value of RxJava in Android application development. Despite the growing adoption of Coroutines and Flow, RxJava remains a robust and popular choice in multiple projects.

For new projects always choose Kotlin Coroutines❤️. Explore some Kotlin Coroutines Concepts

 

Local Store

An important point when building mobile applications is having the ability to persist data locally, such as some session data or cache data, among others. It is important to choose the right storage option based on the needs of your application. We could store unstructured data like key-value or structured data like a database. Keep in mind that this point does not mention all the types of local storage that we have available (such as file storage), only the tools that allow us to save data.

Suggestions:

 

Testing 🕵🏼

Testing in software development is essential to ensure product quality. It detects errors, validates requirements, and ensures customer satisfaction. Below are some of the most commonly used tools for this purpose:

Testing section of the Tools documentation

Screenshot testing 📸

Screenshot testing in Android involves automatically capturing screenshots of various UI elements in an application and comparing them against baseline images to detect any unintended visual changes. It helps ensure consistent UI appearance across different versions and configurations of the app, catching visual regressions early in the development process.

 

R8 optimizations

R8 is the default compiler that converts your project’s Java bytecode into the DEX format that runs on the Android platform. It is a tool that helps us to obfuscate and reduce the code of our application by shortening the names of the classes and their properties, eliminating unused code and resources within the project. To see more, check the Android documentation about Shrink, obfuscate, and optimize your app. Additionally, you can also disable certain tasks or customize R8’s behavior through ProGuard rules files.

Image by androidtopics.dipien.com
  • Code shrinking
  • Resource shrinking
  • Obfuscation
  • Optimization

Third-party tools

  • DexGuard

Play Feature Delivery

Google Play’s app serving model, called Dynamic Delivery, uses Android App Bundles to generate and serve optimized APKs for each user’s device configuration, so users download only the code and resources they need to run your app.

 Android Documentation

Adaptive layouts

Image by android-developers.googleblog.com

With the growth in the use of mobile devices with different form factors, we need to have tools that allow us to work with our Android applications adapted to different types of screens. That is why Android provides us with Window Size Classes, which, in a simple way, are three large groups of screen formats that mark critical points for us to develop our designs. With this we avoid the complexity of thinking about many screen designs to reduce our possibilities to 3 groups which are: Compat, Medium and Expanded.

Windows Size Classes

Image by developer.android.com
Image by developer.android.com

Support different screen sizes

Another important resource that we have are the Canonical Layouts, which are predefined screen designs that can be used for most scenarios in our Android applications and also show us a guide on how to adapt them to large screens.

Other related resources

Form-Factor Training

Localization 🌎

Localization involves adapting a product to meet the needs of diverse audiences in different regions. This includes translating text, adjusting formats, and considering cultural aspects. Its advantages include access to global markets, enhanced user experience, increased customer satisfaction, competitiveness in the global market, and compliance with local regulations.

Note: BCP 47 is a standard used by Android for internationalization

References

Performance 🔋⚙️

Image by android-developers.googleblog.com

While we develop applications for Android, we must ensure that the user experience is better, not only at the beginning of the application but also throughout its execution. For this reason, it is important to have tools that allow us to carry out a preventive analysis and constant monitoring of cases that may affect the performance of the application, so here is a list of tools that will help you with this purpose:

In-App Updates

When your users keep your app up to date on their devices, they can try new features, as well as benefit from performance improvements and bug fixes. Although some users enable background updates when their device is connected to an unmetered connection, other users might need to be reminded to install updates. In-app updates is a Google Play Core libraries feature that prompts active users to update your app.

The in-app updates feature is supported on devices running Android 5.0 (API level 21) or higher. Additionally, in-app updates are only supported for Android mobile devices, Android tablets, and Chrome OS devices.

 In-App Updates documentation

Image by developer.android.com

In-App Reviews

The Google Play In-App Review API lets you prompt users to submit Play Store ratings and reviews without the inconvenience of leaving your app or game.

Generally, the in-app review flow can be triggered at any time throughout the user journey of your app. During the flow, the user has the ability to rate your app using the 1 to 5 star system and to add an optional comment. Once submitted, the review is sent to the Play Store and eventually displayed.

To protect user privacy and avoid API misuse, there are strict guidelines that your app should follow about when to request in-app reviews and the design of the review prompt.

 In-App Reviews documentation

Observability 👀

Image taken from Elastic Blog

In an increasingly competitive app ecosystem, achieving a good user experience begins with ensuring that the app is bug-free. One of the best ways to ensure that the app is bug-free is to immediately detect issues as they arise and know how to start addressing them. Use Android Vitals to identify the areas of your app that have the most crashes and issues with responsiveness. Then, utilize custom crash reports in Firebase Crashlytics to get more details about the root causes in order to troubleshoot the issues effectively.

Tools

Accessibility

Image by fscl01.fonpit.de

Accessibility is an important feature in the design and construction of software that provides the ability for people with accessibility needs to use the application, in addition to improving their user experience. Some disabilities that this concept aims to improve are: people with vision problems, color blindness, hearing problems, dexterity problems, and cognitive disabilities, among others.

Considerations:

  • Increase text visibility (Color contrast, Resizable Text)
  • Use large, simple controls
  • Describe each UI element

Check Accessibility — Android doc.

Security 🔐

Image by android.com

Security is one, if not the most important aspect, that we must take into account when developing applications that protect the integrity of the device, the security of the data, and the trust of the user, which is why I list below a series of tips that will help you with this purpose.

  • Sign in your user with Credential Manager: Credential Manager is a Jetpack API that supports multiple sign-in methods, such as username and password, passkeys, and federated sign-in solutions (such as Sign-in with Google) in a single API, thus simplifying the integration for developers.
  • Encrypt sensitive data and files: Use EncryptedSharedPreferences and EncryptedFile.
  • Apply signature-based permissions: Use signature-based permissions when sharing data between apps you have control over.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />
  • Do not put keys, tokens, or sensitive data required for your application’s configuration directly inside files or classes that are inside the project repository. Use local.properties instead.
  • Implement SSL Pinning: Use SSL Pinning to further secure communications between your application and remote servers. This helps prevent man-in-the-middle attacks and ensures that communication only occurs with trusted servers possessing a specific SSL certificate.

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">ReplaceWithYourPin</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">ReplaceWithYourPin</pin>
        </pin-set>
    </domain-config>
</network-security-config>
  • Implementa Runtime Application Self Protection (RASP): It is a security technique that protects applications at runtime against attacks and vulnerabilities. RASP works by monitoring the application’s behavior and detecting suspicious activities that could indicate an attack. some of the advantages that RASP provides us:

    - Code Obfuscation.
    - Root Detection.
    - Tampering/App Hook Detection.
    - Prevention of reverse engineering attacks.
    - Anti-Debugging Techniques.
    - Virtual Environment Detection.
    - Runtime Analysis of App Behavior.

Look at this article for more information: Runtime Application Self Protection techniques(RASP) in Android Apps. Also some Security guidelines by Android

Version Catalogs

Gradle provides a standard way to centrally manage project dependencies called the version catalog; it was experimentally introduced in version 7.0 and officially released in version 7.4.

Advantage:

  • For each catalog, Gradle generates type-safe accessors so that you can easily add dependencies with autocompletion in the IDE.
  • Each catalog is visible to all projects of a build. It is a central place to declare a version of a dependency and to make sure that a change to that version applies to every subproject.
  • Catalogs can declare dependency bundles, which are “groups of dependencies” that are commonly used together.
  • Catalogs can separate the group and name of a dependency from its actual version and use version references instead, making it possible to share a version declaration between multiple dependencies.

see more

Secrets Gradle Plugin

Google strongly recommends that you not check an API key into your version control system. Instead, you should store it in a local secrets.properties file, which is located in the root directory of your project but excluded from version control, and then use the Secrets Gradle Plugin for Android to read the API key.

Logger

A logger is a software tool used to register information about the execution of a program; important events, errors debug messages and other information that may be useful in diagnosing problems or understanding how a program is working. Loggers can be configured to write messages to different locations, such as a log file, to the console, to a database, or by sending the messages to a logging server.

Linter / Static Code Analyzer

Image taken from https://miro.medium.com/

Linter is a programming tool that is used to analyze the program source code to find potential problems or bugs in the code. These issues can be syntactic, inappropriate code style, lack of documentation, security issues, and so on, and they can have an impact on the quality and maintainability of the code.

Google Play Instant

Google Play Instant enables native apps and games to launch on devices running Android 5.0 (API level 21) or higher without being installed. You can build these types of experiences, called instant apps and instant games, using Android Studio. By allowing users to run an instant app or instant game, known as providing an instant experience, you improve your app or game’s discovery, which helps drive more active users or installations.

 Overview of Google Play Instant

 

New Design Hub

The Android team provides a new design hub to help create beautiful, modern Android apps, a centralized place to understand design for Android across multiple form factors.

d.android.com/design/ui

 

AI

Gemini and PalM 2, two state-of-the-art artificial intelligence (AI) models developed by Google, are poised to transform the landscape of Android application development. These models offer a range of benefits that will drive efficiency, user experience, and innovation in applications.

AI Coding Assistant Tools

Studio Bot

Studio Bot is your coding companion for Android development. It’s a conversational experience in Android Studio that helps you be more productive by answering Android development queries. It’s powered by artificial intelligence and can understand natural language, so you can ask development questions in plain English. Studio Bot can help Android developers generate code, find relevant resources, learn best practices, and save time.

 Studio Bot

Github Copilot

GitHub Copilot is an AI pair programmer. You can use GitHub Copilot to get suggestions for whole lines or entire functions right inside your editor.

Amazon CodeWhisperer

It is an Amazon service that generates code recommendations based on the context of your current code. It helps you write more efficient and secure code, and discover new APIs and tools.

 

Kotlin Multiplatform 🖥 📱⌚️ 🥰 🚀

Finally, and equally significant, the standout revelation of the year is Kotlin Multiplatform 🎉. It emerges as a formidable contender in the realm of cross-platform application development. While our primary focus may lie in Android app development, Kotlin Multiplatform offers us the flexibility to craft a fully native Android application leveraging the KMP framework. This strategic move not only future-proofs our projects but also equips us with the necessary infrastructure for a seamless transition to a multiplatform environment, should we choose to pursue it. 🚀

If you’re keen on delving deeper into Kotlin Multiplatform, I’d like to share a couple of articles I wrote a few months ago. In these pieces, I explore the current state of this technology and its implications for modern software development

반응형
반응형

"정오가 지나면
모든 사물의 그림자가 생긴다네.
상승과 하락의 숨 막히는 리미트지.
나는 알았던 거야. 생의 절정이
죽음이라는걸. 그게
대낮이라는걸."


- 김지수의《이어령의 마지막 수업》중에서 -


* 생의 절정!
그 절정의 순간은 일생 속에도,
하루 중에도, 매 순간에도 있습니다.
들숨이 절정에 이르면 다시 날숨이 시작됩니다.
들숨이 절정을 이루는 충만의 순간에 다시 하강이
시작되는 것입니다. 날숨이 시작되지 않는다면
생명은 끝나고 맙니다. 삶과 죽음, 크나큰
섭리의 비밀은 숨과 숨 사이에 있습니다.

반응형
반응형

 

등산 - 100대 명산  https://www.forest.go.kr/kfsweb/kfi/kfs/foreston/main/contents/FmmntSrch/selectFmmntSrchList.do

 

 

"100대 명산"은 "2002년 세계 산의 해"를 기념하고 산의 가치와 중요성을 새롭게 인식하기 위해 2002년 10월 산림청에서 선정 공표하였습니다. 산림청에서 선정한 "100대 명산"은 학계, 산악계, 언론계 등 13명의 전문가로 구성된 선정위원회가 지방자치단체를 통해 추천받은 105개 산과 산악회 및 산악 전문지가 추천하는 산, 인터넷 사이트를 통해 선호도가 높은 산을 대상을 산의 역사, 문화성, 접근성, 선호도, 규모, 생태계 특성 등 5개 항목에 가중치를 부여하여 심사 후 선정하였습니다. 100대 명산에는 국립공원(31)·도립공원(15)·군립공원(10) 지역에서 56개가 선정되었습니다. 또 가리왕산, 운장산, 황악산 등 생태적 가치가 큰 산(16)과 역사, 문화, 경관 등 모든 면에서 우수한 산(28)이 포함되어 있습니다.

100대명산
2022.1.1. 기준        
번호 산이름 한문이름 높이(m) 소재지 관리주체
1 가리산 加里山 1050.9 강원도 홍천군 두촌면ㆍ화촌면, 춘천시 북산면ㆍ동면 홍천군청, 춘천시청
2 가리왕산 加里王山 1561.8 강원도 정선군 북평면ㆍ정선읍 회동리, 평창군 진부면 정선군청, 평창군청
3 가야산 伽倻山 1432.6 경상남도 합천군ㆍ거창군, 경상북도 성주군 국립공원관리공단(가야산국립공원)
4 가지산  加智山 1240.9 울산광역시 울주군, 경상북도 청도군, 경상남도 밀양시 울주군청, 청도군청, 밀양시청
5 감악산 紺岳山 674.9 경기도 파주시 적성면, 양주시 남면, 연천군 전곡읍 파주시청, 양주시청, 연천군청
6 강천산  剛泉山 585.8 전라북도 순창군 팔덕면, 전라남도 담양군 용면 순창군청, 담양군청
7 계룡산 鷄龍山 846.5 대전광역시, 충청남도 공주시 계룡면, 논산시 상월면, 계룡시 신도안면 국립공원관리공단(계룡산사무소)
8 계방산 桂芳山 1579.1 강원도 홍천군 내면, 평창군 용편면ㆍ진부면 홍천군청, 평창군청
9 공작산 孔雀山 887.4 강원도 홍천군 동면, 화촌면 홍천군청
10 관악산 冠岳山 632.2 서울특별시 관악구, 경기도 안양시, 과천시 관악구청, 금천구청, 과천시청, 안양시청
11 구병산 九屛山 876.3 경상북도 상주신 화북면, 충청북도 보은군 마로면ㆍ속리산면 상주시청, 보은군청
12 금산 錦山 704.9 경상남도 남해군 상주면, 이동면, 삼동면 남해군청
13 금수산 錦繡山 1015.8 충청북도 제천시 수산면, 단양군 적성면 제천시청, 월악산국립공원
14 금오산 金烏山 976.5 경상북도 구미시, 칠곡군 북삼읍, 김천시 남면 구미시청, 김천시청
15 금정산  金井山 800.8 부산광역시 금정구ㆍ북구, 경상남도 양산시 부산광역시, 양산시청
16 깃대봉 旗臺峰 367.8 전라남도 신안군 흑산면 홍도 국립공원관리공단
17 남산(금오산) 南山 495.1 경상북도 경주시 남산동, 내남면 국립공원관리공단(경주국립공원)
18 내연산  內延山 711.3 경상북도 포항시 송라면ㆍ청하면ㆍ죽장면, 영덕군 남정면 경상북도, 포항시청, 영덕군청
19 내장산(신선봉) 內藏山 763.5 전라북도 정읍시 내장동, 순창군 쌍치면ㆍ복흥면 내장산국립공원관리공단
20 대둔산 大芚山 879.1 충청남도 논산시 벌곡면ㆍ금산군 진산면, 전라북도 완주군 운주면 논산시청, 금산군청, 완주군청
21 대암산 大岩山 1312.6 강원 양구군 동면, 인제군 서화면 양구군청
22 대야산 大耶山 931 경상북도 문경시 가은읍, 충청북도 괴산군 청천면 국립공원관리공단(속리산국립공원)
23 덕숭산(수덕산) 德崇山 495.2 충청남도 예산군 덕산면 예산군청
24 덕유산(향적봉) 德裕山 1614.2 전라북도 무주군ㆍ장수군, 경상남도 거창군ㆍ함양군 덕유산국립공원관리공단
25 덕항산 德項山 1072.9 강원도 삼척시 신기면, 태백시 하사미동 삼척시청, 태백시청
26 도락산 道樂山 965.3 충청북도 단양군  단성면, 대강면 월악산국립공원
27 도봉산(자운봉) 道峰山 740.2 서울특별시 도봉구, 경기도 의정부시 호원동ㆍ양주시 장흥면 국립공원관리공단, 도봉구청, 의정부시청, 양주시청
28 두륜산 頭輪山 700 전라남도 해남군 삼산면ㆍ북일면ㆍ북평면ㆍ현산면 해남군청
29 두타산 頭陀山 1357 강원도 동해시 삼화동, 삼척시 미로면ㆍ하자면 삼척시청, 태백시청
30 마니산 摩尼山 472.1 인천광역시 강화군 화도면 강화군청
31 마이산(암마이산) 馬耳山 687.4 전라북도 진안군 진안읍ㆍ마령면 전라북도, 진안군청
32 명성산 鳴聲山 922 강원도 철원군 갈말읍, 경기도 포천시 영북면ㆍ이동면 포천시청, 철원군청
33 명지산 明智山 1252.3 경기도 가평군 북면ㆍ하면 가평군천
34 모악산 母岳山 795.2 전라북도 김제시 금산면, 전주시 완산구, 완주군 구이면 전라북도, 전주시청, 김제시청, 완주군청
35 무등산 無等山 1186.8 광주광역시 동구, 전라남도 담양군 남면ㆍ화순군 이서면 국립공원관리공단 (무등산사무소, 무등산동부사무소)
36 무학산 舞鶴山 761.4 경상남도 창원시 교방동ㆍ두척동ㆍ내서읍 창원시청
37 미륵산  彌勒山 458.4 경상남도 통영시 산양읍ㆍ봉평동 통영시청
38 민주지산 眠周之山 1241.7 충청북도 영동군 쌍촌면ㆍ용화면, 전라북도 무주군 설천면, 경상북도 김천시 부항면 영동군청, 무주군청, 김천시청
39 방장산 方丈山 733.6 전라북도 고창군 신림면ㆍ정읍시 입암면, 전라남도 장성군  전라남도, 전라북도
40 방태산(주억봉) 芳台山 1445.7 강원도 인제군 기린면ㆍ상남면, 홍천군 내면 인제군청, 홍천군청
41 백덕산 白德山 1350.1 강원도 평창군 방림면, 횡성군 안흥면, 영월군 수주면 영월군청, 평창군청, 횡성군청
42 백암산 白巖山 741.2 전라북도 순창군 복흥면, 잔라남도 장성군 북하면 국립공원관리공단(백암사무소)
43 백운산(포천) 白雲山 903 경기도 포천시 이동면 포천시청
44 백운산(광양) 白雲山 1222.2 전라남도 광양시 진상면ㆍ옥룡면ㆍ봉강면ㆍ다압면, 구례군 간전면 광양시청, 구례군청
45 백운산(정선) 白雲山 883.5 강원도 정선군 신동읍, 평창군 미탄면 정선군청, 평창군청
46 변산(의상봉) 邊山 459 전라북도 부안군 변산면, 상서면, 진서면 변산반도국립공원관리공단
47 북한산(백운대) 北漢山 835.6 서울특별시 강북구ㆍ성북구ㆍ종로구ㆍ은평구, 경기도 고양시ㆍ양주시 서울특별시
48 비슬산(천왕봉) 琵瑟山 1083.4 대구광역시 달성군 옥포면ㆍ유가면ㆍ가창면, 경상북도 청도군 각북면 달성군청, 청도군청
49 삼악산 三岳山 655.8 강원도 춘천시 서면 춘천시청
50 서대산 西臺山 905.3 충청남도 금산군 추부면ㆍ군북면, 충청북도 옥천군 군서면 금산군청, 옥천군청
51 선운산 禪雲山 334.7 전라북도 고창군 아산면ㆍ심원면ㆍ해리면 전라북도, 고창군청
52 설악산(대청봉) 雪岳山 1708.1 강원도 속초시 설악동, 인제군 북면ㆍ인제읍, 양양군 서면ㆍ강현면 속초시청, 인제군청, 양양군청
53 성인봉 聖人峰 986.5 경상북도 울릉군 울릉읍 서면ㆍ북면 울릉군청
54 소백산 小白山 1439.7 경상북도 영주시 풍기읍, 충청북도 단양군 단양읍 국립공원관리공단(소백산국립공원)
55 소요산 逍遙山 587.5 경기도 동두천시, 포천시 신북면 동두천시청, 포천시청
56 속리산 俗離山 1058.4 경상북도 상주시 화북면, 충청북도 보은군 내속리면 국립공원관리공단(속리산국립공원)
57 신불산 神佛山 1159.3 울산광역시 울주군 삼남면ㆍ상북면 울주군청
58 연화산 蓮花山  524 경상남도 고성군 개천면ㆍ영현면 고성군청
59 오대산(비로봉) 五臺山 1565.4 강원도 평창군 진부면, 홍천군 내면, 강릉시 연곡면 평창군청, 홍천군청, 강릉시청
60 오봉산 五峰山 777.9 강원도 춘천시 북산면, 화천군 간동면 춘천시청, 화천군청
61 용문산 龍門山 1157.1 경기도 양평군 용문면ㆍ옥천면 양평군청
62 용화산 龍華山 877.8 강원도 화천군 간동면ㆍ하남면, 춘천시 사북면 화천군청, 춘천시청
63 운문산 雲門山 1195.1 경상북도 청도군 운문면, 경상남도 밀양시 산내면 경상북도, 밀양시청
64 운악산(현등산) 雲岳山 934.7 경기도 가평군 하면, 포천시 화현면 가평군청, 포천시청
65 운장산 雲長山 1125.8 전라북도 진안군 주천면, 부귀면, 정천면, 완주군 동상면 진안군청
66 월악산 月岳山 1095.3 충청북도 제천시 한수면, 덕산면 국립공원관리공단(월악산국립공원)
67 월출산 月出山 810.7 전라남도 영암군 영암읍ㆍ군서면ㆍ학산면, 강진군 성전면 국립공원관리공산(월출산국립공원)
68 유명산 有明山 864 경기도 가평군 설악면, 양평군 옥천면 가평군청, 양평군청
69 응봉산(매봉산) 鷹峰山 999.7 강원도 삼척시 가곡면ㆍ원덕읍, 경상북도 울진군 북면 삼척시청, 울진군청
70 장안산 長安山 1237.4 전라북도 장수군 장수읍, 계남면 장수군청
71 재약산 載藥山 1119.1 경상남도 밀양시 단장면ㆍ산내면, 울산광역시 울주군 상북면 밀양시청, 울주군청
72 적상산 赤裳山 1030.6 전라북도 무주군 적상면 국립공원관리공단
73 점봉산 點鳳山 1426 강원도 양양군 서면, 인제군 인제읍ㆍ기린면 양양군청, 인제군청
74 조계산 曹溪山 887.3 전라남도 순천시 승주읍ㆍ송광면 순천시청
75 주왕산 周王山 722.1 경상북도 청송군 청송읍ㆍ부동면, 영덕군 지품면ㆍ달산면 국립공원관리공단(주왕산국립공원)
76 주흘산 主屹山 1108.4 경상북도 문경시 문경읍 문경시청
77 지리산(천왕봉) 智異山 1915.4 경상남도 하동군ㆍ산청군ㆍ함양군, 전라북도 남원시, 전라남도 구례군 국립공원관리공단(지리산국립공원)
78 지리산 智異山 399.3 경상남도 통영시 사량면 통영시청
79 천관산 天冠山 724.3 전라남도 장흥군 관산읍, 대덕읍 장흥군청
80 천마산 天摩山 810.3 경기도 남양주시 화도읍, 오남읍 남양주시청
81 천성산 千聖山 920.2 경상남도 양산시 하북면, 웅상읍, 상북면 양산시청
82 천태산 天台山 714.3 충청북도 영동군 양산면, 충청남도 금산군 제원면 영동군청, 금산군청
83 청량산 淸凉山 869.7 경상북도 봉화군 명호면ㆍ재산면, 안동시 도산면ㆍ예안면 봉화군청(청량산도립공원관리사무소)
84 추월산 秋月山 731.2 전라남도 담양군 용면, 전라북도 순창군 복흥면 담양군청, 순창군청
85 축령산 祝靈山 887.1 경기도 남양주시 수동면, 가평군 상면 남양주시청, 가평군청
86 치악산 雉岳山 1282 강원도 원주시, 횡성군, 영월군 원주시청, 횡성군청, 영월군청
87 칠갑산 七甲山 559.7 충청남도 청양군 대치면, 정산면, 장평면 청양군청
88 태백산 太白山 1566.7 강원도 태백시, 경상북도 봉화군 석포면 태백시청, 봉화군청
89 태화산 太華山 1027.5 강원도 영월군 남면, 충청북도 단양군 영춘면 영월군청, 국유림관리사무소
90 팔공산 八公山 1192.3 경상북도 군위군 부계면, 영천시 신녕면, 대구광역시 동구 경상북도, 대구광역시
91 팔봉산 八峰山 328.2 강원도 홍천군 서면 홍청군청
92 팔영산 八影山 606.9 전라남도 고흥군 점암면, 영남면 국립공원관리공단(팔영산국립공원)
93 한라산 漢拏山 1947.3 제주특별자치도 제주특별자치도
94 화악산 華岳山 1468.3 경기도 가평군 북면, 강원도 화천군 사내면 가평군청
95 화왕산 火旺山 757.7 경상남도 창녕군 창녕읍, 고암면 창녕군청
96 황매산 黃梅山 1113.1 경상남도 합천군 대병면ㆍ가회면, 산청군 차황면 합천군청, 산청군청
97 황석산 黃石山 1192.5 경상남도 함양군 안의면, 서하면, 서상면 함양군청, 거창군청
98 황악산 黃岳山 1111.4 경상북도 김천시 대항면 김천시청
99 황장산 黃腸山 1078.9 경상북도 문경시 동로면 국립공원관리공단(월악산국립공원)
100 희양산 曦陽山 996.4 경상북도 문경시 가은읍, 충청북도 괴산군 연풍면 문경시청, 괴산군청

반응형

+ Recent posts