Sheet 1
TimeLine(Sep,2015)
  8.31
    学ncat命令
      自建聊天终端
        ncat -l 127.0.0.1 6601
        ncat 127.0.0.1 6601
      -w:指定连接的空闲超时时间
        ncat -w 10 localhost 2389
      指定ipv4 or ipv6
        ncat -6 localhost 2389
        ncat -4 localhost 2389
      查看建立的连接
        netstat | grep 2389
      -k:不因client退出而取消监听
        nc -k -l 2389
      -u:使用udp协议传输
      -v:显示指令执行过程
    看r13代码
      linux teminal快捷键
        ctrl+shift+w: 关闭标签页
        ctrl + e: 光标移至末尾
      lua exec shell
        local res = lue(cmd)
          返回值
        local file = io.popen(cmd)
          文件
      R13代码不足
        代码封装不严谨
          nwfs中夹杂nw & ww这些view层操作
          meizu下代码可整合成util类，提高内聚性
      R13 get speed
        luci-bwc -i eth0.2 |tail -n 5
          具体参数未知～～
        lua realtimenetspeed函数中rx ,t x是什么鬼
    看miwifi代码
      代码封装对比
      SmartController DB对比
    看mqtt代码变化
      /usr/bin/mqtt_subscribe
      mqttfs.lua & httpfs.lua
      files / file_flag
      /router_statitic
      /down_load_ota_img.sh
    mpd & upmpdcli pc上调试成功
    coding fixbug：定时开关忘记修改开关标记
    uci设置命令
      uci show
      uci set wireless.mt7628iface.disabled=1
      uci set wireless.mt7610eiface.disabled=0
  9.01
    uci配置命令了解
      uci show /etc/config/network
      uci commit <config>
    了解提高开发效率的android代码库
      thinkAndroid
      android-common
      KJFrameForAndroid
      DroidParts
      SAF
      LoonAndroid
    android.mk配置
    fix并测试：定时开关忘记修改开关标志
      delay_openTime_to_2ndDay
      uci set wireless.mt7628iface.disabled=1;
      uci set wireless.mt7610eiface.disabled=1
    git stash clear
    总结《高效程序员的45个习惯》
      对事不对人
        最高优先级是解决问题
          而非寻找罪魁祸首
        将错误当学习机会，而非指责他人的机会
      快速修复完一个bug后，要深挖一层，弄清原理
        治标更要治本
      不需出色才能起步，而是起步了才能出色
      计划没有价值，但计划的过程必不可少
        设计本身无用处
        但在设计过程中学习/修正是有价值的
      程序员拒绝设计的同时，也就放弃了思考
  9.02
    调试/研究android代码库andorid-next
      https://github.com/mcxiaoke/Android-Next
      了解其代码结构以及通用的工具类
    ampd 加入 upmpdcli
      android.mk
      用google的ndkdemo实现helloworld
      在此基础上，整合c++library，失败
      在ampd上整合，upmpdcli
      fix c++11问题
      调试libupnp & upmpdcli
    测试R13无线连接修改密码，wifi无法连上问题，已修复
    跟廖吉明讨论mqtt新版代码
  9.06
    调试github上libupnp（android），失败（木有android.mk）
    android.mk官方api
      轻量级的Makefile
      描述源文件是如何进行编译
    改写local_c_include,fix bug: can't find libupnp header file
    fix bug:can't find <upnp/upnp.h>
    由4引发该bug：#error Bionic header ctype.h does not define either _U nor _CTYPE_U
    libupnp &libupnpp是有区别滴
  9.07
    思考定时开关优化，统一定时接口
    了解crontab
      秒级任务实现方法
      crontab实现原理
    定时开关优化
      尝试在mq上运行代码
      iwinfo ra1 info; echo $?
      将uci set wireless...disabled 改为iwinfo
      Linux下" >/dev/null 2>&1
      关键代码
        local cmd = "iwinfo ra0 info 1>/dev/null 2>&1; echo -n $?"
        local wifi_status = lue(cmd)
  9.08
    编译 / 测试音箱君正版上运行dlna mplayer
      sudo minicom -D /dev/ttyUSB0 -b 57600
      重启udev服务
        sudo service udev restart
      重启adb服务
        $ sudo adb kill-server
        $ sudo adb start-server
      adb push xxx /usr/bin
      修改环境变量
        gvim ~/.bashrc
        source ~/.bashrc
      make -j32;make install;find -iname "mplayer*"
      ./configure --help
      ./configure --prefix=$(pwd)/tmp
      echo $PS1
      switch
        sta
        ap
        airkiss
      dmesg |grep i2c
    git stash
      git stash clear
      git stash list
      git stash drop stash@{1}
      git stash apply stash@{1}
    配合建峰ota-upgrade
    配合艾工/廖吉明测试定时开关
    fix bug：定时开关关闭后，用户选择按两下重新启动wifi，则定时wifi up不执行
    了解mplayer
      linux man page
  9.09
    shell demo
      整形运算三种方式
        let
          a=1;
