<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>独狼开发日志</title><description>记录独立开发的每一步</description><link>https://blog.coding1024.cn/</link><language>zh_CN</language><item><title>AI编程有感</title><link>https://blog.coding1024.cn/posts/e958102a/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/e958102a/</guid><description>从22年至今，AI走进我们普通程序员的工作已经有4年了，现如今已经彻底改变了我们的工作方式。从工作效率，到代码规范，甚至是架构设计，都翻了个地朝天。一些我们以前认为是很蠢的方法，现在突然变得特别适用。 最简单的一个例子，多语言本地化，以前我们都会找各种插件，甚至是调用a</description><pubDate>Wed, 10 Jun 2026 10:52:18 GMT</pubDate><content:encoded>&lt;p&gt;从22年至今，AI走进我们普通程序员的工作已经有4年了，现如今已经彻底改变了我们的工作方式。从工作效率，到代码规范，甚至是架构设计，都翻了个地朝天。一些我们以前认为是很蠢的方法，现在突然变得特别适用。&lt;/p&gt;
&lt;p&gt;最简单的一个例子，多语言本地化，以前我们都会找各种插件，甚至是调用api自动翻译等。现在直接ai生成翻译文本，直接一种语言一个文本，就这么简单粗暴，任何插件都不需要。放以前人工去维护翻译文本几乎是不可能的，现在有ai这都不叫事。&lt;/p&gt;
&lt;p&gt;游戏战斗系统的实现，以前我们都会嫌弃用脚本的方式来，每一个技能写一个脚本好难维护，费时费力不说，还容易出bug。我当时使用行为树这种方案(类似蓝图)来实现战斗内的一切逻辑，技能，子弹，buff这些，还专门写了一个行为树编辑器。实践下来，效果还是比较理想的。现在复盘一下，让我再重新写战斗系统，我绝不会再考虑用行为树或蓝图，直接让ai撸脚本。&lt;/p&gt;
&lt;p&gt;我在做的是SLG游戏，最近策划给我们提了一近乎变态的需求：我们已经有了一个slg大地图功能(业务代码非常复杂)，策划提出的需求是，再做一个小型的slg地图玩法，需要复用slg大地图的行军，交战等基础逻辑，但是玩法上又有很大的不同。在架构设计上，我面临这几种选择：
1.在直接复用现有这套代码，业务层做兼容处理。
2.对现有的代码做抽象，把公共的逻辑抽象出来，给新玩法用。
3.把现有的代码复制粘贴一份出来，在这个基础上改。
如果放在以前，论优雅，那就是2大于1远远大于3。3就是架构设计的大忌，复制粘贴代码就是屎山中的屎山，策划以后每出一种新玩法就复制一份代码，根本无法维护。但现在我会毫不犹豫的选择3，我只需要维护其中主要的玩法那一份代码，其它的衍生玩法的代码全部让ai照着主代码依葫芦画瓢改就行。&lt;/p&gt;
&lt;p&gt;总结就是，很多以前我自我感觉很牛逼的奇技淫巧，在ai面前都变得班门弄斧，不值一提。&lt;/p&gt;
</content:encoded></item><item><title>浅谈务实的游戏程序员该如何做优化</title><link>https://blog.coding1024.cn/posts/9dfa69e1/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/9dfa69e1/</guid><description>近期面试了一些后端程序，问了些优化方面的问题，我发现很多人都答不好这个问题。 先来定义一下，什么样的程序员能称之为务实。对于游戏项目来说，进度是至关重要的一个因素，所以一个务实的程序员，应当能快速解决遇到的问题，快速交付稳定的代码，而可具备一定可以维护性，以应对策划多变</description><pubDate>Thu, 16 Oct 2025 09:24:42 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;近期面试了一些后端程序，问了些优化方面的问题，我发现很多人都答不好这个问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先来定义一下，什么样的程序员能称之为务实。对于游戏项目来说，进度是至关重要的一个因素，所以一个务实的程序员，应当能快速解决遇到的问题，快速交付稳定的代码，而可具备一定可以维护性，以应对策划多变的需求。&lt;/p&gt;
&lt;p&gt;举个例子，在面试中有个候选人跟我说，他做过一个背包的优化，就是原本是的结构是字典的形式，如{name:&quot;道具1&quot;, lv:1, num:99}，为了节省空间，他把这个结构改成数组的形式：[&quot;道具1&quot;, 1, 99]，以此减少了冗余的key。然后在外面再封装了api去访问字典的字段。&lt;/p&gt;
&lt;p&gt;问题来了，这样的优化真的有必要吗。可能这个优化，对于背包这个系统确实减少了一半的内存。但是，我们需要考虑一个问题是，这个背包系统，在整个玩家数据里，真能占那么大比例吗。假如，背包的数据只占到总内存的2%，那这个优化做完了之后，变成1%，从整体来看，只让内存占用下降了1%，却带来了代码维护上的困难，以及拖慢的项目的进度，这是得不偿失的一件事。&lt;/p&gt;
&lt;p&gt;以下是我关于优化的一些观点：&lt;/p&gt;
&lt;p&gt;1.在游戏的研发阶段，优化是优先级最低的，我们不应该主动去做优化，开发效率和可维护性是高于优化的，除非某一个功能遇到了瓶颈。&lt;/p&gt;
&lt;p&gt;2.我们需要了解客户端和服务器的瓶颈分别是什么：&lt;/p&gt;
&lt;p&gt;客户端的瓶颈通常是在内存，不仅缓存了逻辑数据，还有图片，模型，字体这些资源，在客户端的进程通常只能分配非常有限的内存，所以客户端的优化通常是用时间换取空间。需要用到数据或者资源，才动态加载。&lt;/p&gt;
&lt;p&gt;而服务端的瓶颈通常是CPU，服务器需同时面对成千上万的客户端，对于某些特定的框架(如skynet)，如果CPU有一个核跑满100%，就会导致部分功能出现明显卡顿。所以优化的方式倾向于空间换时间，在服务器启动的时候，把数据都准备好缓存起来，这样不仅逻辑更简单，更能节省运行时的CPU运算。&lt;/p&gt;
&lt;p&gt;3.优化是无尽头的，我们在做优化之前，应该先明确所有前置条件，如数据的规模量，调用的频率。举例：服务器承载的玩家数量上限是多少，场景有多大，最多需要容纳多少个对象，玩家操作的频率。所有的优化应该紧紧围绕这些前置条件来进行，不要做吃力不讨好的优化。比如，1个服就容纳1000个玩家，排行榜就只取top100，这玩意你说要用到红黑树去排序，不纯扯(我就干过这种蠢事，还傻傻的改造了红黑树的算法去实现排名)&lt;/p&gt;
&lt;p&gt;4.除了性能的优化，还有代码结构的优化，或者叫重构代码。重构我认为应该尽早进行，让接口变得清晰，好用，可以延迟屎山的到来(虽然我依旧认为不可避免的所有的项目都会变成屎山)。&lt;/p&gt;
&lt;p&gt;总结：优化这个东西，适可而止，能不做就不做。这个世界就是一个草台班子，老板不会因为你提高了1%的性能给你加鸡腿。&lt;/p&gt;
</content:encoded></item><item><title>在Ubuntu上关闭透明大页（转)</title><link>https://blog.coding1024.cn/posts/4827ed55/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/4827ed55/</guid><description>在 Ubuntu 上关闭透明大页（Transparent HugePages, THP）主要有两种方法：临时关闭（重启后失效）和永久关闭。下面我为你详细说明操作步骤，并补充一些注意事项。 透明大页（THP）管理指南 🔧 1. 检查当前 THP 状态 在开始操作前，建议先</description><pubDate>Tue, 23 Sep 2025 08:22:28 GMT</pubDate><content:encoded>&lt;p&gt;在 Ubuntu 上关闭透明大页（Transparent HugePages, THP）主要有两种方法：临时关闭（重启后失效）和永久关闭。下面我为你详细说明操作步骤，并补充一些注意事项。&lt;/p&gt;
&lt;p&gt;透明大页（THP）管理指南&lt;/p&gt;
&lt;p&gt;🔧 1. 检查当前 THP 状态&lt;/p&gt;
&lt;p&gt;在开始操作前，建议先检查一下当前系统的 THP 状态。打开终端，输入以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /sys/kernel/mm/transparent_hugepage/enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出中包含 [always] 或 [madvise]，表示 THP 处于启用状态；如果显示 always madvise [never]，则表示 THP 已被禁用。&lt;/p&gt;
&lt;p&gt;⚡ 2. 临时关闭 THP（重启后失效）&lt;/p&gt;
&lt;p&gt;如果只是想立即关闭 THP 进行测试，可以使用以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag  # 建议同时也关闭碎片整理
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：这种方法只在当前运行 session 中有效，服务器或电脑重启后 THP 又会重新启用。&lt;/p&gt;
&lt;p&gt;🔒 3. 永久关闭 THP&lt;/p&gt;
&lt;p&gt;以下两种方法可以实现永久关闭，推荐使用第一种（修改 GRUB），因为它更通用和标准。&lt;/p&gt;
&lt;p&gt;方法一：通过修改 GRUB 配置（推荐）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编辑 GRUB 配置文件：&lt;pre&gt;&lt;code&gt;sudo nano /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;找到 GRUB_CMDLINE_LINUX_DEFAULT 或 GRUB_CMDLINE_LINUX 行，在其引号内的参数中添加 transparent_hugepage=never。例如：&lt;pre&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet splash transparent_hugepage=never&quot;
# 或者
GRUB_CMDLINE_LINUX=&quot;transparent_hugepage=never&quot;
&lt;/code&gt;&lt;/pre&gt;
如果还需要关闭 NUMA（在某些数据库场景下建议），可以一并添加 numa=off。&lt;/li&gt;
&lt;li&gt;保存文件后，更新 GRUB：&lt;pre&gt;&lt;code&gt;sudo update-grub
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;重启系统：&lt;pre&gt;&lt;code&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;方法二：通过 systemd 服务或 rc.local（备用方案）&lt;/p&gt;
&lt;p&gt;某些特定应用（如 MongoDB）会推荐使用此方法。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建一个 systemd 服务文件（例如 /etc/systemd/system/disable-thp.service）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c &apos;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled &amp;amp;&amp;amp; echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/defrag&apos;

