Logo

site iconkoobai | 空白生活

一直从事设计相关工作,服务过线下传统行业(广告、服装公司)到线上互联网行业(国内社交、跨境电商公司)。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

koobai | 空白生活 RSS 预览

从 iOS 更换到 Android 会有不适吗?

2024-09-19 21:15:36

从 iOS 更换到 Android 会有不适吗?

还有几个小时就是 iPhone 16 系列正式发售的日子,看评测说提升最大的是拍摄视频又拉开 Android 机一个台阶。既然自己不买,那就来聊聊自己从 iOS 更换到 Android 的体验。以自己日常使用场景,先说结论:98% 没什么不适的,剩余的 1% 在于通知的延迟、1% 裸机下容易边缘误触。

从 iPhone 6 开始加入 iOS 阵营,随着每年的迭代跟随更新,一直到 iPhone 11 系列。为什么 11 之后没跟随脚步,一是硬件所带来的惊喜感在降低,二是 iOS 早已过了新鲜劲,每年都感觉没变化。最重要的一点就是——没钱了。于是在 11 Pro Max 使用到今年第五个年头,7 月底更换了小米 14 Ultra,到此刻为止,体验 Android 一个多月时间了。

早听说国内 Android 魔改版本,系统广告及内置第三方软件非常多,还好旗舰机都可以关掉或卸载,只是需要你花点时间搜索下都存在哪些角落,然后关闭。不像 iOS 干净清爽。

交互层面,两个系统现在越来越趋同。常用的软件,不管是界面还是交互,更是没区别,所以上手没难度,无缝衔接。由于之前 11 是 60 赫兹刷新率,换到 120 赫兹的 14,这顺滑度,用了就回不去了,尽管 iOS 的动效再怎么丝滑,但硬件上的瓶颈,没办法。 中秋 小米魔改的 Android 用的爽的几个地方:

  1. 骚扰电话小爱自动接听,这功能实在太爽了。就在今天下午,小爱跟一个推销的有来有回聊了 5 分多钟,看记录实在是好玩。再也不用操心每天那么多的骚扰电话了,iOS 就是一傻逼。
  2. 开屏广告无障碍跳过,通过安装第三方软件( GKD)实现。再也不用忍受不小心扭动了一下手机就自动打开广告了,哪个傻逼产品经理想出来的,垃圾。
  3. 应用双开,没办法,工作上的需要。
  4. 其他爽的点,如通话录音、快递推送、行程推送等等,这些都是本地化的特点,爽。

用的不爽的点,主要就是一开头写的两点:

  1. 由于自己现在做电商业务,所以对于电商平台的管理软件,实时推送是刚需,不然可能会错过一些重要推送而损失订单或回复不及时而扣分罚款之类的。不知道是自己设置问题还是本身 Android 的问题,老是出现推送延迟。搞得我现在必须带着手环才行(手环推送相对实时很多)。
    既然说到做电商业务,看到这的朋友,可以去逛逛,有需求就支持一波: 骑时这样
  2. 我是一个坚定的裸机党,这次买的摄影套装的壳用了几天也不用了。更别说手机买回来第一件事就是把屏幕膜撕掉。但没有壳之后,很容易误触边缘,譬如你看视频看得好好的,手稍微动一下,页面就给我跳转掉了。。。头疼。

至于其他的,个人使用场景,iOS / Android 使用起来没啥区别,两个系统交互也越来越融合。不过如果从生态的角度上看,那就看自己绑定有多深了,之前会认为自己绑定得非常深,更换很麻烦。因为电脑、平板、手表、耳机、手表都是苹果的。但发现换了 Android 之后,也没觉得怎么样。如文字手机中复制,电脑黏贴。微信输入法也可以做到。图片视频隔空投送,装第三方软件 LocalSend也能实现,虽然稍微麻烦点,毕竟需要打开它,但速度快。云服务,自己有家庭 NAS。手表/耳机,这就没办法了,想更好的体验,只能替换。总的来说,对自己影响不大。

使用了万年不变的 iOS 内置拍照滤镜,小米 14 Ultra 有了徕卡加持,拍照效果很满意~~

五一假期之登高望远

2024-05-02 19:21:28

五一假期之登高望远

