<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[TONG的开发小站]]></title> 
<description><![CDATA[一些个人开发的笔记]]></description>
<link>https://www.iideahub.com/</link>
<language>zh-cn</language>
<generator>pro.emlog.vip</generator>
<item>
    <title>Kotlin的开始</title>
    <link>https://www.iideahub.com/?post=17</link>
    <description><![CDATA[<h2>Kotlin是什么？</h2>
<p><a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a>是一种具有类型推断的跨平台、静态类型、通用型编程语言。Kotlin能够与Java完全互操作，并且<a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a>标准库的JVM版本依赖于Java 类库，但类型推断允许其语法更简洁。<a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a>主要针对 JVM，但也编译为JavaScript（例如，对于使用React的前端 Web 应用程序）或通过LLVM的本机代码（例如，对于与Android应用程序共享业务逻辑的本机iOS应用程序）。</p>
<p>2019 年 5 月 7 日，Google 宣布<a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a>编程语言现在是其Android应用程序开发人员的首选语言。自 2017 年 10 月发布Android Studio 3.0 以来，<a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a>已被纳入标准 Java 编译器的替代方案。Android Kotlin 编译器默认生成 Java 8 字节码（在任何更高版本的 JVM 中运行），允许程序员选择针对 Java 9 最多 18 进行优化，或允许更多功能；在 Java 16 中引入对 JVM 的双向记录类互操作性支持，自 Kotlin 1.5 起被认为是稳定的。</p>
<p>Kotlin 支持网络；通过编译为 JavaScript（即，带有经典后端的 Kotlin/JS，自 1.3 版起被声明为稳定版），而较新的 Kotlin/JS（基于IR）在 1.5.30 版中处于测试阶段。Kotlin/Native（例如Apple 芯片支持）从 1.3 版开始被视为测试版。</p>
<h2>我本人为什么学习Kotlin语言</h2>
<p>本人是一名Android开发工程师，因为Android开发的首要语言就是Kotlin，为了个人的成长，学习Kotlin是必要的。但是也不仅仅是因为这个。Kotlin的各种优点让我深受吸引，让我不仅仅是单纯的学习，而是学习Kotlin语言的魅力之处，让我觉得Kotlin真正的结合了百家之长，有dart的空安全检查，有go语言的协程，不仅仅可以用来开发Android程序，还可以编译IOS的业务层，也不仅仅是前端的Android，还可以用于编写Springboot程序，一样可以集成SpiringCloud全家桶。因为我不仅仅是Android开发，也同样对各种新的技术抱有饱满的兴趣，Kotlin在未来很可能也会成为机器学习，深度学习的首要语言。而这更是我为了跟随计算机时代不断前进的步伐，而选择的计算机语言。</p>
<h3>关于语言层面的优点：</h3>
<p>1.Concise 简单明了的</p>
<hr />
<p>这一点有一个问题，代码上看起来非常的简短，几行就可以完成Java几十行的，但是有一部分人会觉得一个问题，就是代码简短了，阅读性就差了，虽然Java写起来冗杂，但是Java的各种关键字，各种语句，可以很明确的标示一条语句的具体含义，而Koltin，一条语句，可能有多种可以理解的方向，比如类型推断的特性，在需要返回值的时候，因为类型的不确定性，语言的不熟练，就会经常的用到强制类型转换，导致程序的各种各样的异常问题。终究也就只有一点，熟练度，只有你真正的熟悉了这一门语言，阅读性的问题也就没有那么重要了，都是一眼就能明白是什么意思。所以，熟练后，最终代码的简洁的优势就会逐渐凸显出来。</p>
<p>2.Safe 安全</p>
<hr />
<p>这里指的也就是Kotlin带有得空安全检查，所谓的空安全检查，就是利用编译器的特性，在代码编写的阶段，在编译前就避免Java中出现的大量的空指针异常的问题，而所谓的空指针异常，也就是某一个参数，在运行的过程中，因为某种原因，导致并没有赋值或者被赋予了null值，在Java中null是一个特殊的值，如果本身接收null值的数据类型带有方法，而null作为一个特殊的值，是没有这个方法的，可是代码却要让他执行这个方法，那会显然，程序到这里就会崩溃，执行不下去了。而Kotlin，添加了空安全特性，在编译之前就进行了空安全检查，一个参数就有了可空和不可空的状态，利用？特殊符号来完成这一声明，这将在后面会详细介绍。当一个参数没有被初始化（第一次赋值）的时候，这个值在后面的使用过程中，就可能是空值。所以，编译器很容易的利用这个规则检查到了，而你，只需要在类型的声明出添加一个问号，就可以解决问题。但是，在你每一个使用这个可空类型的参数时，编译器都会提醒你，他可能为空，推荐你使用空安全检查，来完善对空值的处理，避免空指针异常。</p>
<p>3.Expressive 具有变现力</p>
<hr />
<p>Kotlin是一个拥有大量的特殊函数式的语言，而这些函数式，也为Kotlin提供了强大的变现力。首先就是解构特性。支持将list和map直接结构成多个变量，并且直接在声明处的作用域之内使用。对数据的解析大大的简短了操作。其实就是let，run，with，apply，also，将调用本身，以及返回值进行了各种组合，实现我进我出，我进他出的效果。以及takeif，针对空值处理的一个函数式。</p>
<p>4.Interoperable 具有互操作性</p>
<hr />
<p>kotlin可以与各种语言进行交互，就是它的可操作性，可以使用任何现有JVM库或框架。从Java中调用Kotlin代码，都没有任何问题。编写Kotlin代码，将其编译为JavaScript，并在浏览器中运行，以及使用现有的JavaScript API和库，使用Kotlin包装器构建具有JavaScript框架（如React）的应用程序。</p>
<p>5.Multiplatform 跨平台</p>
<hr />
<p>也就是利用可操作性直接体现出了其强大的跨平台能力，JetBrains公司推出了开发工具的全家桶，而他们退出的语言也将拥有这样的特性，可以做任何事的全家桶语言。</p>
<hr />
<h2>结语</h2>
<p>最后，语言虽然是最基础的内容，但是语言强大的特性，可以从语言的设计思维中得到不少的程序开发中的业务设计思维。接下来的时间，我会自己不定期的编写关于Kotlin语言的博客，我会尽可能的详细讲解，真正的做到让零基础的人来接触开发的大门。所以我的语言往往是很冗长啰嗦的，为的就是利用这种节奏，来给读者更多的思考，反思我讲诉的，思考自己所能理解的。不过我也明白自己也有着知识的诅咒，可能会因为自己已经掌握了某个知识点而忽略了。</p>]]></description>
    <pubDate>Wed, 02 Nov 2022 15:37:55 +0800</pubDate>
    <author>TONG</author>
    <guid>https://www.iideahub.com/?post=17</guid>
