最近一些感悟和体会:移民的融入讨论

我们来澳洲之前看到很多人讨论的一个问题:移民之后“如何融入”,总会担心“孩子能不能融入”、“自己能不能融入”。我先说自己的结论:这其实是个伪命题——至少在澳洲,根本不存在融入问题。 澳洲是一个真正的移民国家,最大的优势就在于不同国家、不同文化背景的人能够和谐共处。你可以跟邻里热情互动,也可以独来独往,而且大家依然会互相帮助。只要遵守法律,你完全可以按照自己的方式生活,保持自己的语言和文化,没人会干涉你。澳洲政府甚至有意识地保护和鼓励这种文化多样性:比如一些原产国的传统在澳洲比在原地还能得到更好的保存和传承;很多移民餐馆不仅正宗,还充满创新,甚至比原产国更吸引人;广东话、普通话和各国语言一样都受到同等尊重,甚至学界已经发现,粤语在海外保留了更传统的形态。 孩子们在这样的环境中成长,更是天然地融入了社会,我们完全不担心他们的英语能力或社交能力。姐弟俩几乎是用“吸收式学习”掌握英语,相较于担心孩子融入,我们更关注下一代能保留多少自己的文化和语言。我们在家里都是讲汉语,偶尔会教他们壮话和客家话;出门在外,家人内部也用汉语交流。我们并不奢望能完全改变他们的语言选择,只是希望这种文化根脉至少能有一些延续,我能预见后代们肯定会越来越澳洲,这是一个自然的趋势,也没必要强行改变。说句实话,长久的文化和语言传承,最终依赖庞大的社区,幸运的是:这里的华人文化因自由而蓬勃发展。 当然了,移民就像一棵大树被移栽,而且澳洲一直就有强势的英语文化和习惯,个人难免会经历不适、焦虑与彷徨,甚至产生内在的冲突。关键在于保持包容与开放的心态,彼此尊重,愿意进行坦诚而开放的对话,愿意与这里产生真实的连接(任何形式都可以),只要如此,问题终究是可以慢慢化解。 总的来说,澳洲给移民提供了一个极其自由且包容的环境:你可以全身心地保留自己的文化,同时孩子们也可以顺利融入本地社会。这种自由和多样性,正是澳洲作为移民国家最令人欣赏的地方。 图片拍摄于首都堪培拉:澳大利亚国家美术馆的镇馆雕塑《Ouroboros》,由著名澳大利亚华裔艺术家李琳迪(Lindy Lee)创作,用13吨青铜纯手工铸造,以“衔尾蛇”意象呼应佛学中的轮回观与哲学中的自我更新,它象征多元文化的循环与共生,提醒人在差异中保持包容,在变化中寻找统一。

April 8, 2026

横跨大半个地球,从北京海运搬家到墨尔本

长登墨尔本有一段时间,前阵子顺利收到了海运搬家的物品,所有的行李和钢琴都整整齐齐完好地送达,包括日常使用的瓷器,看到曾经的家具物品呈现在异国他乡,倍感亲切。我们是租到房子后才让海运公司发货,不过他们的速度也非常快,海上时间25天,抵达墨尔本一周内就送货上门了。 这次横跨大半个地球的搬家,我们非常忐忑,也非常谨慎,搬家前做了很多调查,最终选择熙浦搬家,他们的售前服务非常好,每一个问题有问必答,耐心负责地解答。上门取货的师傅打包非常专业,特别是那位包装钢琴和家具的师傅,动作干脆麻利,包装细心。 物品从国内发出之后可以线上追踪船舶的实时位置和路线,墨尔本这边的对接很很顺利,每个阶段都有邮件通知,清关也是邮件沟通,非常顺畅。送货前提示有必要的话要通知邻居会有货物达到,送货的本地师傅很友好,大件的包装协助拆除后清运垃圾。看得出来,他们在墨尔本这边合作的公司非常专业靠谱。 可能对比别家费用略贵一点,但是我们觉得跟他们的服务匹配得上,而且取货算出立方数之后就定下价格,后面就不再有其他额外收费。本来以为墨尔本这边会抽查检疫费用和其他安检费用,可能是我们比较幸运,没有抽查到,所以没有新增费用。