上次爬山还是 2021 年初,即使家门口就有个临平山公园,开发得也非常好,但一直也没想着要去再爬一次。也许跟小时候就是在山沟沟里长大有关,砍柴要上山、放牛要上山、干一些农活也要上山,所以对山已经免疫了,提不起什么兴趣。如果是说去看海,那分分钟钟立马得去。

为什么今天想着要去爬一次?五一外面人太多,不适合外出太远;找个地方骑行,闺女不想骑;最近脑子里不知道为什么,老是冒着说要去爬次山,于是就决定今天。虽然老婆还是不大愿意,因为她每天上班期间都要走不少路,不想再走了,但还是买上了在山顶我们要野炊的 KFC 。一家人出发~~

到了山顶,发现比记忆中路途更短,手表显示高度 170 米。也许前几次爬的时候,闺女还很小,走得慢,时不时还得背背,现在走得比我俩都快。想想时间是真快,一晃都十周岁了。

20240502_520240502_6

户外吃东西就是爽,比在家吃感觉更香。不过过程发生一个插曲,有个小孩过来一直盯着我们看,家长过来拉都拉不走,说我也要吃,拉走了又过来。怎么说呢,如果是弱势群体,没什么说的,我们也会分享,但感觉更多的是没礼貌,影响心情。

吃饱准备下山,闺女说,上洗手间的时候,听到人家说坐一次游览车十块钱,这明显的暗示。算了,反正她妈膝盖也不是很好,就让娘两去坐车吧,自己一个人继续悠哉的步行下山~

这次爬山有什么不同?只有感叹孩子成长太快了,另外满足了爬山的想法,至于其他的,嗯。。。只要一家人在一起,干什么事情都可以。

20240502_220240502_4

以后如果小米做汽车了,也可以买小米汽车

2024-03-30 17:15:16

以后如果小米做汽车了,也可以买小米汽车

28 号晚,本来计划在屏幕前看看小米汽车发布会,但忘记了,想起来的时候已经是 20:30 分左右,算了,不如继续骑车来得爽。几小时后,刷微博见铺天盖地的小米汽车新闻跟售价,想起来 2019 年说的一句话:“以后如果小米做汽车了,也可以买小米汽车”。

当时说这句话的情景是,老婆带我看完车位,走在路上,聊起:
我说:本来我想先换车的,理想 NEO 不错。
老婆说:先买车位,车子是消耗品,什么时候换都可以,以后有更新更好的。有了车位,装充电桩也方便。
我沉默片刻说:行,我们家的智能设备都是小米系的,以后如果小米做汽车了,也可以买小米汽车。

几年过去,小米汽车真的上市了,我买吗或者说现在有能力买吗?先从 2022 年又摇中一个汽车指标开始,指标 1 年有效期,到了临近期限放弃了指标。车位当时买来 16 万,本打算今年初卖掉缓解下经济压力,但目前也只能卖 10 万左右,有可能更低,而且还没人要。所以,答案显而易见,目前没能力买。看不看发布会似乎也显得无所谓。

现在开的是 2015 年 1 月份买的起亚 k3,虽然连中控屏幕都没有(当时想去汽车城换一个,但 ui 界面实在是太难看),但这些年兢兢业业一直陪伴左右,没给掉链子,希望今后的日子继续兢兢业业的。当时买车的原因是,一直想拥有一辆车。但手上没啥钱,还是老婆决定说,想要就去买。她跟同事借了信用卡,再加上一点自己的钱,我们付了首付开回家。

自从国内新能源开始逐步崛起,自己又是喜欢捣鼓智能,所以想着换辆智能汽,但 2019 年之后,自己的工作问题,事与愿违。从自己使用角度看,按照现在汽车迭代的速度,只能安慰说等等党永远是胜利的。但从行业出发,对于自己来说,错过了这波汽车智能的发展。

题外话:发现自己买任何东西都是在最高点的时候,只要当下有能力,在自己的承受范围内,想要就立马必须得到手,宁愿多花钱,也不想多等一刻,所以从不去比较或者看其他渠道是不是可以更便宜。买完之后,再来研究。

自行车给自己带来了什么情绪价值爽点

2024-03-17 17:18:54

自行车给自己带来了什么情绪价值爽点

