<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
	<title>Jack&#39;s BLOG</title>
	<link>http://localhost:1313/</link>
	<description>Recent content on Jack&#39;s BLOG</description>
	<generator>Hugo -- gohugo.io</generator>
	<language>en-us</language>
	<lastBuildDate>Tue, 20 Oct 2026 00:07:12 +0800</lastBuildDate>
    
        <atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
	
	
	<item>
		<title>知其不可奈何，却不安之若命</title>
		<link>http://localhost:1313/lajeunesse/</link>
		<pubDate>Tue, 20 Oct 2026 00:07:12 +0800</pubDate>
		
		<guid>http://localhost:1313/lajeunesse/</guid>
		<description>&lt;p&gt;有些决定，不是在一切顺利的时候做出的，而是在经历了足够多的失望之后，终于不想再过这样的生活。2026年10月20日，我决定重新开始。
过去的一段时间里，我曾经对一些事情抱有期待。有人曾经答应过我，可以把调动我，我曾经相信，这意味着自己能够更上一层楼，可是后来，这件事被拒绝了；有人曾经答应我，可以帮我介绍女朋友，我曾经相信，这意味着生活能有一个新的气息，可是后来，这件事没有了下文。
但是真正让我难受的，不只是事情没有办成，而是我竟然曾经认真地相信过。我把别人的一句话当成了未来的一种可能，把别人许诺的机会当成了自己可以期待的方向。但等到事情落空我才发现，自己其实并没有什么变化，因为那些事情、那些希望一开始就建立在别人的决定之上。别人可以答应，也可以拒绝；也可以热情，也可以冷淡，可以在某个时刻向我表达善意，也可以在之后与我形同陌路。
这些事情，我无法控制。
但至少，我可以决定，以后怎样生活。&lt;/p&gt;
&lt;h2 id=&#34;一学习&#34;&gt;一、学习&lt;/h2&gt;
&lt;p&gt;1.英语：每周精读一篇经济学人，不是追求快速刷完文章，而是把一篇文章真正读懂。&lt;br&gt;
2.维语：按照老师的要求，每天写10页字母本子，一周一本，同时复习上次课的内容。字母学完，自己开始刷课本。&lt;br&gt;
3.写作：每天学习一篇《治国理政》，不只是读内容，更要训练机关综合材料的结构分析能力。&lt;br&gt;
4.c语言：学完《c程序设计语言》，不再折腾编辑器，vim模式，踏踏实实学c语言。&lt;/p&gt;
&lt;h2 id=&#34;二理财&#34;&gt;二、理财&lt;/h2&gt;
&lt;p&gt;1.还债。2026年12月底把所有债务还完（核心目标）。&lt;br&gt;
2.暂停所有投资，学习定投、保险等理财知识。&lt;br&gt;
3.每月记账，每月最后一天完成复盘，公布汇总数据，形成长期记录。&lt;br&gt;
4.2027年新办一个公务卡作为公务支出和报销管理工具（不用来消费）。&lt;/p&gt;
&lt;h2 id=&#34;三健康篇&#34;&gt;三、健康篇&lt;/h2&gt;
&lt;p&gt;1.少喝含糖饮料，优先改为白水、无糖茶。&lt;br&gt;
2.训练：健身操 Insanity 60天、insanity Max 30和走走而已指定跟练计划并投入训练。&lt;/p&gt;
&lt;p&gt;2026年10月20日，不是一个特别的日子。它不会自动改变我的工作，不会让债务立即消失，也不会让未来突然变得清晰。但我想把它当作一个起点。以后，我仍然可能遇到挫折，仍然可能制定了计划却没有完成，也可能再次对某些人或某些事情抱有期待。换句话说，这次改变并不意味着从此不会失败，而是失败之后，不再轻易放弃对自己生活的责任。我不再等待某个承诺来决定自己的人生什么时候开始。
从今天起，先把书读好，把语言学好，把身体照顾好，把账算清楚，把每天该做的事情一点点做好。至于工作、关系和未来，就在自己持续行动的过程中，慢慢寻找答案。
我无法决定别人是否兑现承诺，但我可以决定，不再把自己的未来押在别人的承诺上。&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Food5k 初体验</title>
		<link>http://localhost:1313/food5k1/</link>
		<pubDate>Sun, 30 Aug 2026 16:08:17 +0800</pubDate>
		
		<guid>http://localhost:1313/food5k1/</guid>
		<description>&lt;p&gt;大学的时候，学了一段时间R语言，挺长时间没用，有点生疏了，最近打算重新捡起来。今天在逛美团技术博客的时候，偶然发现了一个好玩的文章，题目是&lt;a href=&#34;https://tech.meituan.com/2023/02/23/Large-Scale-Visual-Food-Recognition.html&#34;&gt;大规模食品图像识别：T-PAMI 2023论文解读&lt;/a&gt;,主要是通过挖掘食品图像的本身特点进行大规模食品图像识别。博客里提到&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;现有的工作主要是利用中小规模的图像数据集进行食品图像识别，如ETH Food-101[5]、Vireo Food-172[6]和ISIA Food- 500[7]，但是它们的数据规模不足以支撑更复杂更先进的食品计算模型的建立。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以研究人员构建了一个新的食品图像数据集&lt;code&gt;Food2K&lt;/code&gt;来进行各种食品计算任务，该数据集包含1,036,564张食品图像和2,000类食品，涉及12个超类（如蔬菜、肉类、烧烤和油炸食品等）和26个子类别。但是对于我来说，这个数据集太大了，一是因为其总共60多个G，我的网络和硬盘储存都有点不太行。所以选了Food5k，这是一个包含5000张图片的数据集，一共分两大类，食品和非食品共占一半，数据集目录结构也很简单，有&lt;code&gt;training&lt;/code&gt;, &lt;code&gt;validation&lt;/code&gt;, &lt;code&gt;evaluation&lt;/code&gt;三个子文件夹，分别用来训练、验证和评估。每个子文件夹各含3000、1000、1000张图片，食物和非食物类均各占一半。食物类图片的图片名以&#39;1&amp;rsquo;开头，非食物则以&#39;0&amp;rsquo;开头。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://localhost:1313/images/overview.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;今天先不训练 CNN，从数据分析入手&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;files &amp;lt;- dir_ls(&amp;#34;./data/raw/Food-5K&amp;#34;,
  recurse = TRUE,
  regexp = &amp;#34;\\.jpg$&amp;#34;
)

