angular5 编译单独 typescript 文件方法

安装 gulp 及相关组件

npm install gulp -g
npm install gulp-typescript gulp-sourcemaps gulp-uglify browserify vinyl-source-stream vinyl-buffer tsify glob gulp-rename event-stream

在根目录下添加 gulpfile.js 文件

gulp = require('gulp');
ts = require('gulp-typescript');
exec = require('child_process').exec;
browserify = require("browserify");
source = require('vinyl-source-stream');
buffer = require('vinyl-buffer');
uglify = require('gulp-uglify');
sourcemaps = require('gulp-sourcemaps');
tsify = require("tsify");
es = require('event-stream');
rename = require('gulp-rename');
glob = require('glob');

gulp.task('ng-build', function (cb) {
  console.log('running ng build...');
  exec('ng build', function (err, stdout, stderr) {
    console.log(stdout);
    console.log(stderr);
    cb(err);
    return true;
  });
});

function tstojs(entry) {
  return browserify({
    basedir: '.',
    debug: true,
    entries: [entry]
  })
    .plugin(tsify)
    .bundle()
    .pipe(source(entry))
    .pipe(rename({
      dirname: './',
      extname: '.js'
    }))
    .pipe(buffer())
    .pipe(sourcemaps.init({
      loadMaps: true
    }))
    .pipe(uglify())
    .pipe(sourcemaps.write('./'))
    .pipe(gulp.dest('./dist/'));
}

gulp.task('worker', function (done) {
  console.log('compiling ts to js')
  glob('./src/worker/*.ts', function (err, files) {
    if (err) done(err);

    var tasks = files.map(function (entry) {
      return tstojs(entry);
    });
    es.merge(tasks).on('end', done);
  });
});

gulp.task('watch', function () {
  // gulp.watch('./src/worker/*.ts', ['worker']);
  gulp.watch('./src/worker/*.ts', function (o) {
    return tstojs(o.path);
  });
})

gulp.task('default', [
  'ng-build',
  'worker'
]);

编译方法

  • 全部编译: gulp
  • 编译 worker: gulp worker
  • 监视编译: gulp watch

配置 qt-creator 用作通用 IDE

  • 导入代码

    File -> New File Or Project -> Import Project -> Import Existing Project
  • 添加删除文件
  • 设置 include 目录
  • 设置预定义宏
  • 打开 ClangModel,去除部分 warning

    -Wno-extra-semi -Wno-unused-parameter -Wno-missing-variable-declarations -Wno-sign-conversion -Wno-vla -Wno-pedantic -Wno-implicit-function-declaration -Wno-cast-qual -Wno-conversion -Wno-unused-variable
    

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