Archive of

Running Claude Code on Windows Without WSL

Got a Windows dev VM where you can't install WSL? Here's how to get Claude Code working with just Git Bash.

The Fix

Add these to your .bashrc:

export NPM_CONFIG_IGNORE_SCRIPTS=true
export SHELL=/c/Program\ Files/Git/bin/bash.exe

Then:

source ~/.bashrc
npm install -g @anthropic-ai/claude-code

Done.

Why It Works

Git Bash provides enough Unix-like environment for Claude Code. The SHELL export tells it where to find bash, and NPM_CONFIG_IGNORE_SCRIPTS prevents install script issues.

Caveats

This is a workaround, not official support. Works fine in my vm, let me know if it also works on your machine!

Tested on Windows Server 2022 with Git for Windows 2.50.0.windows.1

Solving Flutter Web Image Rendering Issues: A Cross-Platform Approach

If you've ever tried to display images in a Flutter app that needs to work seamlessly across web and mobile platforms, you've probably run into some frustrating limitations. Recently, I tackled this exact problem when our markdown image renderer started choking on web deployments due to CORS restrictions and lack of proper zoom functionality.

The Problem

Our original implementation was painfully simple - just Image.network(src) wrapped in a GestureDetector. This worked fine on mobile, or on web with --web-renderer html. However, the HTML web renderer is obsolete and will be removed shortly. We needed a more reliable solution.

The Solution: Platform-Specific Implementations

The key insight was to leverage Flutter's conditional imports to create platform-specific implementations while maintaining a clean, unified API.

Setting Up Conditional Imports

// Conditional imports for web
import 'web_image_stub.dart'
    if (dart.library.html) 'web_image_impl.dart';

This pattern lets you have different implementations for web vs mobile while keeping your main code clean. The stub file handles non-web platforms, while the implementation file contains the web-specific logic.

Web Implementation: HTML Elements to the Rescue

For web, I ditched Flutter's built-in image widgets entirely and went straight to HTML elements using HtmlElementView. This bypasses CORS issues since the browser handles the image loading directly.

final imgElement = html.ImageElement()
  ..src = src
  ..style.width = '100%'
  ..style.objectFit = 'contain'
  ..style.cursor = 'pointer';

The magic happens when you register this as a platform view. Flutter treats it like any other widget, but under the hood, it's pure HTML - which means it plays nicely with browser security policies.

Adding Zoom Functionality

The fullscreen implementation includes both mouse wheel and touch gesture zoom:

// Mouse wheel zoom
imgElement.onWheel.listen((event) {
  event.preventDefault();
  scale += event.deltaY > 0 ? -0.1 : 0.1;
  scale = scale.clamp(0.5, 3.0);
  imgElement.style.transform = 'scale($scale)';
});

For touch devices, I implemented pinch-to-zoom by tracking multiple touch points and calculating the distance between them. It's more complex than the mouse wheel version, but it gives web users the same intuitive zoom experience they expect.

Mobile Implementation: Keep It Simple

For mobile platforms, I stuck with the tried-and-true approach but improved the UX:

Dialog.fullscreen(
  backgroundColor: Colors.black,
  child: Stack(
    children: [
      Center(
        child: PhotoView(
          imageProvider: NetworkImage(url),
          minScale: PhotoViewComputedScale.contained,
          maxScale: PhotoViewComputedScale.covered * 4,
        ),
      ),
      // Close button positioned in top-right
    ],
  ),
)

The key improvements were switching to Dialog.fullscreen instead of a regular dialog and adding a proper close button with consistent styling.

Key Takeaways

  1. Conditional imports are your friend - They let you maintain clean separation between platform-specific code without cluttering your main logic.

  2. HTML elements can solve web-specific problems - When Flutter widgets don't cut it on web, dropping down to HTML often provides better browser compatibility.

  3. Consistent UX matters - Users expect zoom functionality on images, especially in fullscreen mode. Don't skimp on these details.

  4. Don't fight the platform - Web and mobile have different strengths. Embrace them instead of trying to force a one-size-fits-all solution.

The Result

After implementing these changes, our image handling works consistently across platforms. Web users get smooth zoom functionality without CORS headaches, mobile users get the native experience they expect, and the codebase remains maintainable with clear separation of concerns.

Sometimes the best solution isn't the most elegant one - it's the one that actually works for your users across all the platforms they're using.

网友语录 - 第36期 - 朋友是自己选择的家人

这里记录我的一周分享,通常在周六发布。