b=2;
let c=a+b;
echo $c;
        [ ]
          a=1;
b=2;
c=$[a+b];
echo $c;
        (( ))
          a=1;
b=2;
c=$(( $a+$b));
echo $c;
        summary
          let 方式最为简单
          [ ]需在外面用$对返回值进行引用
          (())
            在括号内变量须加$引用
            左括号须和变量间有空格
      文件比较
        -e 文件是否存在
        -f 是一个标准文件
        -d 是一个目录
    alsamixer
      file libupnp.so
      ./configure --host=mipsel-linux --prefix=$(pwd)/tmp
    交叉编译alsamixer
      编译libasound.so
      编译alsa-lib
      编译alsa-unitity
      编译libncurese
    ndk交叉编译upmpdcli
      发现ndk的工具链与一般工具链不同，木有头文件
      了解ndk-build
    fix 艾工‘s bug
  9.10
    ndk生成arm交叉工具链
      SYSROOT=$NDK/platforms/android-8/arch-arm
      ./make-standalone-toolchain.sh --platform=android-19
        /ndk/build/tools
      --install-dir=/tmp/my_android_toolchain --ndk-dir=$NDK_HOME
      --toolchain=arm-linux-androideabi-4.9 --system=linux-x86_64
    编译libupnp
      编译出lib & include
      复制到ndk arm工具链
    编译libupnpp
      依然遇到之前android ndk编译出现的问题
        找不到libupnp相关
      换一个libupnp
      依然找不到lrt / lpthread
      寻找 android 上glibc
      ./configure --host=arm-linux-androideabi --prefix=$(pwd)/tmp --sysconfdir=$(pwd)/etc_tmp
    读《思考的艺术》
  9.11
    android boinc & glibc
      各自概念 & 定义
      如何在android上交叉编译用到glibc的代码
      android上没有glibc，导致libupnpp编不过（librt，libpthread）
    ./configure了解
    upmpdcli官网了解libupnpp
      The libupnpp library, which used to be part of upmpdcli,