</item>
<item>
    <title>SSH断开后 服务自动停止的解决方案</title>
    <link>https://www.iideahub.com/?post=15</link>
    <description><![CDATA[<h3>1、Java -jar xxxx.jar 断开ssh 之后服务自动停止</h3>
<ul>
<li>使用 java -jar jetlinks-standalone.jar 后 服务正常使用断开ssh后，服务自动停止：</li>
<li>使用 nohup java -jar jetlinks-standalone.jar&gt;log.out &amp; 解决</li>
</ul>
<h3>2、npm start 启动项目 断开ssh之后服务自动停止</h3>
<ul>
<li>使用 npm run start:dev npm start 启动的项目 断开ssh后服务自动停止</li>
<li>使用 nohup npm run start:dev demo.jar 2&gt;&amp;1 &amp; 解决问题</li>
</ul>
<p>3、nohup &amp;退出shell终端后，服务断开</p>
<ul>
<li>nohup &amp;退出shell终端后，服务断开 退出时不要直接点叉子，要是如 exit</li>
</ul>
<p>补充：把 nohup与&amp; 结合在一起，这样就可以不挂断的永久在后台执行</p>
<pre><code>nohup java -jar demo.jar 2&gt;&amp;1 &amp;</code></pre>
<p>不挂断的后台启动 demo.jar，</p>
<p>“2&gt;&amp;1” 表示 错误和输出都传到nohup.out文件中，默认状态只把输出输出到nohup.out文件中</p>
<p>nohup 命令默认输出到nohup.out文件中</p>]]></description>
    <pubDate>Mon, 17 Oct 2022 20:09:01 +0800</pubDate>
    <author>TONG</author>
    <guid>https://www.iideahub.com/?post=15</guid>