郝靠谱 朋友是自己选择的家人


Cherie It's not a holiday unless there is no to do list. (照着清单去度假不是度假)


steedhorse 有些事你可能琢磨了很久,但还是在真正做了之后,才尝透了其中的的滋味。(思考和行动是完全不同的体验)


水瓶 我们年轻的时候总是忙着赶路。现在想想才知道,沿途的风景也许比目的地更重要。(生命是一个过程,我们应该享受过程)


金先生答道:“越是把注意力放在疼痛上,我就越会觉得疼。谈论疼痛就像给植物施肥一样。所以我很多年以前就改掉了抱怨的习惯。”


咖啡因馥郁 虽说人生怎么选都是错,但是人生怎么选都有它的美好。


mywaiting Q 诚实守信为什么是最重要的品质?
A 因为这能最大化降低双方交易成本和彼此心智负担


要想过更幸福、更满意的生活,人就得改变自身。这和钱无关,金钱本身既不会使人幸福,也不会带来不幸。金钱是中性的,既不好,也不坏。只有当钱属于某一个人的时候,它才会对这个人产生好的影响或者坏的影响。钱可以被用于好的用途,也可以被用于坏的用途。一个幸福的人有了钱会更幸福;而一个悲观忧虑的人,钱越多,烦恼就越多。


猪小宝 那天听了一个讲佛教的视频,感觉我有一点开窍。 就说啊,如果现在 ChatGPT 跟你说,它自己很苦恼很痛苦很迷惘,你会怎么想?你知道它其实不存在,它只是一些算法代码,一些显卡,一拔电源就啥也不是。这种怎么可能会苦恼呢?这不是搞笑嘛。
在觉悟者看来,我们的苦恼也差不多。没钱没势,生老病死,人生七苦,我们的这些苦恼其实都像 GPT 说它自己苦恼差不多。都是虚妄


Rumi said: "As you start to walk on the way, the way appears." Clarity doesn't come before action. It comes from action.


希然kimmy 起床,先冥想🧘‍♀️,然后做事,起床的痛苦也没有了。


Marskay 有一段时间,我感到孤独就是一种惩罚,就像把一个孩子关在一间黑屋子里,而成年人在另外一间屋里谈笑风生。后来,有一天我们也长成了成年人,这才知道,孤独是人生中一种自觉的独处,而不是惩罚,不是受伤者和患病者的退隐,也不是怪癖,而是作为一个人生活里的唯一真正的存在状态


对孩子的过度关怀与对孩子采取棍棒教育其后果是相似的,都是对孩子的不尊重,都是对孩子权利的剥夺。棍棒教育伤害的是从身体到心灵,而过度关怀的伤害是从心灵到身体

网友语录 - 第35期 - 你走过的每一条弯路,其实都是必经之路

这里记录我的一周分享,通常在周六发布。


胡適:“(我是)不可救藥的樂觀主義者,...有時我自稱爲歷史家,有時又稱爲思想史家,但我從未自稱我是哲學家,或是其他各行的什麽專家”。


胡适于1930年5月19日辞去中国公学校长,由马君武继任。马君武是胡适的老师,1906年胡适考进中国公学时便是他亲手拔取的。6月初间,我已到胡适家。那时马君武正接任,每天上午11时后便赶到胡适家商谈,吃了午饭回去。有一天,马君武走后,胡适对我说:“马先生是孙中山同盟会的秘书长,地位很高。只是脾气不好,一言不合,就用鞋底打宋教仁的巴掌。他不肯信任人,事事要自己抓,连倒痰孟也不放心,要去看过。不肯信任人,人便不敢负责;事事自己去抓,便行不通。”果然不到一两个月,中国公学大风潮又起来了。教职员不拥护他,学生分为拥马派与倒马派,两派甚至发生了械斗。不久,马君武就被赶走了。胡适主持中国公学的领导方法,恰恰与马君武相反。


去,践履躬行你力所能及的一切。如果你不去,那你在犯错。只要你充满生机活力,那你干什么并不重要。如果缺少了生机,你还拥有什么呢?……失去活力的你什么都不拥有……好时光便是一个人依然幸福的拥有生命活力的时候。

--亨利 詹姆斯《大使们》


福姬:你走过的每一条弯路,其实都是必经之路。你永远都无法借别人的翅膀,飞上自己的天空。

…more

读书笔记:暮色将尽

