<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>效率/工具 on Foam 的博客</title>
    <link>https://blog.foamzou.com/categories/%E6%95%88%E7%8E%87/%E5%B7%A5%E5%85%B7/</link>
    <description>Recent content in 效率/工具 on Foam 的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 10 Jul 2024 20:20:54 +0800</lastBuildDate>
    <atom:link href="https://blog.foamzou.com/categories/%E6%95%88%E7%8E%87/%E5%B7%A5%E5%85%B7/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用 ffmpeg 批量转换 xcode 全尺寸 App icon</title>
      <link>https://blog.foamzou.com/posts/convert-all-size-of-xcode-app-icon-by-ffmpeg/</link>
      <pubDate>Wed, 10 Jul 2024 20:20:54 +0800</pubDate>
      <guid>https://blog.foamzou.com/posts/convert-all-size-of-xcode-app-icon-by-ffmpeg/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;input_image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;sizes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;32&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;128&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;512&lt;/span&gt; 1024&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; size in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sizes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;output_image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ffmpeg -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$input_image&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -vf &lt;span class=&#34;nv&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;:&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; -c:v png -pix_fmt rgba &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$output_image&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>自动化批量修改 Github 的 repo</title>
      <link>https://blog.foamzou.com/posts/batch-modify-github-repo/</link>
      <pubDate>Sun, 04 Sep 2022 23:24:31 +0800</pubDate>
      <guid>https://blog.foamzou.com/posts/batch-modify-github-repo/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;好久没有写博客了，今年才写了 2 篇，但并不是说我在创作方面懒惰了，反而今年写了一个还算不错的开源项目(后面会写一系列文章记录我在做这个开源项目遇到的技术问题和一些人文)。可能空闲时间的精力倾斜到开源项目，导致博客投入不多吧。Anyway，本文也是我先发在公司 notion 的，先抄自己一篇，不那么费神。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;One day，公司要求所有的 repo 都要在 Jenkins 打开 sonar 的配置，这需要我们给 repo 的 Jenkins 文件添加多一个配置，然后提 PR。天呐，我们 team 有 7-80 个 repo ，简直是噩梦。所以，我们需要自动化。automizely！&lt;/p&gt;
&lt;h2 id=&#34;flow&#34;&gt;Flow&lt;/h2&gt;
&lt;p&gt;先来看看我司的 git flow，就是标准的 github flow。下图所示的 1 - 4 步骤的自动化都比较好实现，不涉及到复杂的逻辑。比较复杂的在于 clone 到本地后，需要自己写代码来批量修改每个 repo 的文件。对于后者，每次的逻辑都不太一样，自行实现即可。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.foamzou.com/posts/batch-modify-github-repo/batch-modify-github-repo.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;
&lt;h3 id=&#34;1-准备-repo-list-文件&#34;&gt;1. 准备 repo list 文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;我们将需要处理的 repo 放到一个文件里，例如 &lt;code&gt;all-repo.txt&lt;/code&gt; ，每行是一个 repo 名。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo-name1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo-name2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repo-name3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2. 将 &lt;code&gt;all-repo.txt&lt;/code&gt; 复制一份为 &lt;code&gt;all-repo-cur.txt&lt;/code&gt; , 等会我们的脚本就用这份 &lt;code&gt;cur&lt;/code&gt; ，目的是等会处理过程中可能会因为中间有个 repo 意外失败，需要重新跑，我们就可以把已经成功的 repo 从 &lt;code&gt;cur&lt;/code&gt; 文件中移除。注意 &lt;code&gt;cur&lt;/code&gt; 文件最后一行必须是空行，避免 shell 命令读取不到最后一行的 repo&lt;/p&gt;</description>
    </item>
    <item>
      <title>免费申请 JetBrains 全家桶 License</title>
      <link>https://blog.foamzou.com/posts/apply-jetbrains-free-license/</link>
      <pubDate>Sat, 22 Jan 2022 23:32:24 +0800</pubDate>
      <guid>https://blog.foamzou.com/posts/apply-jetbrains-free-license/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;JetBrains 允许用户通过多种途径免费申请 license，例如用于学术研究、参与开源项目等。本文介绍的是参与开源项目这种途径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;谁可以申请&#34;&gt;谁可以申请&lt;/h2&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;鉴于申请资格随着时间发展可能会发生变化，可以参考 &lt;a href=&#34;https://www.jetbrains.com/community/opensource/#support&#34;&gt;官网说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;据网上各网友的情况来看，JetBrains 不关心你的 repo 有多少 stars，用的什么语言。所以只要满足它的要求，都可以通过。&lt;/p&gt;
&lt;p&gt;但希望不要滥用，因为 JetBrains 的初衷是支持开源项目，我们 respect 它。&lt;/p&gt;
&lt;h2 id=&#34;license-说明&#34;&gt;License 说明&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;有效期：1年。到期可以再次申请&lt;/li&gt;
&lt;li&gt;仅能用于开发非商业开源项目&lt;/li&gt;
&lt;li&gt;不能和他人共享该 License&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;申请流程&#34;&gt;申请流程&lt;/h2&gt;
&lt;p&gt;申请网址：https://www.jetbrains.com/shop/eform/opensource&lt;/p&gt;
&lt;p&gt;接下来是填各种信息。因为要求是最近三个月有在积极贡献代码，所以我选择了一个 &lt;a href=&#34;https://github.com/foamzou/group-by-repo-on-github&#34;&gt;GitHub 插件项目&lt;/a&gt;。原本还担心这个 repo 比较简单，会不会无法通过，但后面证明是我多虑了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.foamzou.com/posts/apply-jetbrains-free-license/1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.foamzou.com/posts/apply-jetbrains-free-license/2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;填完之后点击提交即可&lt;/p&gt;
&lt;h2 id=&#34;通过申请&#34;&gt;通过申请&lt;/h2&gt;
&lt;p&gt;大概3个工作日后，我收到了来自 JetBrains 的 邮件。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.foamzou.com/posts/apply-jetbrains-free-license/WX20220122-231935_2x-1024x615.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;附件是 License 的订单凭证。Email 中提到如果我愿意的话，希望我可以将 JetBrains 作为项目支持者展示在 repo 主页。Sure, I would.&lt;/p&gt;
&lt;h2 id=&#34;激活-license&#34;&gt;激活 License&lt;/h2&gt;
&lt;p&gt;点击邮件的 &lt;code&gt;Take me to my license&lt;/code&gt; 链接，然后会看到有一个待激活的 License 躺在列表里，选择 assign 给指定人，我填了自己的邮箱。勾选了将 offline code 作为邮件内容的一部分发到我邮箱。&lt;/p&gt;
&lt;p&gt;然后，我收到了邮件，附件是两份离线 license code （分别使用在 2018.1 前后的产品）&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