[Install]
WantedBy=basic.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你也可以选择使用 rc.local（如果系统支持）：
编辑 /etc/rc.local 文件（如果没有则创建），在 exit 0 这一行之前添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/defrag
fi
```[citation:5]
并确保 `rc.local` 文件有可执行权限。

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启用并启动服务（如果使用 systemd 方式）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable disable-thp.service
sudo systemctl start disable-thp.service
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启系统以确保更改生效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;✅ 4. 验证关闭状态&lt;/p&gt;
&lt;p&gt;重启后，再次运行检查命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /sys/kernel/mm/transparent_hugepage/enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果成功，输出应显示为 always madvise [never]，表明 THP 已被禁用。&lt;/p&gt;
&lt;p&gt;⚠️ 4. 注意事项&lt;/p&gt;
&lt;p&gt;· 为什么关闭 THP：THP 旨在自动管理大内存页，但某些应用（如 Oracle数据库、MongoDB、Redis、Hadoop 等）已知与其存在兼容性问题，可能导致性能下降、内存延迟或异常开销。关闭 THP 可以避免这些潜在问题。
· 性能权衡：对于某些其他工作负载，THP 可能有益。除非你遇到特定问题或有应用明确要求，否则无需禁用。通常只有在运行上述特定企业级软件时才建议关闭。
· 关闭 Defrag：建议同时将 enabled 和 defrag 都设置为 never。
· NUMA：在某些数据库应用场景中，有时会建议同时关闭 NUMA（numa=off），但这与 THP 是独立的配置，请根据你的具体软件建议决定。&lt;/p&gt;
&lt;p&gt;💎 总结&lt;/p&gt;
&lt;p&gt;关闭 Ubuntu 的透明大页并不复杂。通常而言，修改 GRUB 配置是最常用且一劳永逸的方法。完成操作后，务必重启系统并验证状态。&lt;/p&gt;
&lt;p&gt;如果你在操作过程中遇到任何问题，或者想知道更多关于你的特定应用为何需要关闭 THP 的细节，我很乐意提供进一步帮助。&lt;/p&gt;
</content:encoded></item><item><title>Nginx端口转发的坑</title><link>https://blog.coding1024.cn/posts/ef62fe3f/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/ef62fe3f/</guid><description>最近在配置Nginx转发端口的时候踩了个大坑，记录一下 需求是这样的，我们游戏服务器使用的wss协议，需要用nginx进行大量的端口转发，如wss://xxx.com/10000 转发到 ws://xxx.com:10000，后面的端口范围是10000到11000，我不</description><pubDate>Tue, 01 Apr 2025 08:33:20 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近在配置Nginx转发端口的时候踩了个大坑，记录一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需求是这样的，我们游戏服务器使用的wss协议，需要用nginx进行大量的端口转发，如wss://xxx.com/10000 转发到 ws://xxx.com:10000，后面的端口范围是10000到11000，我不想写1000条这样的规则，于是我在网上找了这样一段代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location ~* ^/(?&amp;lt;port&amp;gt;\d+)$ {
    proxy_pass http://127.0.0.1:$port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &quot;Upgrade&quot;;
    proxy_set_header Host $host;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;咋一看，好像确实能用，就是把/port替换成:port。之后被同事发现了，惊呼我艹，这特么相当于在公网裸奔。服务器的安全组虽然设置了只对外开放10000到11000端口，但是这段代码，相当于在用户可以通过nginx的80或者443端口，间接访问到任意端口！当服务器的规模还小的时候，一切都正常，但是当用户量上去了，一定会被扫，一旦被扫到一些敏感端口，后果不堪设想。&lt;/p&gt;
&lt;p&gt;如何解决这个问题，首先想到的是用if语句，但在Nginx社区中有一个说法&quot;If Is Evil&quot;（if是邪恶的），因为在某些复杂情况下if语句可能导致意外行为。所以我最终采取匹配数字的方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location ~* ^/(?&amp;lt;port&amp;gt;(20[0-9]\{3\}))$ {
    proxy_pass http://127.0.0.1:$port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &quot;Upgrade&quot;;
    proxy_set_header Host $host;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;意思是0到9这一区段数值重复3个，也就是10000-10999的端口能匹配上，这样子其它端口就匹配不上，或者：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location ~* ^/(?&amp;lt;port&amp;gt;2[0-1]\d\d\d)$ {
    proxy_pass http://127.0.0.1:$port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &quot;Upgrade&quot;;
    proxy_set_header Host $host;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Unity更新Google结算库6.2.1</title><link>https://blog.coding1024.cn/posts/76580d95/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/76580d95/</guid><description>最近谷歌商店强制要求所有应用在8月31日前更新结算库更新到版本6，我在Unity Package Manager更新IAP到4.12.0，发现打包安卓的时候编译失败。论坛上发现其它人也有一样的问题，Unity官方还未修复此问题，只能退回4.11.0，手动更新Google</description><pubDate>Tue, 16 Jul 2024 07:48:02 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近谷歌商店强制要求所有应用在8月31日前更新结算库更新到版本6，我在Unity Package Manager更新IAP到4.12.0，发现打包安卓的时候编译失败。论坛上发现其它人也有一样的问题，Unity官方还未修复此问题，只能退回4.11.0，手动更新Google结算库了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;IAP退回4.11.0&lt;/h2&gt;
&lt;p&gt;在Package Manager中回退到4.11.0&lt;/p&gt;
&lt;h2&gt;下载aar&lt;/h2&gt;
&lt;p&gt;在这里下载billing的aar文件 https://maven.google.com/web/index.html?q=billing#com.android.billingclient:billing:6.2.1&lt;/p&gt;
&lt;h2&gt;替换aar&lt;/h2&gt;
&lt;p&gt;1.把billing:6.2.1.aar拷贝到Asset目录下，这时候会自动生成同名的meta文件
2.在项目文件夹中搜索billing，找到billing:5.2.1.aar的所在目录(注意，它的同级目录下还有一个同名meta文件),这把两个文件删除，并把billing:6.2.1.aar和billing:6.2.1.aar.meta文件移动到该目录&lt;/p&gt;
&lt;h2&gt;更新build.gradle&lt;/h2&gt;
&lt;p&gt;打开build.gradle，把billing:5.2.1改成billing:6.2.1。搞定收工！&lt;/p&gt;
</content:encoded></item><item><title>IOS访问Document Directory(沙箱目录)</title><link>https://blog.coding1024.cn/posts/bb92b2a1/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/bb92b2a1/</guid><description>iOS11之后，在Plist中设置LSSupportsOpeningDocumentsInPlace和UIFileSharingEnabled为YES，可以从系统的Files应用中访问应用的Documents目录。 从系统的文件打开，查看我的iPhone，开启了此功能的</description><pubDate>Mon, 29 Jan 2024 01:50:51 GMT</pubDate><content:encoded>&lt;p&gt;iOS11之后，在Plist中设置LSSupportsOpeningDocumentsInPlace和UIFileSharingEnabled为YES，可以从系统的Files应用中访问应用的Documents目录。
&lt;img src=&quot;/media/bb92b2a1/creator-path.png&quot; alt=&quot;&quot; /&gt;
从系统的文件打开，查看我的iPhone，开启了此功能的应用可以从这里面看到这个文件夹，这个文件夹是从应用内部的沙箱目录链接过来的，应用删除后会被随之删除。&lt;/p&gt;
</content:encoded></item><item><title>Unity接入Admob</title><link>https://blog.coding1024.cn/posts/1621995/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/1621995/</guid><description>细节参考文档 + 官方文档(https://developers.google.com/admob/unity/quick-start?hl=zh-cn) + Github示例(https://github.com/googleads/googleads-mobile-</description><pubDate>Fri, 19 Jan 2024 17:56:48 GMT</pubDate><content:encoded>&lt;h1&gt;细节参考文档&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/admob/unity/quick-start?hl=zh-cn&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/googleads/googleads-mobile-unity&quot;&gt;Github示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装依赖&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Assets -&amp;gt; Google Mobile Ads -&amp;gt; Android -&amp;gt; Resolve&lt;/li&gt;
&lt;li&gt;Assets -&amp;gt; Google Mobile Ads -&amp;gt; IOS -&amp;gt; cocopads&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;报错&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Build Settings &amp;gt; Player Setting &amp;gt; Publishing Settings &amp;gt; Custom Progurard File&lt;/p&gt;
&lt;p&gt;proguard-user.txt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-keep class com.google.unity.** {
   *;
}
-keep public class com.google.android.gms.ads.**{
   public *;
}
-keep public class com.google.ads.**{
   public *;
}
-keepattributes *Annotation*
-dontobfuscate
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>docker设置代理</title><link>https://blog.coding1024.cn/posts/753c22c6/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/753c22c6/</guid><description>在linux下部署clash 如何在 Linux 上优雅的使用 Clash？(https://blog.zzsqwq.cn/posts/how-to-use-clash-on-linux/) 为 dockerd 设置网络代理 &quot;docker pull&quot; 命令是由 doc</description><pubDate>Fri, 25 Aug 2023 06:20:46 GMT</pubDate><content:encoded>&lt;h1&gt;在linux下部署clash&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.zzsqwq.cn/posts/how-to-use-clash-on-linux/&quot;&gt;如何在 Linux 上优雅的使用 Clash？&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;为 dockerd 设置网络代理&lt;/h1&gt;
&lt;p&gt;&quot;docker pull&quot; 命令是由 dockerd 守护进程执行。而 dockerd 守护进程是由 systemd 管理。因此，如果需要在执行 &quot;docker pull&quot; 命令时使用 HTTP/HTTPS 代理，需要通过 systemd 配置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为 dockerd 创建配置文件夹。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;为 dockerd 创建 HTTP/HTTPS 网络代理的配置文件，文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 。并在该文件中添加相关环境变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Service]
Environment=&quot;HTTP_PROXY=http://proxy.example.com:8080/&quot;
Environment=&quot;HTTPS_PROXY=http://proxy.example.com:8080/&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1,.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;刷新配置并重启 docker 服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;为 docker 容器设置网络代理&lt;/h1&gt;
&lt;p&gt;在容器运行阶段，如果需要使用 HTTP/HTTPS 代理，可以通过更改 docker 客户端配置，或者指定环境变量的方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更改 docker 客户端配置：创建或更改 ~/.docker/config.json，并在该文件中添加相关配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
 &quot;proxies&quot;:
 {
   &quot;default&quot;:
   {
     &quot;httpProxy&quot;: &quot;http://proxy.example.com:8080/&quot;,
     &quot;httpsProxy&quot;: &quot;http://proxy.example.com:8080/&quot;,
     &quot;noProxy&quot;: &quot;localhost,127.0.0.1,.example.com&quot;
   }
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;指定环境变量：运行 &quot;docker run&quot; 命令时，指定相关环境变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run --env HTTP_PROXY=&quot;http://proxy.example.com:8080/ --env HTTPS_PROXY=&quot;http://proxy.example.com:8080/&quot; --env NO_PROXY=&quot;localhost,127.0.0.1,.example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;为 docker build 过程设置网络代理&lt;/h1&gt;
&lt;p&gt;在容器构建阶段，如果需要使用 HTTP/HTTPS 代理，可以通过指定 &quot;docker build&quot; 的环境变量，或者在 Dockerfile 中指定环境变量的方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &quot;--build-arg&quot; 指定 &quot;docker build&quot; 的相关环境变量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker build \
    --build-arg &quot;HTTP_PROXY=http://proxy.example.com:8080/&quot; \
    --build-arg &quot;HTTPS_PROXY=http://proxy.example.com:8080/&quot; \
    --build-arg &quot;NO_PROXY=localhost,127.0.0.1,.example.com&quot; .
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;更多docker教程&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://yeasy.gitbook.io/docker_practice/&quot;&gt;Docker从入门到实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>从LightShowCreator导出xLights项目</title><link>https://blog.coding1024.cn/posts/4ac7aace/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/4ac7aace/</guid><description>大家好，今天我给大家分享一个超实用的教程，教你如何从LightShowCreator导出xLights项目，让你的特斯拉灯光秀更加个性化！我们都知道xLights可以自定义非常酷炫的灯光秀，但是操作起来可能有些繁琐。因此，我开发了一款自动生成灯光秀的APP，让你轻松制作</description><pubDate>Wed, 02 Aug 2023 15:52:41 GMT</pubDate><content:encoded>&lt;p&gt;大家好，今天我给大家分享一个超实用的教程，教你如何从LightShowCreator导出xLights项目，让你的特斯拉灯光秀更加个性化！我们都知道xLights可以自定义非常酷炫的灯光秀，但是操作起来可能有些繁琐。因此，我开发了一款自动生成灯光秀的APP，让你轻松制作特斯拉灯光秀。&lt;/p&gt;
&lt;p&gt;不少用户建议我给LightShowCreator添加类似xLights的时间轴来编辑帧，但我深思熟虑后认为，LightShowCreator的宗旨是以娱乐化和简单化为主，添加时间轴可能会让APP变得臃肿，而且在手机上难以实现与xLights一样的精细操作。考虑到这部分用户的需求，我在LightShowCreator中加入了导出xsq文件的功能，完全兼容xLights。
&lt;img src=&quot;/media/4ac7aace/manual-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下面是具体的教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在LightShowCreator中，先导入你喜欢的音乐，并使用自动模式或者手动模式生成灯光秀。导出时会得到三个文件：lightshow.wav、lightshow.fseq和lightshow.xsq。将这三个文件拷贝到电脑的同一个文件夹备用。
&lt;img src=&quot;/media/4ac7aace/export-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开xLights软件，请务必下载最新版本的xLights和特斯拉开源项目的最新工程文件。目前APP导出的xsq适配的是Apr 27, 2023提交的版本。你可以从此链接下载：https://github.com/teslamotors/light-show/blob/09601c577f838e84320faff8ea3a7266af783f56/xlights/tesla_xlights_show_folder.zip
&lt;img src=&quot;/media/4ac7aace/xLights-select-file.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在xLights中点击“文件(File)”-&amp;gt;“打开序列(Open Sequence)”，选择LightShowCreator导出的lightshow.fseq文件。请务必确保打开的是lightshow.fseq，而不是lightshow.xsq。之后在View下拉菜单选择OldView，你会发现xLights里已经出现了很多自动生成的帧，接下来你可以用xLights进行更加精细的编辑。
&lt;img src=&quot;/media/4ac7aace/xLights-select-oldview.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果在导入时遇到问题，请务必注意以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将LightShowCreator导出的三个文件放到同一个文件夹中（mp3/wav，fseq和xsq）。&lt;/li&gt;
&lt;li&gt;确保你用的xLights版本是从Github上下载的2023年最新版本(https://github.com/teslamotors/light-show)。使用2021年版本可能会导致不兼容的情况。&lt;/li&gt;
&lt;li&gt;在导入时选择&quot;lightshow.fseq&quot;，而不是&quot;lightshow.xsq&quot;，否则可能会出现警告并丢失数据。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;希望这个教程对你有帮助，享受制作特斯拉灯光秀的乐趣吧！如果你还有其他问题或需求，随时联系我，期待你的反馈和精彩灯光秀作品！&lt;/p&gt;
</content:encoded></item><item><title>Light Show Creator 使用手册</title><link>https://blog.coding1024.cn/posts/4ca667d5/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/4ca667d5/</guid><description>自定义灯光秀是特斯拉汽车的一项很酷的功能。 LightShowCreator是一款可以快速轻松制作灯光秀的APP。 如果您对它感兴趣，您也可以尝试用它来定制你自己的节目。 + App Store(https://apps.apple.com/us/app/light-s</description><pubDate>Sat, 29 Jul 2023 16:32:22 GMT</pubDate><content:encoded>&lt;p&gt;自定义灯光秀是特斯拉汽车的一项很酷的功能。 LightShowCreator是一款可以快速轻松制作灯光秀的APP。 如果您对它感兴趣，您也可以尝试用它来定制你自己的节目。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/light-show-creator/id6446385602&quot;&gt;App Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/light-show-creator/id6446385602&quot;&gt;Google Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/store/productId/9PL28B7M856D&quot;&gt;Microsoft Store&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/preview.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;U盘要求&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;必须包含一个名为“LightShow”的基本文件夹（解压从该项目下载的 LightShow.zip）&lt;/li&gt;
&lt;li&gt;必须格式化为 exFAT、FAT 32（适用于 Windows）、MS-DOS FAT（适用于 Mac）、ext3 或 ext4。 当前不支持 NTFS。&lt;/li&gt;
&lt;li&gt;根目录不得包含的 TeslaCam 文件夹。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特斯拉官方指南: https://github.com/teslamotors/light-show&lt;/p&gt;
&lt;h1&gt;如何创建新项目&lt;/h1&gt;
&lt;p&gt;打开“项目”页面，点击“新建项目”按钮，输入项目名称&lt;/p&gt;
&lt;h1&gt;如何导入音乐&lt;/h1&gt;
&lt;p&gt;关于格式选择，虽然有mp3和wav两种格式，这里建议尽量使用wav，部分mp3格式会有问题。&lt;/p&gt;
&lt;h2&gt;Android&lt;/h2&gt;
&lt;p&gt;如果您的系统是Android，您可直接从文件系统里选择一首不超于5分钟的mp3或者wav文件来导入。&lt;/p&gt;
&lt;h2&gt;IOS&lt;/h2&gt;
&lt;p&gt;如果您的系统是IOS，您有两种导入音乐的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将第三方APP的音乐分享到本APP&lt;/li&gt;
&lt;li&gt;将音乐复制到LightShowCreator目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是具体例子：&lt;/p&gt;
&lt;p&gt;通过复制导入音乐
您需要使用苹果官方APP“文件”进行管理。 如果您的设备中没有安装“文件”，您可以前往Appstore获取&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/files-app.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开“文件”APP后，点击“我的iPhone”
&lt;img src=&quot;/media/4ca667d5/paths.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击“LightShowCreator”目录
&lt;img src=&quot;/media/4ca667d5/creator-path.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在“LightShowCreator”目录中，“music”是存放导入音乐的目录，将音乐复制到这里即可。
&lt;img src=&quot;/media/4ca667d5/main-dir.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上一步点击分享后，系统会切换到Light Show Creator，点击“音乐”页面，几秒钟之内你选择的音乐就会出现在这个列表中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/music-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;通过第三方APP分享音乐&lt;/h1&gt;
&lt;p&gt;任何支持文件共享功能的第三方APP，例如OneDrive、GoogleDrive、Dropbox等。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/share-01.png&quot; alt=&quot;&quot; /&gt;
单击“使用其他应用程序打开”并选择 LightShowCreator。
&lt;img src=&quot;/media/4ca667d5/share-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;之后音乐将出现在列表中。 现在点击你想要使用的音乐，到这里，音乐导入就完成了
&lt;img src=&quot;/media/4ca667d5/select-music.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何使用自动模式&lt;/h1&gt;
&lt;p&gt;自动模式的使用非常简单，只需点亮“自动”按钮，灯光就会根据音乐的节奏自动点亮。
&lt;img src=&quot;/media/4ca667d5/auto.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;您还可以调整一些参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step time：每帧的持续时间，越大越节省内存&lt;/li&gt;
&lt;li&gt;节奏敏感度：对音乐节奏的敏感程度，理论上内存越小越少&lt;/li&gt;
&lt;li&gt;节拍时间：每次灯亮的最大时间，越大越节省内存&lt;/li&gt;
&lt;li&gt;雾灯开关（标配续Model 3和Model Y没有前雾灯，关闭此选项会更有效）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;如何使用手动模式&lt;/h1&gt;
&lt;p&gt;手动模式可以进行更加个性化的编辑，就像弹钢琴一样，非常简单。 两个对称的车灯为一组，黑键同时点亮，白键在声音一侧点亮。
&lt;img src=&quot;/media/4ca667d5/manual-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;手动录制的同时，还可以启动自动模式，只需要自己控制几个关键灯即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/manual-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何导出灯光秀文件&lt;/h1&gt;
&lt;p&gt;导出灯光秀的原理与导入音乐相同，也是通过分享功能发送到第三方App。 我们以 OneDrive 为例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/4ca667d5/export-01.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/media/4ca667d5/export-02.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/media/4ca667d5/export-03.png&quot; alt=&quot;&quot; /&gt;
另外，灯光秀文件也会导出到文件系统中。 在IOS中，导出路径为：“LightShowCreator/export/”，而在Android中，导出路径为：“Downloads/LightShowExport/”。&lt;/p&gt;
&lt;p&gt;如果你想抛弃电脑设备，随时随地用手机打造灯光秀，那么我强烈建议你购买一个lighting或者type-c to usb转接头，像这样：
&lt;img src=&quot;/media/4ca667d5/export-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何使用 xLights 进行更精细的编辑&lt;/h1&gt;
&lt;p&gt;目前我们的APP不支持渐变效果和门窗控制。 如果您有这个需求，可以将lightshow.wav/mp3、lightshow.fseq、lightshow.xsq这三个文件放到PC设备的同一目录下，然后用xLights打开。&lt;/p&gt;
&lt;h1&gt;Q&amp;amp;A&lt;/h1&gt;
&lt;h3&gt;手动模式下，音乐节奏太快跟不上节拍怎么办？&lt;/h3&gt;
&lt;p&gt;您可以在设置页面设置音乐播放速度&lt;/p&gt;
&lt;h3&gt;为什么Windows版本不支持手动模式？&lt;/h3&gt;
&lt;p&gt;windows近期没有更新计划，因为windows不支持触摸屏，这与移动版本有很大不同。&lt;/p&gt;
&lt;h3&gt;有没有什么好的办法可以做到多车联动性能&lt;/h3&gt;
&lt;p&gt;我们在后续的版本规划中已经规划了这个功能。 目前有一个建议，你可以将你的音乐分成多个曲目，然后创建多个项目，并使用自动模式的功能，这样你就可以快速创建多个汽车。&lt;/p&gt;
</content:encoded></item><item><title>Unity接入IAP内购支付</title><link>https://blog.coding1024.cn/posts/784a9c64/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/784a9c64/</guid><description>Google Play 上传一个带BILLING权限的包 在AndroidMainfest.xml加入 上传APK审核通过后，在Google Play Console 创建商店，或订阅项目 安装Unity IAP Window - Package Manager - U</description><pubDate>Tue, 11 Apr 2023 15:22:39 GMT</pubDate><content:encoded>&lt;h1&gt;Google Play&lt;/h1&gt;
&lt;h2&gt;上传一个带BILLING权限的包&lt;/h2&gt;
&lt;p&gt;在AndroidMainfest.xml加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;com.android.vending.BILLING&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上传APK审核通过后，在Google Play Console 创建商店，或订阅项目&lt;/p&gt;
&lt;h2&gt;安装Unity IAP&lt;/h2&gt;
&lt;p&gt;Window -&amp;gt; Package Manager -&amp;gt; Unity Registry&lt;/p&gt;
&lt;p&gt;选择In App Purchasing安装&lt;/p&gt;
&lt;h2&gt;检查Unity Player 设置：&lt;/h2&gt;
&lt;p&gt;在 Unity 编辑器中，转到 Edit -&amp;gt; Project Settings -&amp;gt; Player。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 Other Settings 部分，确保你的 Scripting Backend 设置为 IL2CPP（在大多数情况下是推荐的）。&lt;/li&gt;
&lt;li&gt;在 Configuration 部分，确保 API Compatibility Level 设置为 .NET Standard 2.0 或更高版本。&lt;/li&gt;
&lt;li&gt;确保包名对的上&lt;/li&gt;
&lt;li&gt;勾选Build App Bundle(GooglePlay)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;添加Google License Key&lt;/h2&gt;
&lt;p&gt;key在Google Play Console的创收设置页面可找到，在Unity Dashboard的项目设置里的In-app purchase (IAP) settings里设置(不要在Unity里设置，Unity的设置面板可能会有报错，忽视它)&lt;/p&gt;
&lt;h2&gt;添加在Google Play Console添加测试账号&lt;/h2&gt;
&lt;p&gt;主页-&amp;gt;测试许可-&amp;gt;许可测试人员（自动生成）&lt;/p&gt;
&lt;p&gt;注意，中国区的账号是不能支付的，另外，测试许可不是内测人员，要区分开来。&lt;/p&gt;
&lt;h2&gt;测试&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Play 需要发布内测版本，从商店下载测试才能生效！&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>游戏编程随想</title><link>https://blog.coding1024.cn/posts/52dda49a/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/52dda49a/</guid><description>这段时间赋闲在家，对近些年的工作进行了复盘。工作么多年，一点小心得，分享一下。 如何定义一个能力很强的游戏程序员 + 拥有很强的battle能力，从根本上去说服一个人，改变一个人的看法，让他配合自己的工作，这个非常难（反例:级别压制，我是你是上级，或者我的上级要求这么做</description><pubDate>Tue, 21 Feb 2023 15:18:19 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;这段时间赋闲在家，对近些年的工作进行了复盘。工作么多年，一点小心得，分享一下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;如何定义一个能力很强的游戏程序员&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;拥有很强的battle能力，从根本上去说服一个人，改变一个人的看法，让他配合自己的工作，这个非常难（反例:级别压制，我是你是上级，或者我的上级要求这么做），更高阶是做倒知己知彼，站在多方角度考虑，给出靠谱方案。&lt;/li&gt;
&lt;li&gt;具备一定的前瞻性，在设计框架的时候充分考虑到将来的迭代计划，能预计到将来策划可能会提什么样的需求（纵使策划现在矢口否认），在现有的框架下，尽可能快的满足策划的需求。&lt;/li&gt;
&lt;li&gt;独当一面的能力，在项目的某一个方面或者某个模块，做到事无巨细，是团队里最熟悉这一模块的一员，不仅能出色得完成份内工作，还能驱动需求的迭代，给其它岗位的同事提出建议和解决方案。&lt;/li&gt;
&lt;li&gt;工作效率高，善用各类工具或者能自己写一些自动化工具进行编码，测试等。具体体现在，交付速度快，bug少，返工少，加班少。&lt;/li&gt;
&lt;li&gt;攻坚能力，有能解决核心问题，如关键算法，修复致命bug。&lt;/li&gt;
&lt;li&gt;知识面要广，不拘限于某种单一的语言或者技术。每一种语言或者技术都有它擅长的邻域，只要把它用在恰当的地方即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;如何定义一个能力很强的主程&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;首先应该是一个能力很强的程序员plus&lt;/li&gt;
&lt;li&gt;具备很强的识人能力，在短短的面试阶段，能甄别出真正适合自己团队的人才，所谓的适合不是面试笔试对答如流，而是具备上面说的优秀程序员的特性，或者非常有潜力成为这样的程序。&lt;/li&gt;
&lt;li&gt;合理的安排任务，不把下属当工具人：根据团队成员的特性指派合适的任务，并给予高度自主权，所谓的合适，可能是该程序在某一方面的特长，或者是某一方面的技能需要历练，在出色的完成工作同时能得到能力上的提升。&lt;/li&gt;
&lt;li&gt;把控进度的能力。对于完成策划需求的用时预估要准确，在给下属留有一定缓冲的同时，尽可能早的让策划看到原型。&lt;/li&gt;
&lt;li&gt;对游戏有深刻理解，知道策划最终想要什么，还有他们此时此刻最想要什么。这有助于版本的快速迭代和上面说的进度把控。&lt;/li&gt;
&lt;li&gt;留得往人。给下属争取更多的利益，给下属足够的发展空间。很简单直接，要么钱给够，要么不让人受委屈。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;关于开源&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;代码就像是程序员的底裤，不能随便给人看的。代码开源，就是把自己的内裤扒出来给人看。秀出来的，一定是很屌的东西。&lt;/li&gt;
&lt;li&gt;不能为了开源而开源。开源应该是一个造轮子的过程，这个轮子不能重复造。一定是因为某个项目，或者库，可能会对别人有帮助。不能是说，以前我做了个很牛很牛的项目，现在把它的代码开源，来炫一下技。还有一些通过歪门邪道来骗赞的就不说了。&lt;/li&gt;
&lt;li&gt;开源可以让自己的综合能力得到迅速提高。开源，其实说白了就是相互白嫖的过程。社区里什么牛马蛇神都有，大家共同维护一个项目，无私奉献和拿来主意都能各取所需，大家者有各自的需求。在这里，每设计一个接口，每提供一个功能，都会不由自主的考虑，这是不是大部分人想要的？会不会让项目变能冗余？能不能做的更通用点？扩展性好不好？等等这些问题，我们的自己的闭源项目里是很少思考的。长期以往，就会本能的写出更优质的代码，我们程序员最向往的高内聚，低耦合的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;如何提升业务开发效率(大佬给的建议，实测好评)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;第一步，对策划对案子。在开三方会议前，先把需求文档过一遍，有疑问的记下来，或者直接找策划问清楚。等到开三方的时候，与策划逐行对需求文档，把所有的疑问都解决掉。(这一步很重要)&lt;/li&gt;
&lt;li&gt;第二步，与策划一起商定配置表的字段和格式，要求策划配一些能覆盖测试的临时数据，定好之后，写好导表检查。(这一步非常重要，当配置表搞定之后，整个数据模型已经完整的呈现在你的脑海里)&lt;/li&gt;
&lt;li&gt;第三步，前后端沟通定协议。后端还要定一下要落地的数据库结构。这一步，前后端的通讯和交互也定了一下来了&lt;/li&gt;
&lt;li&gt;第四步，写测试用例（有条件的话，最好加上这一步，并将其提前到第四位）&lt;/li&gt;
&lt;li&gt;第五步，写代码(这个时候你对整个系统的需求已经了如指撑了，闭着眼都能写)&lt;/li&gt;
&lt;li&gt;第六步，交付测试，然后愉快的摸鱼&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;如何看待加班&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;没人会喜欢加班，但是身处游戏行业，又不得不加班。加班通常是为了实现一个共同的目标，比如在某一个时间点完成某一个版本，而团队里的每一个成员都必须在场。&lt;/li&gt;
&lt;li&gt;加班其实是能力不足的表现，或者说是在正常上班时间摸鱼造成的。一般来说，人如果全身心投入去工作，从早上9点到晚上9点，会非常非常累。&lt;/li&gt;
&lt;li&gt;只要不是公司制度上强制加班的，我都能接受。虽然加班的时候我大多数情况都在摸鱼，但是摸鱼也可以摸的有价值。比如做一些优化，为将来的版本做准备。&lt;/li&gt;
&lt;li&gt;游戏团队是需要大量的面对面沟通，所以团队成员加班的节奏应该保持一致，不要出现错峰加班的情况，比如有些人加班到很晚，第二天很晚才来，而另一些人刚好错开这个时间，有时候想突然想找人对一下案子，却一直找不到人，卡进度，就很烦。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;其它的一些感想与收获&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;技术专家是团队的加分项，但不是必选项。不是交付为目的的技术研究都是耍流氓。&lt;/li&gt;
&lt;li&gt;代码一定要简洁易懂，最好是，非程序岗的同事，能看的懂你的代码，并能从你的代码找出bug。&lt;/li&gt;
&lt;li&gt;游戏行业发展到现如今，除非是在前沿开路的大佬们，绝大部分我们在开发的过程遇到的问题都是有标准答案的，不管是策划还是程序的方案，只要是脱离了主流的解决方案的，一定要留个心眼，你能想到的，别人一定有想过，别人为什么最终没有这么做，那他一定是踩到了什么坑。&lt;/li&gt;
&lt;li&gt;当你发现很久之前代码有一段匪夷所思的代码，别着急删掉，代码是不会说谎的，一定是产品/策划在作妖。&lt;/li&gt;
&lt;li&gt;备注是什么，不需要的，代码本身就是最好的备注。(除了有些地方是特殊处理，临时代码，还是要写一下备注，至少//TODO，否则被喷)&lt;/li&gt;
&lt;li&gt;程序员的本质是什么，程序员的本质就是与计算机沟通的桥梁，我们写的每一行代码，本质上都应该是为了将来减少更多的重复的体力劳动，为此我们可以是大费周章绞尽脑汁也在所不辞。因此，一个程序的优秀特性应该是，勤于动脑，懒于动手。&lt;/li&gt;
&lt;li&gt;切勿过度优化，特别是服务端，有些程序员甚至还在纠结++i和i++比哪个高效，殊不知现在的硬件已经是白菜价了。项目的进度比这些无意义的优化重要多了，除非某些地方成为了瓶颈，否则不要为了优化而优化。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>VScode的C#配置问题</title><link>https://blog.coding1024.cn/posts/a421e405/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/a421e405/</guid><description>vscode的C智能提示老是会自动失效，最近又遇到了新问题 今天突然就出现了这个报错 原因是vscode的omnisharp自动更新了，在settings.json里找到omnisharp.path字段，把lastest值改为1.39.2 插件的自动更新是问题频发的根源</description><pubDate>Tue, 27 Dec 2022 14:46:37 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;vscode的C#智能提示老是会自动失效，最近又遇到了新问题
今天突然就出现了这个报错&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;System.Composition.Hosting.CompositionFailedException: No export was found for the contract &apos;ILoggerFactory&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原因是vscode的omnisharp自动更新了，在settings.json里找到omnisharp.path字段，把lastest值改为1.39.2&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;omnisharp.path&quot;: &quot;1.39.2&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;插件的自动更新是问题频发的根源，下面总结了一些稳定能用的版本&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;dotnet framework版本:v4.7.1&lt;/li&gt;
&lt;li&gt;unity的vscode package版本:1.2.0(在manifest.json中配置, &quot;com.unity.ide.vscode&quot;: &quot;1.2.0&quot;)&lt;/li&gt;
&lt;li&gt;vscode的C#插件版本:v1.24.0(在卸载按钮旁边的小剪头，点击安装另一个版本)&lt;/li&gt;
&lt;li&gt;vscode的omnisharp版本:1.39.2(settings.json里的omnisharp.path字段)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;dotnet framework默认安装路径&lt;/h1&gt;
&lt;p&gt;C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.1&lt;/p&gt;
</content:encoded></item><item><title>上传Youtube如何关闭广告</title><link>https://blog.coding1024.cn/posts/15d916ce/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/15d916ce/</guid><description>最近在youtube上传了个应用的预览视频，给GooglePlay展示用，但是没过几天就被GooglePlay撤掉了。猜测原因是广告问题，我点开我上传的视频，总是偶尔会有广告出来。看文档是关闭视频的创收即可，我翻遍了整个youtube的各种设置界面都找不到关闭创收的按钮</description><pubDate>Mon, 26 Dec 2022 14:55:41 GMT</pubDate><content:encoded>&lt;p&gt;最近在youtube上传了个应用的预览视频，给GooglePlay展示用，但是没过几天就被GooglePlay撤掉了。猜测原因是广告问题，我点开我上传的视频，总是偶尔会有广告出来。看文档是关闭视频的创收即可，我翻遍了整个youtube的各种设置界面都找不到关闭创收的按钮或选项，我压根就没有达到youtube合作伙伴的要求，何来关闭创收一说，可是我的视频广告是从何而来呢。&lt;/p&gt;
&lt;p&gt;折腾了好久，还是搞不定，最后只能救助于GooglePlay的客服。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;我的APP视频预览看不到了，猜测原因是我的youtube视频仍存在广告。但是我的youtube账号未加入合作伙伴计划，我在创收页面找不到关闭广告的选项，在选中视频内容的时候也找不到创收的选项。请问有什么办法关闭youtube的广告，或者是其它办法让APP的视频预览恢复？
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;谷歌的回信&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;经过调查，目前系统侦测到您的宣传影片含有盈利功能，而是否含有相关功能是由系统来判定的。如果您的视频中含有广告，则必须停用广告，视频才能在 Play 商店中展示。我们希望当用户浏览 Play 商店时他们看到的视频展示的是您的应用，而不是广告，因为广告可能会令用户感到困惑。

您可以参考此帮助中心与以下视频要求：
·关闭影片中的营利功能
·上传一个不含获利声明的视频，然后在 Google Play 管理中心内更新视频网址。
·将视频的隐私设置设为公开或不公开列出。请勿将其设为不公开。
·确保您的视频可嵌入 Play 商店 Android 应用和网站。
重要提示：如果您的视频使用了受版权保护的内容，那么即使您为该视频关闭了获利功能，也可能无法避免其展示广告。在这种情况下，您需要换一个视频（该视频应不含受版权保护的内容，不带有获利声明）。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经检查发现，果然是因为我的视频里的背景音乐收到了版本主张。
Youtube对音乐版本非常严格，不像国内的抖音一类可以随便嫖。有商用需求的话，一定要避免版权问题，可以直接购买该音乐的版权(通常我们一般人做不到)，又或者可以免费使用CC版权音乐。&lt;/p&gt;
&lt;h3&gt;推荐几个CC版权的网站&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;爱给网里的CC版权库&lt;/li&gt;
&lt;li&gt;Youtube工作室里的音频库&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;推荐几个免费音乐的Youtube频道&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Royalty-Free Music: https://www.youtube.com/playlist?list=PLHEabrqpFr0PlkzCTrgZ6ChhrtKSAgqyj&lt;/li&gt;
&lt;li&gt;RFM: https://www.youtube.com/channel/UCyytiQuL-5S59OX1opqG-bQ&lt;/li&gt;
&lt;li&gt;FreeMusicWave：https://www.youtube.com/user/freemusicwave&lt;/li&gt;
&lt;li&gt;Vlog No Copyright Music:https://www.youtube.com/channel/UCEickjZj99-JJIU8_IJ7J-Q&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>特斯拉灯光秀Light Show Creator开发手记(二)</title><link>https://blog.coding1024.cn/posts/9ccdb535/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/9ccdb535/</guid><description>Light Show Creator这个APP已经上架一段时间，有用户反馈说，自动模式虽然好用，但是手动模式更加适合手机平台。于是我在新版本里添加了手动模式的规划。 其实在最早的版本，是有手动模式的，实现的原理跟xLights类似，都是通过时间轴来进行编辑。结果做出来效</description><pubDate>Tue, 20 Dec 2022 03:43:29 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Light Show Creator这个APP已经上架一段时间，有用户反馈说，自动模式虽然好用，但是手动模式更加适合手机平台。于是我在新版本里添加了手动模式的规划。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/media/9ccdb535/preview.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其实在最早的版本，是有手动模式的，实现的原理跟xLights类似，都是通过时间轴来进行编辑。结果做出来效果很不理想，时间轴的控制更加精细，更适合用鼠标的控制，而不适合触摸屏。所以我在第一个正式版本抛弃了手动模式，只保留了自动模式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/media/9ccdb535/old.jpeg&quot; alt=&quot;旧版本&quot; /&gt;
旧版本很难用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我最近看到了一个钢琴类APP，受到了一点启发，我可以把控制车灯的方式改为类似钢琴的键盘，按下灯亮，松手灯灭。可以单独控制一边的车灯，也可以按黑键同时激活两边的车灯。
&lt;img src=&quot;/media/9ccdb535/manual.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在手动录制的同时，也可以激活自动模式，只需要自己控制关键的几个车灯即可。
&lt;img src=&quot;/media/9ccdb535/settings.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Nginx修改文件大小限制</title><link>https://blog.coding1024.cn/posts/4a413d3a/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/4a413d3a/</guid><description>nginx做http代理的默认配置对请求包体大小有限制1M以内，如果超过个值会返回413错误码，及Request Entity Too Large这些的错误信息。修改一下nginx的配置即可：</description><pubDate>Sun, 27 Nov 2022 08:42:25 GMT</pubDate><content:encoded>&lt;p&gt;nginx做http代理的默认配置对请求包体大小有限制1M以内，如果超过个值会返回413错误码，及Request Entity Too Large这些的错误信息。修改一下nginx的配置即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http {
    ...
    #上传文件的大小限制  默认1m
    client_max_body_size 8m;
    ...
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>批量删除文件中的^M符号</title><link>https://blog.coding1024.cn/posts/5dcaa2e/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/5dcaa2e/</guid><description>从windows直接拷贝文件到linux/macos可能会出现行尾留下&quot;^M&quot;符号，git diff可见到，是因为windows的换行使用的是\r\n两个字符。 安装dos2unix Ubuntu/Debian: Centos: MacOS 转换单个文件 批量转换</description><pubDate>Sat, 19 Nov 2022 03:17:16 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;从windows直接拷贝文件到linux/macos可能会出现行尾留下&quot;^M&quot;符号，git diff可见到，是因为windows的换行使用的是\r\n两个字符。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;安装dos2unix&lt;/h1&gt;
&lt;p&gt;Ubuntu/Debian:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install dos2unix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Centos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo yum install dos2unix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MacOS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install dos2unix
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;转换单个文件&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;dos2unix filename
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;批量转换&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;find ./ -name *.lua | xargs dos2unix
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Ubuntu更换源</title><link>https://blog.coding1024.cn/posts/fde212d5/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/fde212d5/</guid><description>腾讯云的Ubuntu使用apt安装软件会报找不到源 看着应该是mirrors.tencentyun.com挂了，都ping不通，更换源就好了: 首先备份源列表 修改sources.list文件 编辑/etc/apt/sources.list文件, 在文件最前面添加阿里云</description><pubDate>Wed, 16 Nov 2022 02:45:19 GMT</pubDate><content:encoded>&lt;p&gt;腾讯云的Ubuntu使用apt安装软件会报找不到源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Err:1 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 m4 amd64 1.4.18-1
  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
Ign:2 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 autoconf all 2.69-11
Ign:3 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 autotools-dev all 20180224.1
Ign:4 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 automake all 1:1.15.1-3ubuntu2
Err:2 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 autoconf all 2.69-11
  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
Err:3 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 autotools-dev all 20180224.1
  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
Err:4 http://mirrors.tencentyun.com/ubuntu bionic/main amd64 automake all 1:1.15.1-3ubuntu2
  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
E: Failed to fetch http://mirrors.tencentyun.com/ubuntu/pool/main/m/m4/m4_1.4.18-1_amd64.deb  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
E: Failed to fetch http://mirrors.tencentyun.com/ubuntu/pool/main/a/autoconf/autoconf_2.69-11_all.deb  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
E: Failed to fetch http://mirrors.tencentyun.com/ubuntu/pool/main/a/autotools-dev/autotools-dev_20180224.1_all.deb  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
E: Failed to fetch http://mirrors.tencentyun.com/ubuntu/pool/main/a/automake-1.15/automake_1.15.1-3ubuntu2_all.deb  Something wicked happened resolving &apos;mirrors.tencentyun.com:http&apos; (-5 - No address associated with hostname)
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看着应该是mirrors.tencentyun.com挂了，都ping不通，更换源就好了:&lt;/p&gt;
&lt;h2&gt;首先备份源列表&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/apt/sources.list /etc/apt/sources.list.bk
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;修改sources.list文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo vi /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;编辑/etc/apt/sources.list文件, 在文件最前面添加阿里云镜像源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;刷新列表&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Unity快速引入Firebase</title><link>https://blog.coding1024.cn/posts/cd4d0695/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/cd4d0695/</guid><description>最近在尝试给APP引入账号第三方SDK，再三比较，如果是出海的APP，Firebase是不二选择。 接入的过程中比较坎坷，分别尝试了AS导出aar包到unity，还有从unity导出AS工程，都以失败告终（IOS还未尝试）。 其实是根本就是我没仔细阅读官方文档，goog</description><pubDate>Mon, 14 Nov 2022 16:21:24 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近在尝试给APP引入账号第三方SDK，再三比较，如果是出海的APP，Firebase是不二选择。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接入的过程中比较坎坷，分别尝试了AS导出aar包到unity，还有从unity导出AS工程，都以失败告终（IOS还未尝试）。&lt;/p&gt;
&lt;p&gt;其实是根本就是我没仔细阅读官方文档，google官方有提供unitypackage，将其导入unity并在后台做简单设置即可。&lt;/p&gt;
&lt;p&gt;官方文档：https://firebase.google.com/docs/auth/unity/start&lt;/p&gt;
&lt;h2&gt;在Firebase后台注册应用&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/cd4d0695/img1.png&quot; alt=&quot;&quot; /&gt;
(注意，注册的时的包名要跟应用的最终包名一致)&lt;/p&gt;
&lt;h2&gt;在应用设置中添加SHA证书指纹&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/cd4d0695/img2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;下载google-services.json&lt;/h2&gt;
&lt;p&gt;文件放到unity项目里的Asset/StreamingAssets中&lt;/p&gt;
&lt;h2&gt;启用服务提供方&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/cd4d0695/img3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;导入FirebaseAuth.unitypackage&lt;/h2&gt;
&lt;h2&gt;添加测试代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;auth.CreateUserWithEmailAndPasswordAsync(email, password)
            .ContinueWith(task =&amp;gt;
            {
                if (task.IsCanceled)
                {
                    Debug.LogError(&quot;CreateUserWithEmailAndPasswordAsync was canceled.&quot;);
                    return;
                }
                if (task.IsFaulted)
                {
                    Debug.LogError(
                        &quot;CreateUserWithEmailAndPasswordAsync encountered an error: &quot;
                            + task.Exception
                    );
                    return;
                }

                // Firebase user has been created.
                FirebaseUser newUser = task.Result;
                Debug.LogFormat(
                    &quot;Firebase user created successfully: {0} ({1})&quot;,
                    newUser.DisplayName,
                    newUser.UserId
                );
            });
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Unity引入Firebase报错</title><link>https://blog.coding1024.cn/posts/3a0ce390/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/3a0ce390/</guid><description>Unity在引入最新版本Firebase发现报错： 大致意思是项目依赖了AndroidX，但是android.useAndroidX没有enabled 解决方案： BuildSettings-Player-Publishing Settings 勾选Custom Gra</description><pubDate>Sun, 13 Nov 2022 17:46:35 GMT</pubDate><content:encoded>&lt;p&gt;Unity在引入最新版本Firebase发现报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Could not determine the dependencies of task &apos;:launcher:lintVitalRelease&apos;.
&amp;gt; This project uses AndroidX dependencies, but the &apos;android.useAndroidX&apos; property is not enabled. Set this property to true in the gradle.properties file and retry.
  The following AndroidX dependencies are detected: androidx.fragment:fragment:1.0.0, androidx.slidingpanelayout:slidingpanelayout:1.0.0,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大致意思是项目依赖了AndroidX，但是android.useAndroidX没有enabled&lt;/p&gt;
&lt;p&gt;解决方案：&lt;/p&gt;
&lt;p&gt;BuildSettings-&amp;gt;Player-&amp;gt;Publishing Settings 勾选Custom Gradle Properties Template。之后unity会自动生模板配置 Assets/Plugins/Android/gradleTemplate.properties
在properties文件中添加以下两行:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;android.useAndroidX=true
android.enableJetifier=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改之后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableR8=**MINIFY_WITH_R_EIGHT**
unityStreamingAssets=**STREAMING_ASSETS**
android.useAndroidX=true
android.enableJetifier=true
**ADDITIONAL_PROPERTIES**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题解决~&lt;/p&gt;
</content:encoded></item><item><title>安卓手机无线调试</title><link>https://blog.coding1024.cn/posts/3c859465/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/3c859465/</guid><description>安卓手机从Android11开始支持无线调试，终于可以抛弃数据线了。 先决条件 + Android 手机需要是 Android 11 以上系统； + 电脑上的 Android SDK 工具需要 ≥ 30.0.0 版本，确认方式是：adb --version 使用配对码配</description><pubDate>Sun, 13 Nov 2022 13:43:44 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;安卓手机从Android11开始支持无线调试，终于可以抛弃数据线了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先决条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Android 手机需要是 Android 11 以上系统；&lt;/li&gt;
&lt;li&gt;电脑上的 Android SDK 工具需要 ≥ 30.0.0 版本，确认方式是：adb --version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用配对码配对&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;手机上启用开发者模式 -&amp;gt; USB 调试 -&amp;gt; 启用无线调试选项&lt;/li&gt;
&lt;li&gt;点击无线调试 --&amp;gt; 点击使用配对码配对设备 可以看到配对码、ip 和端口号&lt;/li&gt;
&lt;li&gt;在电脑上的终端终端运行 adb pair ipaddr:port&lt;/li&gt;
&lt;li&gt;输入 adb devices -l 即可看到通过无线连接成功的设备&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用二维码配对&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;手机上启用开发者模式 -&amp;gt; USB 调试 -&amp;gt; 启用无线调试选项&lt;/li&gt;
&lt;li&gt;点击扫码配对，在Android stuido设备菜单，选择Pair Devices Using WiFi&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>特斯拉灯光秀Light Show Creator开发手记(一)</title><link>https://blog.coding1024.cn/posts/33fc2e57/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/33fc2e57/</guid><description>特斯拉在2021年的圣诞更新中，推出了全系灯光秀（LightShow）功能，灯光秀除了车内默认的版本，还可以自定义模式。我当时也第一时间尝试了下，但觉得太难编辑了，于是就有了新想法。 Idea来源 特斯拉官方推荐的一款开源软件叫:xLights，这是一款专业的编辑灯光表</description><pubDate>Thu, 27 Oct 2022 15:10:39 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;特斯拉在2021年的圣诞更新中，推出了全系灯光秀（LightShow）功能，灯光秀除了车内默认的版本，还可以自定义模式。我当时也第一时间尝试了下，但觉得太难编辑了，于是就有了新想法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/media/33fc2e57/preview.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Idea来源&lt;/h1&gt;
&lt;p&gt;特斯拉官方推荐的一款开源软件叫:xLights，这是一款专业的编辑灯光表演的软件，导入特斯拉提供的模板和音乐，即可开始编辑自己的灯光秀。
&lt;img src=&quot;/media/33fc2e57/xlights_overview.png&quot; alt=&quot;&quot; /&gt;
xLights的编辑过程比较繁琐，需要一帧一帧的去编辑，而且编辑完还得运行个脚本来检查生成的文件是否合法，因为特斯拉对灯光序列有严格的限制，也是以防车灯被烧坏。整个过程费时又费力，我就在想，有没有办法简化这个过程呢，最好是能导入音乐就能一键生成。于是我萌发了开发一个APP的想法。&lt;/p&gt;
&lt;h1&gt;前期准备&lt;/h1&gt;
&lt;p&gt;第一步，也是最重要的一步，我需要分析这个项目的可行性，也就是说我是否能够生成跟xLight一样的规范的fseq序列帧文件以供车辆识别，这个文件是二进制的，需要逐个字节去分析它的含义。&lt;/p&gt;
&lt;p&gt;通过特斯拉官方提供的检查脚本，我们可以大致反推出fseq格式的基本含义，由前半部分的头定义和后半部分序列帧(每个车灯的开关/亮度)组成。&lt;/p&gt;
&lt;p&gt;为了验证我的想法，我拿特斯拉官方的例子做实验，官方的例子一共有3个文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lightshow.wav（这个是音乐文件，不管它）&lt;/li&gt;
&lt;li&gt;lightshow.xsq（这个是xLights的工程文件，也就是序列帧的xml格式)&lt;/li&gt;
&lt;li&gt;lightshow.fseq（这个是序列帧的二进制格式，由xLights导出给车辆用的）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我的做法是，把xsq工程里的序列帧数据导入到我的APP里，然后再导出新的fseq文件，再拿这个新fseq和xLights导出的fseq逐个字节比对，直到二者一个字节不差。这也就意味着我的APP也能导出跟xLights一样能让特斯拉识别的序列帧。
&lt;img src=&quot;/media/33fc2e57/compare.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;前期开发&lt;/h1&gt;
&lt;p&gt;当在实车上测试过导出格式没问题之后，接下来就是着手开发核心功能了：一键自动生成。&lt;/p&gt;
&lt;p&gt;其实原理也特别简单，只要把音乐的音轨找出来，把整个音域分成n等分，然后把它们均等分配到每个车灯上，当达到一个阈值时，把车灯亮起，否则关掉。有点像音乐播放器里跳动的音谱。
&lt;img src=&quot;/media/33fc2e57/music.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;开发其它辅助功能&lt;/h1&gt;
&lt;p&gt;有些音乐的节奏和频率比较快，很容易超过限制，因此我还加入了一些参数设计，可供用户按需调节。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;步进时间：就是每帧的时长， 越大越省内存&lt;/li&gt;
&lt;li&gt;节奏敏感度：对音乐节奏的敏感度，理论上越小越省内存&lt;/li&gt;
&lt;li&gt;节拍时长：每次车灯亮起的最大时长，越大越省内存&lt;/li&gt;
&lt;li&gt;雾灯开关（标续的Model 3和Model Y是没有前雾灯的，把这个选项关掉效果更加）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/33fc2e57/screenshot1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了防止超出内存使用上限，我把特斯拉提供的python脚本复刻一分到我的APP里，在一边录制的时候一边检查使用率并实时显示出供用户参考，超出就不给导出。
&lt;img src=&quot;/media/33fc2e57/validate.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;上架应用商店&lt;/h1&gt;
&lt;p&gt;目前APP已在在苹果App Store和Google Play上架&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/light-show-creator/id6446385602&quot;&gt;Apple Stop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.coding1024.tslshow&quot;&gt;Google Play&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;后续迭代计划&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;支持mac版&lt;/li&gt;
&lt;li&gt;支持手动编辑模式&lt;/li&gt;
&lt;li&gt;支持录音功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我还上传了一些用creator录制的灯光秀到github, 都是一些有意思的BGM，大佬们不嫌弃的话下载拿去用~
https://github.com/xcoding1024/tesla-light-show&lt;/p&gt;
</content:encoded></item><item><title>2022最新特斯拉引荐码，供有缘人备不时之需</title><link>https://blog.coding1024.cn/posts/8300381e/</link><guid isPermaLink="true">https://blog.coding1024.cn/posts/8300381e/</guid><description>通过特斯拉引荐码下单的车辆在交付后，可以获取特斯拉商城3500积分，可用于兑换750km超充里程及其它周边产品 打开老车主的特斯拉引荐码通过官网自己下单 https://www.tesla.cn/referral/ovlt77625 也可以扫码获取 如果是通过销售下单的</description><pubDate>Mon, 15 Aug 2022 02:06:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;通过特斯拉引荐码下单的车辆在交付后，可以获取特斯拉商城3500积分，可用于兑换750km超充里程及其它周边产品&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开老车主的特斯拉引荐码通过官网自己下单&lt;/p&gt;
&lt;p&gt;https://www.tesla.cn/referral/ovlt77625&lt;/p&gt;
&lt;p&gt;也可以扫码获取&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/8300381e/refcode.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果是通过销售下单的，提车前邀请码发给销售即可: &amp;lt;big&amp;gt;ovlt77625&amp;lt;/big&amp;gt;&lt;/p&gt;
&lt;p&gt;当你提车之后，即可在特斯拉APP里查看到积分。&lt;/p&gt;
</content:encoded></item></channel></rss>