filename &amp;lt;- path_file(files)

class_id &amp;lt;- str_extract(filename, &amp;#34;^[01]&amp;#34;)

label &amp;lt;- ifelse(class_id == 1, &amp;#34;food&amp;#34;, &amp;#34;non_food&amp;#34;)

split &amp;lt;- case_when(
  str_detect(files, &amp;#34;training&amp;#34;) ~ &amp;#34;training&amp;#34;,
  str_detect(files, &amp;#34;validation&amp;#34;) ~ &amp;#34;validation&amp;#34;,
  str_detect(files, &amp;#34;evaluation&amp;#34;) ~ &amp;#34;evaluation&amp;#34;,
  TRUE ~ NA_character_
)

food5k &amp;lt;- tibble(
  path = files,
  filename = filename,
  class_id = class_id,
  label = label,
  split = split
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这一part主要目的是建立一个food5k的tibble，分成几列，一是文件路径，文件名，0或1的分类，标签（是否是food）和所在文件夹名。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sum(food5k$label == &amp;#34;non_food&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;输出是2500,说明整对了。&lt;/p&gt;
&lt;p&gt;下一part，准备再在food5k这个tibble里面，加上每张图片的width，height和file_size等参数&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;get_image_info &amp;lt;- function(path) {
  info &amp;lt;- image_info(image_read(path))
  tibble(
    width = info$width,
    height = info$height,
    file_size = info$filesize,
    aspect_ratio = info$width / info$height
  )
}

library(purrr)
image_metadata &amp;lt;- map_dfr(
  food5k$path,
  get_image_info
)

food5k &amp;lt;- bind_cols(
  food5k,
  image_metadata
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先是写了一个get_image_info函数，先读一个图片的width等参数，然后用&lt;code&gt;purrr&lt;/code&gt;包，用在5000个路径上&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;拿 &lt;code&gt;food5k$path&lt;/code&gt; 里面的每一个路径，依次交给 &lt;code&gt;get_image_info()&lt;/code&gt;，然后把所有结果按行合并起来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;http://localhost:1313/images/%7B408042D4-4BBB-4845-8139-4C88A408C4FB%7D.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;最后再和之前的tibble合并，变成我们想要的数据集，像下面那样&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://localhost:1313/images/%7B722F6E01-4319-4B6C-A9B3-E149F02020B1%7D.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;最后，画一张图看一下整体情况&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ggplot(
  food5k,
  aes(x = split, y = file_size / 1024, fill = label)
) +
  geom_boxplot() +
  labs(
    title = &amp;#34;File Size Across Dataset Splits&amp;#34;,
    x = NULL,
    y = &amp;#34;File size (KB)&amp;#34;,
    fill = &amp;#34;Label&amp;#34;
  )
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;http://localhost:1313/images/all.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>2026年我的Neovim配置</title>
		<link>http://localhost:1313/2026_neovim/</link>
		<pubDate>Sat, 14 Feb 2026 09:03:20 -0800</pubDate>
		
		<guid>http://localhost:1313/2026_neovim/</guid>
		<description>&lt;p&gt;从大学开始，我一直在折腾Neovim编辑器，它开源、快速、高度客制化，符合我对编辑器的一切要求。虽然代码没写多少，两三年也积累了不少设置，光是包管理器就从vim-plug换到packer.nvim再到lazy.nvim。这次趁着春节假期，简单整理一下配置。&lt;/p&gt;
&lt;p&gt;其实我的编程需求很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用Rust写一些小CLI；&lt;/li&gt;
&lt;li&gt;用R做数据分析和画图；&lt;/li&gt;
&lt;li&gt;用Python写算法和Manim库做动画;&lt;/li&gt;
&lt;li&gt;用Latex套模板写文章;&lt;/li&gt;
&lt;li&gt;用lua写Neovim配置 所以配置不需要太复杂。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;包管理器 我没有什么特殊需求，现在WSL中的Neovim的加载速度也还可以，所以目前没有理由再切换到Lazy.nvim，至于on-demand loading，作者是这么说的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A properly implemented Vim plugin should already load lazily without any help from a plugin manager (:help autoload). So there are few cases where these options actually make much sense. Making a plugin load faster is the responsibility of the plugin developer, not the user. If you find a plugin that takes too long to load, consider opening an issue on the plugin’s issue tracker.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以让插件快速加载是插件作者的事，而不是包管理器应该干的事（虽然vim-plug也可以实现）。但是对于我没什么影响，毕竟我的启动速度已经够快，而且vim-plug也足够好用。&lt;/p&gt;
&lt;p&gt;常用插件&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Plug(&amp;#34;nvim-lua/plenary.nvim&amp;#34;)
Plug(&amp;#34;ThePrimeagen/harpoon&amp;#34;)
Plug(&amp;#34;nvim-telescope/telescope.nvim&amp;#34;, { [&amp;#34;version&amp;#34;] = &amp;#34;*&amp;#34; })
Plug(&amp;#34;nvim-treesitter/nvim-treesitter&amp;#34;, { [&amp;#34;build&amp;#34;] = &amp;#34;:TSUpdate&amp;#34; })
Plug(&amp;#34;R-nvim/R.nvim&amp;#34;)
Plug(&amp;#34;vedantwpatil/manim-nvim&amp;#34;)
Plug(&amp;#34;neovim/nvim-lspconfig&amp;#34;)
Plug(&amp;#34;williamboman/mason.nvim&amp;#34;)
Plug(&amp;#34;williamboman/mason-lspconfig.nvim&amp;#34;)
Plug(&amp;#34;j-hui/fidget.nvim&amp;#34;)
Plug(&amp;#34;hrsh7th/cmp-nvim-lsp&amp;#34;)
Plug(&amp;#34;hrsh7th/cmp-buffer&amp;#34;)
Plug(&amp;#34;hrsh7th/cmp-path&amp;#34;)
Plug(&amp;#34;hrsh7th/cmp-cmdline&amp;#34;)
Plug(&amp;#34;hrsh7th/nvim-cmp&amp;#34;)
Plug(&amp;#34;L3MON4D3/LuaSnip&amp;#34;, { [&amp;#34;tag&amp;#34;] = &amp;#34;v2.4.1&amp;#34;, [&amp;#34;do&amp;#34;] = &amp;#34;make install_jsregexp&amp;#34; })
Plug(&amp;#34;saadparwaiz1/cmp_luasnip&amp;#34;)
Plug(&amp;#34;rafamadriz/friendly-snippets&amp;#34;)
Plug(&amp;#34;stevearc/conform.nvim&amp;#34;)
Plug(&amp;#34;lervag/vimtex&amp;#34;)
Plug(&amp;#34;nvim-lualine/lualine.nvim&amp;#34;)
Plug(&amp;#34;lukas-reineke/indent-blankline.nvim&amp;#34;)
Plug(&amp;#34;numToStr/Comment.nvim&amp;#34;)
Plug(&amp;#34;tpope/vim-fugitive&amp;#34;)
Plug(&amp;#34;mbbill/undotree&amp;#34;)
Plug(&amp;#34;https://codeberg.org/andyg/leap.nvim&amp;#34;)
Plug(&amp;#34;tpope/vim-repeat&amp;#34;)
Plug(&amp;#34;windwp/nvim-autopairs&amp;#34;)
Plug(&amp;#34;iamcco/markdown-preview.nvim&amp;#34;, { [&amp;#34;do&amp;#34;] = &amp;#34;cd app &amp;amp;&amp;amp; npx --yes yarn install&amp;#34; })
Plug(&amp;#34;epwalsh/obsidian.nvim&amp;#34;)
Plug(&amp;#34;img-paste-devs/img-paste.vim&amp;#34;)
Plug(&amp;#34;Shougo/unite.vim&amp;#34;)
Plug(&amp;#34;rafaqz/citation.vim&amp;#34;)
Plug(&amp;#34;blazkowolf/gruber-darker.nvim&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最主要的是telescope、lsp一些插件、vimtex，R.nvim，剩下的都是一些功能性的插件，比如leap用来快速移动，Comment用来注释代码，autopairs用来生成成对括号等。&lt;/p&gt;
&lt;p&gt;至于Coc，它固然好用，安装方便，server直接CocInstall就能安装，但是有段时间r-languaguerserver一直报错（可能不是Coc的问题），所以我换成了Neovim内置的Lsp，感觉稳定一些。lsp我也没有下载多少，主要还是r-languageserver、rust_analyzer、basepyright和emmylua_ls&lt;/p&gt;
&lt;p&gt;至于别的，基本是安装插件的基本配置，不再赘述。这样一套配置下来，基本可以满足我的编程、写作需求，所以我近期不打算再调整配置，把精力放在好好写程序和研究问题上。&lt;/p&gt;
</description>
	</item>
	
	</channel>
</rss>
