Nanopi R6S rk3588-yolo-demo 抓猫demo

前前言

家里的r2s服役了好久了,但是受制于rk3328的性能并没有办法跑满家里的千兆宽带,所以最近一直在蹲一个好价的新卵代替,在傻大黑粗公模n100跟r6s之间来回看了一段时间,最后选择了🐟上挂750的r6s。

恰逢朋友最近一直在diss市面上的家(猫)用监控又贵又沙雕,又想起来rk3588上面有npu来着,就提了一嘴感觉不如自己搞个开源灵车甚至还能玩视觉识别,这个时候r6s也到手了,找一下发现有大佬已经手搓出来相关的项目,就尝试部署跑了起来,于是成了上面的视频。

事实上只是把kaylorchen大佬的demo跑起来了而已,自己一不熟c++暂时没法进行进一步开发,二是r6s本身其实已经是路由特化,跟路由功能无关的开发接口已经被友善砍得七七八八了,并不适合进行开发。但是觉得卵上都能跑起来就很好玩,所以发出来记录一下。如果有纯python的实现的话,到时候可以试着自己魔改,印象中rknn库里的demo是纯python,后续有机会的话,我估计会将r6s换掉r2s乖乖当卵,然后再整一块鲁班猫来正经搞事情。

Continue reading

外部脑

对这个概念最初的认知来自于某个缠身于作者负面信息的国人吸血鬼漫画,但是自从Notion诞生开始,这个概念就不是什么科幻的存在。世间存在的知识远远超过一个人可以穷尽和记忆的数量,游戏有攻略有秘籍,那么地球Online自然也需要一本秘籍,也就是外部脑这个概念,说白了就是一本随时随地可以翻出来供自己快速回顾自己走通的东西的记事本,但是内容跨度是一辈子罢了。

以下所有内容都未必是最佳实践,涉及到的代码未必完整,注释未必清晰甚至未必会有注释,仅作为未来或许会用得上的hint记忆使用。

1. ReactJS MUI 夜间模式/深色模式 + 跟随系统 + 记忆
夜间模式Drawer部件
夜间模式Drawer内控制部件
import { ThemeProvider, createTheme } from '@mui/material/styles';