一份酷对“凋零”的诚挚手记,独身女性的坦率心声ⅹ老年生活的全新收获;妥协与自由反复掣肘的女性一生。

2025-01-02 21:14:43

我是在狗的陪伴下长大的,所以不太理解为什么有些人不喜欢狗。这种动物被人类驯养的历史很久了,与人生活在一起似乎天经地义,如虎入丛林一般自然。它们已成为人类能透彻了解其情感的唯一动物种群。它们的情感与人类何其相似,只是看起来形式简单些罢了。当一只狗焦虑、愤怒、饥饿、迷惑、快乐或充满爱意时,它将这些情绪以最纯洁的形式呈现出来,我们也能感受得到,只不过人类的这些情感早被日益增长的复杂人性扭曲变形了。狗和人类因此在简单却深刻的层面彼此相通,我多想再养一只黑色绒脸小哈巴狗,重新体验这一切啊

2025-01-02 21:28:44

玛丽告诉我,她觉得玛丽·路易斯在画画。不久后我去她汉普斯特德区的家里拜访时,尽管看见满屋都是有意思的装饰和画作,但却没见任何东西出自她手。但她确实偶尔提及自己的作品,于是我问能不能见识见识,我问得很紧张,相当紧张,因为如果画作很糟的话,情况就可能非常尴尬。带着这种焦虑,我跟随她走进卧室,房间很大,很高,其中一整面墙都是庞大的嵌入式柜子,她打开柜子,一架架堆积如山的画作映入眼帘,她抽出其中两幅,我立刻惊呆了。 这个甜蜜、有趣、脆弱的老女人是个真正的画家,货真价实,几乎能与马克斯·贝克曼⑤以及科柯施卡⑥相提并论。要表达这种感觉真不太容易,我不能直接说:“哦天啊,你真的是个画家啊!”因为如果我本来就把她当作个画家,那这样评价她的作品就真的有点失礼了。我忘了当时我都说了些什么,很可能急中生智下说得还不错,因为从那之后她就开始愿意说自己的作品了,对这一结果,我深感欣慰。她谈论绘画时感觉非常棒,这下我恍然明白,为什么从她身上我看不到空虚之感。她是那种拥有最大幸运的典型例子,不管经历了怎样的苦难,却天生能成就事业。

2025-01-02 21:34:01

我们非常清楚生命是依照生物规律而不是个体规律运作的,个体出生、长大、生儿育女、凋零死亡让位给后来者。不管人类做着怎样的白日梦,也无法幸免这样的命运。当然,我们想要尽力延长凋零过程,以至于有时候凋零甚至比成长所经历的时间还长,因此,在这一过程中会遭遇什么,如何能尽力过好这一凋零的时光,确实值得深思。现在有这么多关于保持青春的书,还有更多有关生儿育女详尽的、实验性的经验分享,但有关凋零的记录却不多见。而我,正行走在这一凋零的路程当中,我的神经刚刚经历了小狗事件和树蕨事件,倍感痛楚,于是我问自己:“为什么我不来记录?”因此,我写了这本书。

2025-01-03 13:59:37

我在成年阶段并不是没有意识到从身体角度,男人其实很容易对女人不忠。当然从保罗抛弃我的事件开始,我也才认识到女人其实也能不谈爱,仅仅因性就可以燃烧。我后来从保罗事件中“恢复”过来,又谈了两次恋爱,都很深切,都很“致命”,好像这样的命运无法避免,而且无论经历如何,我依然渴望,但这却是注定要带来痛苦的东西。第一次是个年纪比我大很多的已婚男人,我从没幻想过他会为我离开他的妻子。毋庸置疑,如果他这样想的话我一定乐于接受,可我实在太崇拜他了,完全没奢望这事发生。我只不过是他战时一次放纵的对象,一场荒唐(再没有什么比空气中飘散的阵阵死亡气息更能激发这生命的核心——欲望的了,我到现在还记得他在我耳边玩笑的细语:“我曾觉得自己再没机会享受这种感觉了”),而她,是他无可指摘的好妻子,刚生了第一个孩子,因此离开她显得既残酷又不负责任。我确定他不是这样的人。如果他真的离开她,我也不会这么爱他了。

2025-01-03 14:01:08