has been separated, and you need to build it first.
    编译glibc
      出现问题：
        android linker & linux linker不同
          /system/bin/linker
          ld-llinux.so.3
        http://www.tuicool.com/articles/NNb6V3
        http://blog.csdn.net/wavemcu/article/details/8712688
        http://blog.sina.com.cn/s/blog_757dbe670101hxt9.html
    ld-linux.so
    注释librt & libpthread，怒编之
  9.14
    编译libexpat，将.h & .so复制到工具链中
    下载编译libcurl
    编译libupnpp，遇到错误
      dereferencing pointer to incomplete type
      A. 解决办法
        某个结构体被某个编译宏包裹了
      B. 去掉函数后的__THROW
    C库中函数后接__THROW
      被c++引用后才有意义
      表明该函数支持C++里的throw异常功能
    error: storage size of 'ifr' isn't known
      #include<net/if.h> & #include <linux/if.h>
    编译libmpdclient
      depend boost library
    编译boost库
      depend python-dev
    看《思考的艺术》
  9.15
    编译python-dev lib
      ./configure --host=arm-linux-androideabi --prefix=$(pwd)/tmp --build=arm-linux-androideabi --without-gcc
    ranlib & ar & nm
      ranlib 等价于 ar -s
    ar命令参数
      ar -rcs
    error adding symbols: Archive has no index; run ranlib to add one
      ./configure --host=arm-linux-androideabi --prefix=$(pwd)/tmp --build=arm-linux-androideabi --without-gcc --enable-shared
      --enable-shared
        允许编译动态链接库
    configure: error: cannot run C compiled programs
  9.16
    python xcompile
      patch -p1 < <your patch path> /Python-2.7.3-xcompile.patch
      CC= CXX= AR= RANLIB= ./configure --host= --build=x86-linux-gnu --prefix=
      make HOSTPYTHON=./python_for_build HOSTPGEN=./Parser/pgen_for_build BLDSHARED="" CROSS_COMPILE= CROSS_COMPILE_TARGET=yes HOSTARCH= BUILDARCH=x86-linux-gnu
    mpd-udp_broadcast vs. watchcat
      代码流程基本一致
      SO_BROADCAST
        允许发送/接收广播
      SO_REUSEADDR
        端口释放后立即可再次使用
        不加的话，要等待2分钟
      INADDR_ANY
        0 -> 0.0.0.0
      INADDR_BROADCAST
        -1 -> 255.255.255.255
          -1补码
        sock_in.sin_addr.s_addr=htonl(-1)
      htonl
        host to unsigned long int
      htons
        host to unsigned short
      from.sin_addr.s_addr
        = htonl(INADDR_BROADCAST)
          init
        =bf 24 a8 c0
          recv后
          191.36.168.192
    《unix网络编程》udp章节
        ①左侧进程发送数据报
        ②检测ip为定向广播
        ③arp映射48位全为1的以太网地址
          混杂模式?!
        ④接收任何帧
      网卡工作模式
        1) 广播模式（Broad Cast Model）
          物理地址是 0Xffffff 的帧为广播帧
          工作在广播模式的网卡接收广播帧
        2）多播传送（MultiCast Model）
          多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收
            组外主机却接收不到
          网卡设置为多播传送模式可接收所有的多播传送帧
            不论它是不是组内成员
        3）直接模式（Direct Model）
          只接收目的地址是自己 Mac地址的帧。
        4）混杂模式（Promiscuous Model）
          接收所有的流过网卡的帧
          信包捕获程序就是在这种模式下运行的
          根本不检查目的地址，接收网络上所有的分组。
        ps
          http://blog.csdn.net/abc78400123/article/details/6851566
  9.17
    与占勇联调udp broadcast，成功～
    python xcompile
      fix error: 'struct lconv' has no member named 'grouping'
      fix error: 'I_PUSH' undeclared (first use in this function)
      fix error:conflicting types for '__time_t'
    ampd添加udp json data（groupid & cmd）
      发现问题：ampd传输json以strcpy & strcat实现
        建议用cjson实现
    读《思考的艺术》
  9.18
    fix error: error: undefined reference to 'localeconv'
    c 语言中__P 的用法
      ANSI C之前的老编译器不支持函数原型定义
        定义它的原因
      使用__P宏为ANSI和非ANSI的编译器提供了一种可移植的方案
    Full glib porting onto Android
      Android system is CRIPPLED
        In a POSIXer's view
        1.Android does not have or offers less/no access in its
        trimmed bionic C lib :
        1>No SYS V shm.h/sem.h
        2>Not standard pwd.h and getpwuid_r(),etc. methods
        3>No locale.h
        4>Not standard IP/IPV6 headers/support such as arpa/*.h ones
        5>Not standard pthread.
        6>No iconv funcs.
        7>No intl/gettext funcs
        8>No i18n support and wchar_t.
        魂淡！！全特么都遇到了。。。
    python for android
      google code
      https://code.google.com/p/python-for-android/
      修改pyconfig.h
        #define ANDROID 1 /* Useful for specific code changes.*/
        #define HAVE_BROKEN_MBSTOWCS 1
        #undef HAVE_DEV_PTMX
        #undef HAVE_GETHOSTBYNAME_R
        #undef HAVE_MBRTOWC
        #define HAVE_NCURSES_H 1 /* This only if you've cross compiled curses */
        #undef HAVE_SETLOCALE
        #undef HAVE_WCSCOLL
        #undef HAVE_WCSFTIME
        #undef HAVE_WCSXFRM
    编译boost库
      error "LONG_BIT definition appears wrong for platform (bad gcc/glibc c
      TypeError: not all arguments converted during string formatting
      寻找到boost交叉ndk编译新方法
  9.19
    编译libmpd client
      bin/bash: rsvg-convert: command not found
        sudo apt-get install librsvg2-bin
      fatal error: alsa/asoundlib.h: No such file or directory
      error: cannot find -lmpdclient
      configure: error: doxygen not found
        ./autogen.sh --disable-documentation
      pkgconfig
        is used to retrieve information about installed libraries in the system
    编译upmpdcli
      编译libasound
      编译alsa-lib
        error: storage class specified for parameter
        error: old-style parameter declarations in prototyped function definition
        找不到arm-linux-gnueabi/python2.7/pyconfig.h
      undefined reference to 'typeinfo for Netcon'
      exp10 & exph函数
        /* 10^x = 10^(log e^x) = (e^x)^log10 = e^(x * log 10) */
        #define exp10(x) (exp((x) * log(10)))
      param.h MIN not found
      编译boost 动态库
        error: undefined reference to 'regexecA'
      成功编译upmpdcli
    android 交叉编译方法
  9.21
    了解在android上运行本地c语言代码方法
      根据教程操作，提示permission deny
        手机root后，结果相同
      /sbin:pemission deny
      /system/bin:read only
    adb命令
      adb install [-r] [-s] <file>
      adb uninstall [-k] <软件名>
      adb remount
        获取root权限
      adb get-serialno
    尝试在r12 android板上跑upmpdcli
      mount -t ext4 -o rw,remount /system
      network={
ssid="Netcore_A7290E"
scan_ssid=1
psk="11C7D31165"
key_mgmt=WPA-PSK
group=CCMP TKIP
auth_alg=OPEN
}
      could not load library "" needed by ""; caused by cannot locate symbol "XML_ParserCreate" referenced by ""
        ndk & ubuntu & platform 版本不一致
    google，找到xmp_parsercreate cannot locate symbol的原因
      下载32位ndk测试
    搜索，研究ampd sqlite代码
  9.22
    配合珠海lifekit调试check_sys_passwd
    配置R12 android板工具链
      git clone git://10.2.67.25/r12/hdmibsp
    R12 database put & get
      GHashTable
        glib中实现C hashtable的数据结构
        g_hash_table_foreach
          可遍历键值对
      sqlite 3 for c 常用操作接口
    配合占勇理解/调试dmix代码
    配合廖吉明确认定时开关参数
  9.23
    配合占勇联调
    查找/ 研究mpd.conf读写代码
    查找 / 研究mpd idle
    研究R12工具链代码
      checking host system type…