自行车的记忆还是停留在大学里的那辆折叠自行车,没记错的话,应该还是深蓝色的。毕业之后还把它从学校一起带到了杭州,每天上下班骑着。某天锁在出租房楼下,被人剪开锁偷走了。从那之后一直到去年 10 月份就再也没拥有过自行车。

这次的契机借口是平常陪闺女一起骑行,但没想到的是,时间已过去 5 个多月,居然还热忠于折腾与骑行,今天想改装个啥,明天想骑什么路线。似乎自行车给自己带来了不一样的情绪。

改装升级

骑行的公路数不多,但逐渐发现,换个把带颜色、升级对轮组、改个车把、换个坐垫、改个线管线芯、调个前拨后拨等等非常有意思。不是因为换完的结果,而是自己跟着视频先学习,然后电商平台下单回家,再自己动手。随着自己会更换内外胎、会以八字法缠把带、会拆中轴、会更换轮组等等,这过程太有乐趣及满足感了。当然过程会不小心把手搞破皮、也会因为搞不好而苦恼,但最终看到自己动手后的成品,这精神的满足感,恨不得立马去户外骑上一圈。

而这一切自己动手的开端是因为刚买车那会去店里调试,发现当时的技师并不专业,调个前拨都不会。居然还碰到一次因为不熟练,而把我车调坏的(之后给我换了一辆)。想着碰到专业的技师这么难,还不如自己跟着视频学自己来,硬生生的让自己往技师方向一步一步的迈进。得感谢这不靠谱的技师,让自己享受了折腾的乐趣,填补了空虚。

骑行

去哪骑

之前在 二零二三有什么不一样的博文中就提到:“只要天气及时间适合,一家人就骑出家门。感受着外面不一样风景或路边不一样的美食”。确实,现在随着自己把自行车改装成自己更满意的样子,骑行的乐趣越来越浓。要么一个人推出去感受两只菜腿的力量,要么一家三口,骑哪是哪,走走停停,非常惬意舒服的休闲。

会为今天出门骑行发现新路线新风景而高兴,想着下次一定要带娘俩来。也会因为今天菜腿的力量似乎又强一点而满足。每次出门,想着今天应该走什么路线?

当然杭州的骑行路线有很多,最热门的叫什么龙井坡。自己暂时还没什么兴趣,先在家附近晃悠下再说。附近有个骑行佬也比较多的路线,时不时就会碰到一群,有天骑着正爬坡的时候,忽然有个人说:“耶,你跟我一样的把带”,我应该回应:你也是个有品味的人。

结尾

都说中年油腻男人要么成为钓鱼佬,要么折腾键盘、路由器、充电头、NAS、自行车。似乎折腾什么不重要,重要的是折腾这个东西,给自己带来了什么满足。当下有个寄托,喜欢才是最重要。

就跟自己玩博客一样,重要的不是发了几篇博文,而是折腾成自己满意样子的过程所带来的满足感。

正敲这篇博文的时候,中间出门把闲置的轮组卖掉,没想到碰到的买家是自己 B 站频道的一粉丝,正要给女朋友组一辆自行车,世界如此大又如此小。这也是自行车所带来的一种情绪满足。

HUGO 折腾随记之热力图 / 段落导航

2024-02-24 16:49:41

HUGO 折腾随记之热力图 / 段落导航

在闲逛各博客的时候,发现有些功能蛮有意思的,于是趁现在还没忙碌起来,跟着抄了下作业,同时通过 AI 的帮忙,优化了下以适应自己页面的风格。

博文热力图

热力图

最开始看到好像是因为 木木老师发了个memos,当时想着自己平常也不怎么更新博文,所以意义不大。这两天又在 椒盐豆豉中看到完整的教程,心想这次页面布局改成很窄的单栏之后,似乎很契合小而美的特性。一顿操作,跟原版的区别在于:

  1. 增加了支持暗黑模式。
  2. 删除了字数统计,及根据字数多少显示色块的深浅。
  3. 简化星期及月份的显示。
  4. 一周的开始,从周日改成周一。
  5. 在 Echarts 官网重新定制了 JS 功能,不然原版的有 1M 多。