保罗之后我的第二个爱人倒是单身,而且很合我的意,但他似乎有点好得不真实。他非常喜欢我,有一段时间甚至觉得爱上了我,但其实并非如此。几乎从我们相识开始,我就感觉到这段关系一定会在泪水中结束,但却情不自禁越陷越深。我们的确在泪水中分手,最后那个晚上我们沿着威格莫尔大街来来回回地走,一路流泪,他勇于承认现状,完全不给我留下任何希望;我却怀着几近受虐的狂热,更爱他了。实际上这种勇气,确实需要力量,对此我非常感谢他。我知道一颗破碎的心想要恢复的话,狠狠一击和慢慢勒死相比,前者会快得多。相信我吧!两种情况我都经历过。

2025-01-03 14:02:08

以上,就是我浪漫爱情的终点。后来,在我四十四岁遇见巴里·雷科德③之前,还发生过很多艳遇,有的很短暂,有的维持得稍长,总是很友善(有两次相当友善),几乎都很令人兴致勃勃(除了两次微不足道的邂逅),没有一次走到足以伤害我的程度。在那样的年代,如果一个男人想娶我,实际上还真有三个人这样说过,我的感觉就像是格劳乔·马克斯④对着想拉他入会的俱乐部的感受:不屑。我曾试图相信婚姻是理性的,但实际却不是这么回事。这些无伤大雅的艳遇有些涉及别人的老公,但我从未心生愧疚,因为我从来没想过破坏别人的婚姻。如果我们的关系会被哪个老婆发现(实际上这种事情从未发生过),那也一定是因为她老公不小心,绝不会因为我。

2025-01-03 14:03:04

夫妻关系里,我觉得善意和体贴才是最重要的,而性的不忠未必会导致这种关系终结。

2025-01-03 14:07:42

这种变化并不是突然来到的,而是从我五十五岁开始的,随后是一个逐渐消退的过程,因此完全可以忽略其对生命的影响力。我一点点意识到面对着熟悉的爱侣,我的兴致,我身体的回应,正慢慢减退,熟识之感把他手指的触摸变成好像自己在触抚,不再激起身体的战栗。

2025-01-03 15:53:54

令我吃惊的是,问题根本无法解决,那时的性事,我一想起来就觉得既单调又可笑。一件一直自然发生的事忽然不再可行,开始时你期望通过假装就能将它带回来,有时确实似乎也能成功,但感觉一去不返之日,你必须接受“结束”这个事实。

接受这样的事实令人悲哀。确实,我曾被迫接受,当我们的二人世界被令人眼花缭乱、新鲜水灵的二十来岁金发美女无情地侵入时。看到他抱着她一起摔倒在床上,我曾有过透心悲凉的无眠之夜,仅仅一夜,在那个痛苦的夜晚,我伤心的不仅是失去了近在身旁的老友(当然现在他依然陪在我身边),我还为失去的青春而痛惜:“她所拥有的一切——愿上帝让她腐朽——我已经不再拥有,永远也不会,永远。”这个认识来得太晚了点吧,面对这一事实我忽然有了一种可怕的危机感。但很快,另一个声音在我脑海里回响起来,一个似乎更合理的声音,“瞧,”这个声音说,“你很清楚自己在床上已经不再需要他了,想想上次上床是几个月前的事?这有什么好伤心的呢?你当然不再年轻,你已经走过青春,不再期望小年轻想要的东西了。”这个阶段就是这么结束的。

然后,消退期到来,我开心而饶有兴趣地发现,新鲜感可以恢复性事。我在《长书当诉》一书中曾写过,自己早期在经历了一段漫长真实的悲伤后,因为与费利克斯的艳遇而恢复了元气,虽然这一段关系与爱情毫无关系,但的确非常令人开心。我六十多岁时,同样的事情再次发生,性事因此又得以延长七年之久,而这期间巴里也走着自己的路,我们之间的关系更像兄妹,而不是情人。另一个与我鲜有共性的男人在记忆里赢得了一席之地,充满温暖,令我心怀感激。在他之后,消退期结束,我也不再想要了。

2025-01-03 16:04:56

萨姆对我最主要的吸引力在于他想要我。在我不再期待性爱之时,还有人这么急切地想和我做爱,这实在令人振奋,让我似乎重获新生,这份礼物可不轻。同时,我对他也充满好奇,他的背景,他的整个生命历程,与我如此不同,这一切,使他甚至在沉闷时也显得有趣。中产阶级英国男人令我生厌,因为我太了解这种男人了,面对萨姆,我想去发现,发现的一切都让我觉得可爱。甚至在我想“真是个老傻帽”时,我依然很喜欢他,而最喜欢的一点,就是我从他孩提时代找到的感觉。

…more