QSortFilterProxyModel 对任意列进行排序方法

  • 从 SDK examples 学习来的方法

    • 使用 setRole,设置需要排列的列
    • 使用 sort 方法,进行排序

    使用以上方法,发现只能对第一次 setRole 的列起作用,再切换其它列就不管用了。

  • stackoverflow 学习的方法
    • 重载 lessThan 方法

      bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
      {
          QVariant left = sourceModel()->data(source_left, m_sortRole);
          QVariant right = sourceModel()->data(source_right, m_sortRole);
          return left.toString() < right.toString();
      }   
      
    • 在代码中保存列并排序 m_sortRole

      void SortFilterProxyModel::sortColumn(int column, Qt::SortOrder order)
      {
          m_sortRole = column + LogListModel::NameRole;
          sort(0, order);
      }   
      
    • qml 中响应 TableView 列排序事件

      tableView.onSortIndicatorColumnChanged: {
          logProxyModel.sortColumn(tableView.sortIndicatorColumn, tableView.sortIndicatorOrder)
      }
      tableView.onSortIndicatorOrderChanged: {
          logProxyModel.sortColumn(tableView.sortIndicatorColumn, tableView.sortIndicatorOrder)
      }    
      

android 内核编译打包方法

  • 教程 {XDA}{Tutorial}Build your first kernel.
  • bootimg 打包工具

    下载代码 unpackbootimg ,直接 make 编译解包和打包工具。

  • 编译内核
  • 生成 boot.img 内核包
    • 解包得到 ramdisk 根文件系统

      unpackbootimg -i boot.img -o .
    • 解包 ramdisk.gz 方法(一般不用解包,直接使用即可)

      gunzip -k ramdisk.gz 
      apt install cpio
      cpio -i -F ramdisk 
    • 与编译得到的 boot 内核一起打包,得到 boot.img

      vim pack.sh
      ./mkbootimg \
        --kernel build/arch/arm64/boot/Image.gz \
        --ramdisk ramdisk.gz \
        --cmdline "console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 cma=24M@0-0xffffffff rcupdate.rcu_expedited=1" \
        --base 0x80000000 \
        --pagesize 4096 \
        --dt build/arch/arm64/boot/dtb.img \
        --ramdisk_offset 0x02200000 \
        --tags_offset 0x02000000 \
        --output boot.img
      tar -cvf boot.tar boot.img
      
  • 刷入内核
    • 将 boot.img 打包进 boot.tar

      tar cvf boot.tar boot.img

      AP 中可以包含 boot.img, recovery.img, system.ext 等分区,仅打包部分分区,刷机时不会影响其它分区。

    • 用 Odin 工具刷入 AP,选择 boot.tar 刷入

ubuntu 启动恢复方法

等待网络时间太长

vim /etc/systemd/system/network-online.targets.wants/networking.service
TimeoutStartSec=10sec
systemctl daemon-reload

不显示启动日志

vim /etc/default/grub

删除 quiet splash 参数

update-grub

进入 grub 菜单

开机后,按 escshift 键,可以进入 grub 菜单

grub 命令行修复 ubuntu 引导

grub rescue> ls
(hd0) (hd1) (hd1,gpt8)....

grub rescue> ls (hd1,gpt7)/
./ ../ lost+found/ bin/ boot/ dev/...

grub rescue> set root=(hd1,gpt7)
grub rescue> set prefix=(hd1,gpt7)/boot/grub

grub rescue> insmod normal
grub rescue> normal

##引导进入 ubuntu 后
grub-install /dev/sdb2

win10 安装或升级 docker 失败问题

  • 必须关闭 win10 的实时防毒功能!
  • 如果已经失败,无法安装,无法启动,可以运行的 PowerShell 脚本 remove-docker.ps1 删除。

    $ErrorActionPreference = "SilentlyContinue"
    
    kill -force -processname 'Docker for Windows', com.docker.db, com.docker.slirp, com.docker.proxy, com.docker.9pdb, moby-diag-dl, dockerd
    kill -force -processname com.docker.service
    
    try {
    pushd "C:\Program Files\Docker\Docker\Resources"
    ./MobyLinux.ps1 -Destroy
    popd
    } Catch {}
    
    $service = Get-WmiObject -Class Win32_Service -Filter "Name='com.docker.service'"
    if ($service) { $service.StopService() }
    if ($service) { $service.Delete() }
    Start-Sleep -s 5
    Remove-Item -Recurse -Force "~/AppData/Local/Docker"
    Remove-Item -Recurse -Force "~/AppData/Roaming/Docker"
    if (Test-Path "C:\ProgramData\Docker") { takeown.exe /F "C:\ProgramData\Docker" /R /A /D Y }
    if (Test-Path "C:\ProgramData\Docker") { icacls "C:\ProgramData\Docker" /T /C /grant Administrators:F }
    Remove-Item -Recurse -Force "C:\ProgramData\Docker"
    Remove-Item -Recurse -Force "C:\Program Files\Docker"
    Remove-Item -Recurse -Force "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Docker"
    Remove-Item -Force "C:\Users\Public\Desktop\Docker for Windows.lnk"
    Remove-Item -Recurse -Force "~.docker"
    Remove-Item -Recurse -Force "~\DockerSwarm"
    Get-ChildItem HKLM:\software\microsoft\windows\currentversion\uninstall | ForEach-Object {Get-ItemProperty $_.PSPath} | Where-Object { $_.DisplayName -eq "Docker" } | Remove-Item -Recurse -Force
    Get-ChildItem HKLM:\software\classes\installer\products | ForEach-Object {Get-ItemProperty $_.pspath} | Where-Object { $_.ProductName -eq "Docker" } | Remove-Item -Recurse -Force
    Get-Item 'HKLM:\software\Docker Inc.' | Remove-Item -Recurse -Force
    
    Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\Run -name "Docker for Windows" | Remove-Item -Recurse -Force
    Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\UFH\SHC | ForEach-Object {Get-ItemProperty $_.PSPath} | Where-Object { $_.ToString().Contains("Docker for Windows.exe") } | Remove-Item -Recurse -Force
    
    Get-Item Env:\COMPOSE_CONVERT_WINDOWS_PATHS | Remove-Item
    Get-Item Env:\DOCKER_* | Remove-Item # DOCKER_CERT_PATH, DOCKER_HOST, DOCKER_MACHINE_NAME, DOCKER_TLS_VERIFY
    

双网卡 NAT 配置

配置静态 IP

vim /etc/network/interfaces

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eno1
iface eno1 inet static
        address 192.168.151.111
        netmask 255.255.255.0
        network 192.168.151.0
        broadcast 192.168.151.255
        gateway 192.168.151.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 202.99.192.66 202.99.192.68
        dns-search shanxiunicom

auto eno2
iface eno2 inet static
        address 192.168.199.1
        netmask 255.255.255.0

eno1 连接外网,eno2 连接外网

重启网卡

/etc/init.d/networking restart

配置路由

  • 配置路由转发

    vim /etc/sysctl.conf
    net.ipv4.ip_forward=1
    
    sysctl -p
  • 配置转发表

    vim /etc/rc.local
    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -o eno1 -j MASQUERADE