Invalid configuration `’:
system `androideabi’ not recognized
        方法一
          1.到http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree下载最新的config.guess和config.sub文件；
          2.将下载的文件拷贝到/usr/share/misc目录下；
          3.重新启动编译（sh compile.sh）
        方法二
          建立软连接
  9.24
    makefile是如何自动生成的
      (1). 运行autoscan，生成文件configure.scan。
      (2). 修改configure.scan，改名为configure.in。
      (3).运行autoheader，生成文件configure.h.in（现在一般改为configure.ac）。configure.in里有宏AC_CONFIG_HEADER()时用。
      (4).运行libtoolize，生成一些支持文件，ltmain.sh。需要用libtool生成共享库用。
      (5).运行aclocal，生成aclocal.m4。
      (6). 运行autoconf，生成configure。
      (7).为源文件编写makefie.am，每一个包含源文件的目录和子目录都有一个makefile.am。
      (8).运行automake，生成makefile.in，每个包含makefile.am的子目录都生成makefile.in。
      automake -a选项可以补齐文件config.guess，config.sub，install-sh，missing，depcomp。
      (9).运行./configure，生成config.status，config.h，makefile。
      (10).运行make，生成中间文件对象文件，库文件，最后生成可执行文件。
      (11).运行make install，相应的可执行文件，库文件，头文件拷贝到系统相应位置。
    cross compile render
      ifreq unknown
        add #include<net/if.h> & #include<linux/if.h>
      /bin/ld error
      cRenderer.cc:394: error: undefined reference to 'ixmlParseBuffer'
        src/Makfile: 210: -lupnp -lixml -pthread
      No rule to make target 'README', needed by 'all-am'. Stop
        mv README.md README
    与占勇讨论r12需求
      修改url song name albun
      sqlite 设备基本信息读写
        get / set speakername
        get / set groupid cmd
      url时效性
        虾米sdk可通过id获取url
      mpd 扩展性 for ios
  9.25
    与占勇联调udp 参数格式
    root 魅蓝note & check mpd playlists
    android ndk c/c++ 获取设备信息（设备SN， 机型，sdk版本）
    Android System Properties
      adb shell -> su -> getprop
        获取常用信息
      __system_property_get
    create dbfileforMZ to read & write MPDInfo
  9.26
    与占勇联调setmaster & setslave接口
    封装mpdinfo interface进FileUtil.c
    c文件读写相关函数
  9.28
    与占勇联调程序
    解决ampd文件读写问题
    c 文件 & 字符串操作函数
      strchr
        返回特定字符索引
      strrchr
        反向查找字符，返回字符索引
      strstr
        返回特定字符串索引
      sscanf
        从一个字符串中读进与指定格式相符的数据
        sscanf(buf, "%[^:]", arr_key[line]);
      strtok
        字符串分割
      fopen（path， “r”）
        判断文件是否存在
      fprintf
        格式化输出流到文件中去
        fprintf(fp, "%s%c", s, c);
      fgets
        逐行读取文件
      fputs & fseek
    c中木有bool类型
      添加#include<stdbool.h>使用
    exit & return
      exit: 系统调用，程序结束
      return: 返回上一级函数
    字符指针转字符数组
      strcpy
  9.29
    与占勇联调两台mpd
    帮清亮merge代码
    发现MPD_ERROR问题
    在出现MPD_ERROR的地方加log代码
    优化DBFileutil.c代码
  9.30
    解决广播后ampd崩掉的问题
    adb 真机调试
      adb tcpip 5555
      adb connect 192.168.0.101:5555
      adb disconnect 192.168.232.113:5555
      adb -s emulator-5556 install helloWorld.apk
    与占勇联调程序
      adb -s 460BBK23456Z install -r bin/aMPD-debug.apk ;adb -s 460BBK23456Z logcat MEIZUMsg:I *:S
        多台设备调试
      am start -n be.deadba.ampd/.SettingsActivity
        命令行运行
    出现问题：ampd分组问题
      断电分组保存问题
      组内其中一台启动，另一台不启动
    ampd移植笔记本