安装tightvncserver
sudo apt install tightvncserver
启动
vncserver :1
设置远程访问密码
修改密码
vncpasswd

用vnc登录 ip:1

关闭VNC服务
vncserver -kill :1

先备份xstartup原始文件,再编辑
sudo mv -v .vnc/xstartup .vnc/xstartup.backup
sudo nano ~/.vnc/xstartup

#!/bin/sh
export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
 
exec /etc/X11/xinit/xinitrc
 
xfce4-panel &
xfsettingsd &
xfwm4 &
xfdesktop &
pcmanfm &
xfce4-terminal &
 
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
 
startxfce4 &

更改配置文件的权限:
sudo chmod +x ~/.vnc/xstartup

我这边装的桌面是 xfce4

开机自动启动
sudo nano /etc/systemd/system/vncserver@.service

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=simple
User=chip
PAMName=login
PIDFile=/home/%u/.vnc/%H%i.pid
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1024x768 %i

[Install]
WantedBy=multi-user.target 

sudo systemctl daemon-reload
sudo systemctl enable vncserver@:1.service

关闭
vncserver -kill :1

启动
sudo systemctl start vncserver@:1.service

最后重启
sudo reboot

安装NES模拟器fceux
sudo apt install fceux
fceux

安装Doom
sudo apt install prboom doom-wad-shareware
多人
prboom-game-server
prboom -net 172.20.0.1
单机
prboom

Gmu音乐播放器(我没整明白)
https://github.com/NeoTheFox/gmu-chip.git
https://wej.k.vu/projects/gmu/

命令行播放音乐(mp3不卡顿)
sudo apt-get install sox libsox-fmt-all
chip@chip:~/Music$ play 灰澈 - 森林.mp3
play *mp3 播放当前文件夹的所有mp3
Ctrl+C 下一曲

GUI版系统电量显示
先安装xfce4-genmon-plugin
sudo apt-get install xfce4-genmon-plugin
https://github.com/editkid/chip-battery-status

GUI版系统亮度调整
sudo apt-get install xfce4-power-manager-plugins

DOSBox
sudo apt-get install -y dosbox
sudo wget -O ~/.dosbox/dosbox-0.74.conf https://ganghood.net.cn/dosbox-0.74.conf
sudo nano /home/chip/.dosbox/dosbox-0.74.conf
这个配置文件的倒数第二行是DOSBox的C盘挂载路径
比如
MOUNT C /home/chip/Documents/DOSBox
C:
Install Price of Persia
wget http://www.bestoldgames.net/download/bgames/prince-of-persia.zip
unzip prince-of-persia.zip
Install Golden Axe
wget http://www.bestoldgames.net/download/bgames/wolfenstein-3d.zip
unzip wolfenstein-3d.zip
Install Wolfenstein 3D
wget http://www.bestoldgames.net/download/bgames/golden-axe.zip
unzip golden-axe.zip

通过命令行连接wifi(双引号不能少)
sudo nmcli d wifi connect "wifi名" password "wifi密码" wlan0

键盘功能键
wget -O /home/chip/.Xmodmap http://www.ganghood.net.cn/chip/.Xmodmap
wget -O /home/chip/.xinitrc http://www.ganghood.net.cn/chip/.xinitrc

using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class UScrollRect : ScrollRect
{
    public RectTransform rect;
    /// <summary>
    /// 高度 往下拉是负数   往上拉是正数
    /// </summary>
    float dropValue = -30f;
    /// <summary>
    /// 是否刷新
    /// </summary>
    bool isRefresh = false;
    /// <summary>
    /// 是否处于拖动
    /// </summary>
    bool isDrag = false;
    /// <summary>
    /// 显示、隐藏刷新字段
    /// </summary>
    public Action<bool> OnValue;
    /// <summary>
    /// 如果满足刷新条件 执行的方法
    /// </summary>
    public Action OnRefresh;

    protected override void Awake()
    {
        base.Awake();
        rect = GetComponentInChildren<ContentSizeFitter>().GetComponent<RectTransform>();
        onValueChanged.AddListener(ScrollValueChanged);
    }

    /// <summary>
    /// 当ScrollRect被拖动时
    /// </summary>
    /// <param name="vector">被拖动的距离与Content的大小比例</param>
    void ScrollValueChanged(Vector2 vector)
    {
        //如果不拖动 当然不执行之下的代码
        if (!isDrag)
        {
            return;
        }
        //如果拖动的距离大于给定的值
        if (rect.anchoredPosition.y < dropValue)
        {
            isRefresh = true;
            if (OnValue != null)
            {
                OnValue(isRefresh);
            }
        }
        else
        {
            isRefresh = false;
            if (OnValue != null)
            {
                OnValue(isRefresh);
            }
        }
    }

    public override void OnBeginDrag(PointerEventData eventData)
    {
        base.OnBeginDrag(eventData);
        isDrag = true;
    }

    public override void OnEndDrag(PointerEventData eventData)
    {
        base.OnEndDrag(eventData);
        OnValue(false);
        if (isRefresh)
        {
            if (OnRefresh != null)
            {
                OnRefresh();
            }
        }
        isRefresh = false;
        isDrag = false;
    }
}