May 4, 2025

回顾我和编程之缘

回顾自己十六年来的编程经历,我很乐意分享我和计算机编程结缘的过程。 高中毕业的时候,我从邻居家借到一本Basic语言的书籍,我被它迷住了,那时候我没有计算机,只是在草稿纸上模仿书本上的例子进行四则运算和解方程运算。事实上我从小梦想是做一名数学家,所以我大学专业是数学与应用数学。那时候计算机在中国是热门专业,所以数学系也开了很多计算机的课程,我认真学了一个学期的C语言程序设计,我一直被计算机编程的能力震撼,那时候我知道Matlab和Mathematica可以调用C语言的类库进行非常复杂的数值运行,我在大学参加数学建模比赛就是用计算机算法去验证数学模型。 大二的时候我第一次接触Delphi,第一次接触Pascal语言,被它的简洁语法吸引,不过Delphi那时候已经走下坡路,微软的MFC已经蚕食它的市场份额,而Delphi的创始人安德斯海尔斯伯格也被比尔盖茨挖到微软。大二结束的时候我参加学校编程社团,第一次学习C#并且使用ASP.NET WebForm开发网站,从同学那里,我也了解C#的创始人海尔斯伯格的传奇经历,我被两者深刻吸引。 大学毕业的时候我很幸运加入一家有名的软件公司方正集团,我继续使用C#和.NET开发网站,那时候我独立开发了一个CMS系统,虽然很简单但是非常实用,后来我深入参与电子报纸和电子图书的算法设计和软件开发。移动互联网刚刚诞生的时候,我和另外一位工程师基于Mac版本的FBReader开发了ios版本的图书阅读器,那时候我第一次接触object-c。 我也喜欢linux,自己会安装linux操作系统来学习,所以我在工作之余自学了php语言,但是我更喜欢C#这门语言,所以我一直没有转移到其他开发语言。微软和我Windows的闭源一直是我心疼之痛,后来我接触开源Mono,这是.NET在linux的一个实现,但是Mono的重点在桌面和游戏开发。 我加入百度公司之后有机会在linux生态系统下进行软件开发,我们使用php语言和mysql,这段经历扩宽了我的技术视野,让我对编程语言有了更深刻的理解:语言大同小异,最核心的还是算法和数据结构,以为优秀的开发人员应该能同时使用多种编程语言。 离开百度之后,我加入一家初创企业,我负责组建团队并开发互联网产品和软件,选择公司技术栈的时候我面临在php和c#之间二选一。那时候.NET已经开源,Mono的作者也创立了新公司Xamarin,专注于使用C#开发跨平台的移动应用。加上结合公司的情况,我继续选择使用C#作为主开发语言,但是我们也使用mysql、memcached和Redis等技术。我们的第一个移动应用也用C#来开发,那时候是属于很前卫的选择,还好我们坚持了下来,因为到了2016年微软换CTO了,开始拥抱开源,紧接着是收购Xamarin,还有筹划.NET Core的开发。我一直关注.NET Core的进展,后来看到StackOverflow使用.NET Core2.1,他们极大提升了性能,于是我开始在我们的新开发产品中使用.NET Core,到了.NET Core3.1的时候开始将legacy code迁移到.NET Core。 这里不得不提一段我学习深度学习的插曲,2018年左右我认真学习了Michael A. Nielsen的《神经网络与深度学习》,并熟读第二章的多元微积分公式和证明,我甚至在纸上推导了全过程,这是我再次接触神经网络算法(大学数学建模的时候我学习过)。我似乎又回到了大学学习数学分析的时候,这本书写得非常好,作者从最根本最朴素的思想开始,结合实践进入深度神经网络,我认为这本书堪称神经网络的几何原本。我没有继续深入到深度学习中去,但是我认为它最根本的核心还在这本书里。也许哪一天,我还会重新捡回这段技术经历。