<div id="heatmap" style="max-width: 700px;height: 110px;margin-bottom: 40px;"></div>
<script src="https://img.koobai.com/echarts.min.js"></script>
<script type="text/javascript">
  var chartDom = document.getElementById('heatmap');
  var myChart = echarts.init(chartDom);
  window.onresize = function() {
      myChart.resize();
  };
  var option;
  var dataMap = new Map();
  {{ range ((where .Site.RegularPages "Type" "posts")) }}
    var key = {{ .Date.Format "2006-01-02" }};
    var value = dataMap.get(key);
    var link = {{ .RelPermalink}};
    var title = {{ .Title }};
    
    // multiple posts in same day
    if (value == null) {
      dataMap.set(key, [{link, title}]);
    } else {
      value.push({link, title});
    }
  {{- end -}}

  var data = [];
  for (const [key, value] of dataMap.entries()) {
    data.push([key, value.length]);
  }

  var startDate = new Date();
  var year_Mill = startDate.setFullYear((startDate.getFullYear() - 1));
  var startDate = +new Date(year_Mill);
  var endDate = +new Date();

  startDate = echarts.format.formatTime('yyyy-MM-dd', startDate);
  endDate = echarts.format.formatTime('yyyy-MM-dd', endDate);
  
  // 检测浏览器主题模式并选择颜色方案
  var prefersDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;

  // 定义明亮模式下的颜色方案
  var lightTheme = {
      backgroundColor: '#FFFFFF',
      fangkuaicolor:'#F4F4F4',
      gaoliangcolor: ['#ffd0b6'],
      riqiColor: '#999',
      textbrcolor: '#FFF',
      xiankuangcolor:'rgba(0, 0, 0, 0.0)',
  };

  // 定义暗黑模式下的颜色方案
  var darkTheme = {
      backgroundColor: '#1A1718',
      fangkuaicolor:'#282325',
      gaoliangcolor: ['#b25f2f'],
      riqiColor: '#666',
      textbrcolor: '#332D2F',
      xiankuangcolor:'rgba(0, 0, 0, 0.0)',
  };

  // 根据浏览器主题模式选择当前主题
  var currentTheme = prefersDarkMode ? darkTheme : lightTheme;

  option = {
    tooltip: {
    hideDelay: 1000,
    enterable: true,
    backgroundColor: currentTheme.textbrcolor,
    borderWidth: 0, // 边框宽度为0
    formatter: function (p) {
        const date = p.data[0];
        const posts = dataMap.get(date);
        var content = `<span style="font-size: 0.75rem;font-family: var(--font-family-code);">${date}</span>`;
        for (const [i, post] of posts.entries()) {
            content += "<br>";          
            var link = post.link;
            var title = post.title;
            content += `<a href="${link}" target="_blank">${title}</a>` + '<br>';
        }
        return content;
        }
    },
    visualMap: {
        show: false,
        inRange: {   
          color: currentTheme.gaoliangcolor
        },
    },
    calendar: {
        left: 20,
        top:20,
        bottom:0,
        right: 0,
        cellSize: ['auto', 13],
        range: [startDate, endDate],
        itemStyle: {
            color: currentTheme.fangkuaicolor,
            borderWidth: 3.5,
            borderColor: currentTheme.backgroundColor, 
        },
        yearLabel: { show: false },
        monthLabel: { 
        nameMap: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
        textStyle: {
            color: currentTheme.riqiColor,
        }
    },
        dayLabel: {
            firstDay: 1,
            nameMap: ['日', '一', '', '三', '', '五', ''],
            textStyle: {
                color: currentTheme.riqiColor
            }
        },
        splitLine: {
            lineStyle: {
                color: currentTheme.xiankuangcolor,
            }
        }
    },
    series: {
        type: 'heatmap',
        coordinateSystem: 'calendar',
        data: data,
    }
  };
  
  myChart.setOption(option);
  myChart.on('click', function(params) {
    if (params.componentType === 'series') {
      // open the first post on the day
      const post = dataMap.get(params.data[0])[0];
      const link = window.location.origin + post.link;
      window.open(link, '_blank').focus();
    }
});
</script>

详情页段落目录导航

段落导航