</item>
<item>
    <title>Android开发最佳实践指南</title>
    <link>https://www.iideahub.com/?post=14</link>
    <description><![CDATA[<ol>
<li>
<p>使用<a href="https://kotlinlang.org/" title="Kotlin">Kotlin</a> —— Kotlin 是 2022 年 Android 开发的首选语言。Kotlin 自创建以来发展了很多，现在已经成为一种成熟的语言。</p>
</li>
<li>
<p>使用<a href="https://developer.android.com/jetpack/compose" title="Jetpack compose">Jetpack compose</a>— 声明式 UI 框架改变了 android 开发的思路。只需描述您的 UI，并由可组合处理它，或者更简单的方式只是告诉您想要什么，可组合相应地反映。</p>
</li>
<li>
<p>选择<a href="https://developer.android.com/kotlin/coroutines" title="Kotlin-coroutine">Kotlin-coroutine</a>而不是 RxJava——一种简单有效的线程管理方式。</p>
</li>
<li>
<p>使用<a href="https://dagger.dev/hilt/" title="Hilt">Hilt</a>进行依赖注入——减少在项目中进行手动依赖注入的样板。</p>
</li>
<li>
<p>为本地数据库使用<a href="https://developer.android.com/training/data-storage/room" title="Room">Room</a>——比 SQLiteDatabase 更好的数据持久性方法。它在 SQLite 之上提供了一个抽象层。</p>
</li>
<li>
<p>使用<a href="https://developer.android.com/topic/libraries/architecture/datastore" title="Datastore">Datastore</a>存储键值对——不要再使用SharedPreferences 了！以异步、一致和事务方式存储数据，克服了 SharedPreferences 的一些缺点。</p>
</li>
<li>
<p>使用<a href="https://square.github.io/retrofit/" title="Retrofit">Retrofit</a> for Networking—— Java 和 Kotlin 的类型安全的 rest 客户端。</p>
</li>
<li>
<p>使用<a href="https://developer.android.com/topic/libraries/architecture/workmanager" title="WorkManager">WorkManager</a>调度异步任务——即使应用程序退出或设备重启，调度工作的完美解决方案是一次性或重复运行。</p>
</li>
<li>
<p>始终衡量你的代码覆盖率——<a href="https://docs.gradle.org/current/userguide/jacoco_plugin.html" title="JaCoco">JaCoco</a>可以强大地衡量你的代码覆盖率。</p>
</li>
<li>
<p>用单元测试测试你的类——你已经知道编写单元测试的重要性。使用mockito-kotlin和junit库轻松编写测试。此外，如果尚未允许在测试期间使用模拟/存根类，请使用依赖注入。</p>
</li>
<li>
<p>使用 Espresso 测试你的 UI — Android 允许非常轻松地编写 UI 测试。添加它们并在 CI 上运行它们。</p>
</li>
<li>
<p>使用<a href="https://coil-kt.github.io/coil/" title="Coil">Coil</a>进行图像加载——著名的 Android 图像加载库由 Kotlin Coroutine 提供支持。</p>
</li>
<li>
<p>使用 CI/CD 自动化开发——CI/CD 成为使开发过程自动化的必备工具。自动执行所有手动任务，而无需过多担心。</p>
</li>
<li>
<p>使用<a href="https://ktlint.github.io/" title="ktLint">ktLint</a>进行代码格式化——具有内置格式的反自行车脱落 Kotlin linter。</p>
</li>
<li>
<p>使用MVVM架构——Model -View-ViewModel——完美解决MVP和MVC所有弊端，让代码可测试，更解耦，更易维护。</p>
</li>
<li>
<p>按功能模块化你的应用程序——更快的构建，减少样板代码，更小的和可维护的模块，更少的循环依赖，更容易导航，责任分离，以及更多的好处……</p>
</li>
<li>
<p>优先考虑应用程序安全性——通过使您的应用程序更安全，您可以帮助维护用户信任和设备完整性。查看这些对您的应用程序的安全性有重大积极影响的<a href="https://developer.android.com/topic/security/best-practices" title="安全最佳做法">安全最佳做法</a>。</p>
</li>
</ol>]]></description>
    <pubDate>Mon, 17 Oct 2022 14:43:20 +0800</pubDate>
    <author>TONG</author>
    <guid>https://www.iideahub.com/?post=14</guid>
</item></channel>
</rss>