March 25, 2025

委托和接口的选择

A delegate design might be a better choice than an interface design if one or more of these conditions are true: • The interface defines only a single method. • Multicast capability is needed. • The subscriber needs to implement the interface multiple times. 如果满足以下一个或多个条件,委托设计可能比接口设计更好: • 接口仅定义一个方法。 • 需要多播功能。 • 订阅者需要多次实现该接口。

March 5, 2025

部署NextJS到Azure WebApp Deployment Error报错: cannot find module ../server/require-hook

当我将nextjs应用程序部署到azure web应用程序的时候报错:cannot find module ../server/require-hook。 我通过github-actions构建和部署成功完成,但是部署后,我在url 中收到错误,并且在azure日志流利发现这个错误。刚刚开始我不明白是什么原因造成的,因为“npm start”在我的本地机器上使用相同的 npm 版本构建和运行。 通过网上查找,发现是因为githhb的action默认不会把.next文件夹打包加入zip并且发布到azure。所以需要在默认的工作流基础上修改: 1、adding “startAzure”: “./node_modules/next/dist/bin/next start” in package.json; 还需要在azure应用程序网站的配置立加上 the startup command of the azure web app like “npm run startAzure” 2、添加这个到azure的 pipeline (在创建 zip了之后) - name: Zip artifact for deployment run: zip release.zip ./* -r - name: Add .next folder to zip artifact for deployment run: zip -r release.zip ".next"

February 27, 2025

小提琴演奏主要基本功

小提琴的演奏技术来说,要练好以下几个主要基本功: 一、运弓 优秀的演奏家能在小提琴上发出千变万化的声音,就运弓而言,取决于运弓的速度、弓在弦上的压力以及弓和弦的接触点这3种因素的不同结合。小提琴的弓法繁多,就其主要的有以下几种: ①分弓:一弓演奏一个音; ②连弓:一弓演奏许多音; ③顿弓:音与音之间断开; ④跳弓:弓毛离开琴弦。 这4类弓法是最基本的,在20世纪中期,连顿弓,即在一弓中连续快速演奏许多音与音之间是断开的音,被人视为绝技,所以人们把小提琴演奏艺术称之为“运弓的艺术”。 二、揉弦 通过左手手指在弦上的颤动,使声音的音高产生有规律的波动,称之为揉弦。 揉弦是小提琴演奏中极为重要的表现手段。揉弦分为手指的、手腕的和手臂的。优秀的演奏者不仅要掌握这3种揉弦方法,而且要学会使用不同速度和不同幅度的揉弦,在演奏不同作家,不同作品,不同乐句时,富于变化地运用揉弦。从揉弦的运用,可以使听众明显地辨认出不同演奏家的音乐个性。 三、把位 左手手指在指板上的位置,称之为把位。靠近琴头的把位为低把,靠近琴马的为高把。从一个把位换到另一个把位,称为换把。 换把位的方法有多种,例如空弦换把,同指换把,不同指以及泛音换把等。换把时产生非音乐需要的滑音,是技巧训练不足的标志。滑音可以使音与音之间的连接富于变化,特别是结合换把使用滑音,是一种富于表现力的演奏手段。 四、双音与和弦 小提琴可以同时演奏两个音甚至是3个音,也可以分奏4个音的和弦,这不仅丰富了它的表现力,并可不依赖其他乐器的伴奏进行单独演奏。小提琴的三度、六度、八度以及十度双音音阶,是演奏双音的基础,也是小提琴家必须终身练习的一项基本功。小提琴演奏中的左手颤音、泛音、拨弦等,都是一些高深的技巧。

September 28, 2024

[转]React官网力荐Next.js:为何它取代了Create-React-App?

随着前端技术的快速发展,React作为一款领先的JavaScript库,不断推动着前端开发的变革。近期,React官网的一个显著变化引起了广大开发者的关注:它不再推荐使用Create-React-App作为构建React应用的默认工具,而是转向了Next.js。 那么,Next.js究竟有何魔力,让React官网做出如此决策?本文将为你详细解析。 一、Next.js:React应用的“升级版” Next.js并不是一个全新的框架,而是基于React的服务器端渲染框架。它提供了许多开箱即用的功能,使得开发者能够更高效地构建复杂、高性能的React应用。与Create-React-App相比,Next.js更像是一个“升级版”,它为React应用带来了以下显著的优势: 性能优化:Next.js支持自动静态优化(Automatic Static Optimization)和服务器端渲染(Server-Side Rendering),使得页面加载速度更快,用户体验更流畅。此外,Next.js还支持预渲染(Pre-rendering)和动态导入(Dynamic Imports),进一步提升了应用的性能。 数据获取简化:Next.js内置了数据获取功能,使得开发者能够更方便地从API或其他数据源获取数据,并将其注入到组件中。这种无缝的数据获取流程大大简化了开发过程,提高了开发效率。 强大的路由功能:Next.js提供了基于文件系统的路由功能,使得页面之间的导航变得简单直观。开发者只需创建相应的页面文件,Next.js就能自动为其生成路由。这种方式不仅易于理解,还能减少错误和提高可维护性。 更好的SEO支持:由于Next.js支持服务器端渲染和预渲染,因此它能够更好地处理页面渲染和加载问题,从而提高网站的搜索引擎优化(SEO)效果。 二、Create-React-App的局限性 虽然Create-React-App为React开发者提供了一个快速搭建项目的脚手架,但随着项目规模的扩大和复杂度的增加,其局限性也逐渐显现: 配置不灵活:Create-React-App为开发者提供了一套固定的配置,虽然这降低了入门门槛,但对于有特定需求的开发者来说,这种固定配置可能会成为束缚。 性能优化有限:Create-React-App主要关注于项目的快速搭建和开发体验,对于性能优化方面的支持相对有限。对于需要高性能的应用来说,开发者可能需要花费更多的时间和精力进行手动优化。 扩展性不足:随着项目的发展,开发者可能需要集成更多的功能和工具。然而,Create-React-App的扩展性相对有限,可能无法满足一些高级需求。 三、React官网推荐的背后 React官网之所以推荐Next.js而非Create-React-App,背后有多重原因。 首先,Next.js作为React的“升级版”,在性能、数据获取、路由等方面提供了更强大的支持,能够更好地满足现代Web应用的需求。 其次,随着前端技术的不断发展,开发者对于高性能、易扩展的应用框架的需求也在不断增加。Next.js正好符合这一趋势,能够为开发者提供更高效、更灵活的开发体验。 最后,React官网的推荐也反映了社区对于Next.js的广泛认可和支持。越来越多的企业和项目采用Next.js构建应用,证明了其在实际应用中的价值和优势。 四、结语 React官网推荐使用Next.js而非Create-React-App,是基于对现代Web应用需求的深入理解和对前端技术发展趋势的敏锐洞察。对于广大React开发者来说,了解和掌握Next.js将是一个值得投入时间和精力的选择。它将帮助你更高效地构建高性能、易扩展的React应用,提升你的开发能力和竞争力。 https://segmentfault.com/a/1190000044806695

September 9, 2024

[转]React团队回应用Vite替换Create React App的建议

Create React App 的演变 在 2016 年发布 Create React App 时,工具的环境是分散的。如果想要将 React 添加到现有应用,需要添加一个 script 标签或从 npm 中导入,然后调整现有的构建工具配置。但是,如果要从头开始创建一个仅使用 React 构建的新应用,则没有明确的方法可以做到这一点。 在 Create React App 之前,必须安装一堆工具并将它们连接在一起,提供正确的预设以使用 JSX,为开发和生产环境进行不同的配置,为资源缓存提供正确的设置,配置 linter 等,想要正确完成这一系列工作非常困难。人们通过创建和共享可以克隆的“样板”存储库来解决了这个问题。然而,这产生了另外一个问题:一旦在项目中调整了克隆的样板文件,就很难再拉取样板的更新。这样,项目的设置会变得旧,要么放弃更新,要么花费大量精力让所有工具再次协同工作。在快速发展的生态系统中,这非常困难。 Create React App 通过将多个工具组合在一个包中解决了这个问题。现在,如果想用 React 开始一个新项目,有一个明确的推荐方法(Create React App)可以做到这一点! 然后,每隔一段时间,可以更新这个包,以获得所有底层工具的更新。这种模型变得很流行,以至于今天有很多工具都以这种方式工作。Vite 确实是拥有相似愿景的最佳工具之一,并且在在某些方面更进一步。 Create React App 的目标是为大多数 React 用户提供启动新 React Web 应用的最佳方式,它支持一组协同工作的精选功能。随着时间的推移,它提供的开箱即用的“baseline”会随着我们找到正确的权衡而扩大。 例如,为运行时错误添加了一个遮罩层,添加了对不同样式选项的支持,默认添加了快速刷新,它允许保存组件的代码并查看更改而不会丢失状态。对于默认的 React 开发体验来说,这是一个巨大的里程碑。总的来说,由于 Create React App 完全控制了编译管道,因此添加编译相关的功能是很容易的。 有这样一个精心策划的设置对生态系统仍然很有价值。当 React Hooks 出现时,React 团队将 React Hooks lint 规则添加到默认设置中。除此之外,Create React App 还允许 React 团队向尽可能广泛的受众部署重要的工具更改(快速刷新支持、React Hooks lint 规则)。 如果没有 React 团队策划的流行模板,将很难如此广泛地推出这些工具更改。 ...

July 25, 2024

[转]Create React App 入门及 webpack 配置

Create React App(以下简称 CRA)是一个官方支持的创建 React 单页应用的脚手架,它提供了一个零配置的现代构建设置,将一些复杂工具(比如 webpack, Babel)的配置封装了起来,让使用者不用关心这些工具的具体配置,从而降低了工具的使用难度。 创建方法 npx: npx 来自 npm 5.2+ 或更高版本 npx create-react-app my-app npm: npm init 在 npm 6+ 中可用 npm init react-app my-app Yarn: yarn create 在 Yarn 0.25+ 中可用 yarn create react-app my-app Scripts 在新创建的项目中,你可以运行一些内置命令: npm start 或 yarn start 在开发模式下运行应用程序, 默认在浏览器打开http://localhost:3000。如果更改代码,页面将自动重新加载。 npm test 或 yarn test 以交互模式运行测试程序。 默认情况下,运行与上次提交后更改的文件相关的测试。 npm run build 或 yarn build 将生产环境的应用程序构建到 build 目录。 它能将 React 正确地打包为生产模式中并优化构建以获得最佳性能。构建将被压缩,文件名中将包含哈希。 npm run eject 注意:这是单向操作。一旦 eject ,就回不去了! 执行完这个命令后会将封装在 CRA 中的配置全部反编译到当前项目,这样开发者完全取得 webpack 文件的控制权,可以自定义修改webpack打包配置。 ...

July 9, 2024

MiniProfiler工具介绍

在日常开发中,应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能:如:Zipkin等;但这些过于复杂,需要单独搭建。 MiniProfiler就是一款简单,但功能强大的应用新能分析工具;可以帮助我们定位:SQL性能问题、响应慢等问题。 MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EF CodeFirst等 )。并且以很友好的方式展现在页面上。 MiniProfiler官网:http://miniprofiler.com/ MiniProfiler的一个特别有用的功能是它与数据库框架的集成。除了.NET原生的 DbConnection类,MiniProfiler还内置了对实体框架(Entity Framework)以及LINQ to SQL、RavenDb和MongoDB的支持。任何执行的Step都会包括当时查询的次数和所花费的时间。为了检测常见的错误,如N+1反模式,profiler将检测仅有参数值存在差异的多个查询。

June 26, 2024