这个功能早在去年重新折腾博客的时候就想增加,但当时因为不大会,搞得都不完美,所以也就不了了之。这几天在 atpX中,看到文章目录滚动高亮教程,于是又试着折腾了下。经过跟 AI 的配合,完美显示,不过过程还是碰到问题:

1. 显示位置

如果直接使用 position: fixed; 特性,目录位置只会根据浏览器窗口的大小来改变。这就会导致,浏览器窗口很大,主内容跟目录就会分得很开;浏览器窗口小,主内容跟目录有可能就会重叠。尝试了各种解决方法之后,决定在最上层的父元素中使用display: flex;。然后在目录的上一级再加入一个父元素div,完美解决。

<div class="single-nrong">
<div class="single-zw">主内容</div>
<div>
    <div class="paragraph-dh">文章段落目录导航</div>
</div>
</div>
<style>
.single-nrong {display: flex;}
.single-zw {width: 100%;}
.paragraph-dh {position: fixed;}
</style>

2. 无目录导航

 文章页如果没有目录导航,也会显示内容标题,这就看着很奇怪了。解决方法:  

  {{ $toc := .TableOfContents }}
  <!--判断<li>标签中有没有内容,如果有内容就显示,无内容就隐藏-->
  {{ if findRE "<li>" $toc 1 }} 
    <div class="paragraph-dh">
      <div class="sidebar-biaot">文章段落导航</div>
      {{ $toc }}
    </div>
  {{ end }}

3. 完整方案

特性:1. 默认隐藏,滑动到一定距离显示。2. 滑动到页面上方 1/4 处高亮显示当前目录。3. 点击目录导航平滑滚动到对应的标题。4. 无目录导航的文章页不显示。

  1. 新建 js 文件,如 single.js。
document.addEventListener("DOMContentLoaded", () => {
    const postTOC = document.querySelector('.paragraph-dh');

    const headingObserver = new IntersectionObserver(headings => {
        headings.forEach(({ target, isIntersecting }) => {
            const link = postTOC.querySelector(`a[href="#${target.id}"]`);
            if (isIntersecting && link) {
                postTOC.querySelectorAll('a').forEach(a => a.classList.remove('active'));
                link.classList.add('active');
            }
        });
    }, { rootMargin: '0px 0px -75%' });

    document.querySelectorAll('.content h2[id], .content h3[id]').forEach(heading => headingObserver.observe(heading));

    window.addEventListener('scroll', () => postTOC.style.opacity = (window.pageYOffset > 400) ? 1 : 0);

    postTOC.addEventListener('click', (e) => {
        e.preventDefault();
        const targetElement = document.getElementById(e.target.getAttribute('href').substring(1));
        if (targetElement) targetElement.scrollIntoView({ behavior: 'smooth' });
    });
});
  1. 在 single.html 文件合适的位置中添加:
<div class="single-nrong">
<div class="single-zw">
   文章内容
</div>
<div>
  {{ $toc := .TableOfContents }}
  {{ if findRE "<li>" $toc 1 }}
    <div class="paragraph-dh">
      <div class="sidebar-biaot">文章段落导航</div>
      {{ $toc }}
    </div>
  {{ end }}
</div>
</div>
<script src="/js/single.js"></script>
  1. 在 css 文件中添加:
.single-nrong{
  display: flex;
}
.single-zw{
  width: 100%;
}
.paragraph-dh {
   display: none;
  @include breakpoint('large') {
    display: block;
    position: fixed;
    opacity: 0;
    top: 70px;
    margin-left: 40px;
    transition: opacity 0.5s ease; 
    border-left: 4px solid #f0f0f0;
    padding: 0 15px;
    max-width: 300px;
  }
}
.paragraph-dh a{
  line-height: 1.4;
  color: #666;
}
.paragraph-dh ul{
  gap: 15px;
  display: grid;
}
.paragraph-dh ul ul {
  padding-inline-start: 1rem;
  margin-top: 10px;
}
.paragraph-dh a.active {
  color: var(--text-highlight-color);
  transition: all .25s ease-in-out;
}

结语

现在折腾博客是完全离不开各类 AI 协助了,让一个不懂技术的人也能瞎折腾。这几次折腾的时候发现 coze 非常好用,基本上一次就能给出正确答案。看来 ChatGPT 4.0 就是牛逼。