function App() {
  const [isFollowSysTheme, setIsFollowSysTheme] = useState(localStorage.getItem('ThemeFollow') === 'false' ? false : true);
  const [mode, setMode] = useState(checkIsDarkMode());

  // 夜间模式检查
  function checkIsDarkMode() {
    if (isFollowSysTheme) {
      try {
        return window.matchMedia('(prefers-color-scheme: dark)').matches;
      } catch (err) {
        return false;
      }
    } else {
      return localStorage.getItem('NightMode') === 'true' ? true : false
    }
  }

  // 使用createTheme Override对应部件样式
  const appTheme = createTheme({
    palette: {
      mode: mode ? 'dark' : 'light',
    },
    components: {
      MuiDialogContent: {
        styleOverrides: {
          root: {
            '&.Roadmap' : {
              color: mode ? '#c9c2b7' : '#242525',
              background: mode ? '#242525' : '#eeeeee',
            },
            '&.About': {
              color: mode ? '#c9c2b7' : '#242525',
              background: mode ? '#242525' : '#eeeeee',
            },
          },
        },
      },
      MuiListItemText: {
        styleOverrides: {
          root: {
            color: mode ? '#c9c2b7' : '#242525',
          },
        },
      },
    },
  });
  
  // 两个借助localStorage实现记忆的handle
  const handleFollow = () => {
    localStorage.setItem('ThemeFollow', !isFollowSysTheme);
    setIsFollowSysTheme(!isFollowSysTheme);
    window.location.reload();
  }

  const handleMode = () => {
    localStorage.setItem('NightMode', !mode);
    setMode(!mode);
  };

  return (
    <div className="App">
      <header className="App-header">

      <ThemeProvider theme={appTheme}>
        {Contents}
      </ThemeProvider>
      
      </header>
    </div>
  )

2. React 环境变量调用
const Var1 = process.env.REACT_APP_VAR_1;

3. LocalStorage存取json设置与初始化 + useContext
// Settings.js
import ...

// Context
// 其他文件通过导入useSettings就可以使用const { layout, columns } = useSettings();获得
export function useSettings() {
    const context = React.useContext(SettingsContext);
    if (!context) throw new Error("useSettings must be used within a SettingsContext");
    return context;
}

export default function Settings({ children }) {
  // 拿不到浏览器存的才用默认值
  const userSettings = JSON.parse(localStorage.getItem("userLayoutSettings"));
  const [layout, setLayout] = React.useState(userSettings ? userSettings.layout : "rows");
  const [columns, setColumns] = React.useState(userSettings ? userSettings.columns : 2);

  const settings = React.useMemo(
        () => ({
            layout,
            columns,
        }),
        [layout, columns],
    );

  // settings有变动就存浏览器上
  useLayoutEffect(() => {
        localStorage.setItem("userLayoutSettings", JSON.stringify(settings));
        console.log("SET userLayoutSettings: ", JSON.stringify(settings));
    }, [settings])

  // 浏览器没存setting就根据window.innerWidth来决定第一次初始化&保存的值
  useLayoutEffect(() => {
        if (!userSettings) {
            const viewportSize = window.innerWidth;
            setColumns(viewportSize < 480 ? 2 : viewportSize < 900 ? 3 : 4);
        }
    }, [userSettings]);

  return (
    <SettingsContext.Provider value={settings}>
      {children}
    </SettingsContext.Provider>
  );
}

// App.js
import ...

// 原来app的内容
function AppContent() {
  return (
    ...
  )
}

// 用Settings包住AppContent才能正常用,额外变量和逻辑也可以放这里
export default function App() {

  const [var1, setVar1] = useState([]);

  return (
    <Settings>
      <AppContent var1={var1}...>
    </Settings>
  )
}

4. React-router-dom

咕咕咕……

PS5折腾记录-itemzflow使用nfs安装pkg

前言

前前言:由于Theflow那边在五月底有一个pppoe漏洞可能涉及到ps5高版本(8.20以下)漏洞的公开,下文部分内容已经过时,pkg也有了新办法可以调用ps5自带的软件安装管理器不限速安装,这些内容将在ps5新破解公开并确认稳定之后再继续更新。

破解的黄金时代已经过去,在线联网验证成为常态、XGP、PS Plus订阅制游玩盛行的当今,破解的必要性和优势不复当年。确实,现在已经是玩正版的年代了,但是仍有那么一小部分人,无论动机是出自于单纯的白嫖、60帧的血缘,还是说仅仅为了享受破解折腾这一过程的乐趣,他们将自己的主机固件版本故意留在一个现在连PSN都连不上的超低版本,为了保留那些未来可能会被用到的漏洞。

假如你是因为看到这个标题才进来的,我想你已经独立完成了关于itemzflow相关的前置折腾,而且因为开始嫌弃U盘/低速固态/拷贝两次安装pkg的速度所以敲了进来。虽然现在确实是大前期,但是我还是想抱怨一下目前关于PS5/itemzflow的中文教程很多地方都写得依托,谜语人的、说话说一半的、别有用心的人群魔乱舞,吃相简直不能太好看了,所以下文我不只会写关于nfs的内容,还会有PS5折腾的简要指路,当作给健忘的自己留一份笔记。

为什么用日本一的游戏做封面,大概是对日本一这些小体量黑暗童话的爱吧?愿能永远按紧那个方块键。

Continue reading

Komga私人漫画库搭建和信息刮削简明教程

本文主要内容

RT,具体来讲是在Ubuntu22.04纯命令行环境下的docker + docker-compose + nginx proxy manager + komga的部署,再配合任意平台python环境下的bangumikomga使用配置教程。因此本文不会涉及在群晖等gui docker的配置,但是如果ssh进群晖的话理论上操作还是通用的,还请有兴趣的各位自行尝试,翻车了别找我就是。

本文涉及的项目链接

前言

时过境迁,当年写得乱七八糟得Docker+Komga现在有点不堪入目,加上Komga这两年之间的更新内容挺多,包括之前被我自己实际使用中诟病的AVIF支持跟RAR5支持都已经加上,再加上近期了解到BangumiKomga刮削工具的存在,试用之后决定单独开一篇来写专门写Komga,这样看起来也更加方便。那么废话不多说,开干。

Continue reading

圣诞快乐和占位符

再不发就要超时了但是想说的东西很多很多很多,那就先把位置和发布时间先占住,待空出时间的时候,再来将这份心情整理成文字,讲讲猫是从何而来,再讲讲猫背后的狗和鸟……再将一切都凝成结晶,带着继续往前走吧,圣诞快乐。

OpenaiBot搭建教程,一个会说话的纸片人老婆

我超,二次元!

效果展示

开头怎么都得我超一下,这个「我超」表达的是对今年AI领域出圈级发展的进步神速,对声优厨和技术宅和开源技术的感激,让我们身处2023年只需要稍微花一点小钱钱和钻研一下技术,你就可以做到下面这样的事情。

注意音量捏,建议提前调小一点,这个模型是BA里的优香。
Continue reading

Docker快速部署私人云相册+同人音声库+漫画库+网盘+保种盒+Plex

效果展示,平时基本是移动端使用,桌面端也不错不过懒得截图了

前言

最近黑五,亚马逊没啥实体商品的好价,然后脑子一热又开始折腾vps,黑五蹲了一阵子柠檬和主机百科,最后定下来了Liteserver家的黑五折扣小鸡,痛失100欧之后开始了本次的折腾之旅。

目标效果

本次折腾的目标是私人云相册+同人音声库+漫画库(联动安卓Tachiyomi)+网盘+保种盒子+Aria2+Plex,能做到离线下载pt/bt/国内外网盘资源的同时,其中大部分的资源都可以利用云相册、音声库、漫画库和Plex等获得良好的在线预览体验,同时也可以无顾虑的将以上资源分享给友人,以上就是这次的目标效果。

Continue reading

页: 1 2 3 4 5 6 7

© 2024 白磷茶室

Theme by Anders NorénUp ↑