作者: admin

  • PHP把\n换行符转成<br>

    PHP把\n换行符转成<br>:

    nl2br('abc\ndef'); // 输出abc<br/>def

    函数名的意思是 new line to br

  • C++ STL 去掉字符串中指定的字符 

    C++ STL 去掉字符串中指定的字符 。

    bind2nd 函数要用到头文件functional

    #include <functional>
    
    string response = "aaa\r\nbbb\r\n";
    string::iterator new_end = remove_if(response.begin(), response.end(), bind2nd(equal_to<char>(), '\r'));
    response.erase(new_end, response.end());

  • VC结束进程

    VC结束第三方应用的进程:

    BOOL GetDebugPriv()
    {
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
    
        if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY , &hToken))
        {
            return FALSE ;
        }
    
        if (! LookupPrivilegeValue( NULL , SE_DEBUG_NAME , &sedebugnameValue))
        {
            CloseHandle(hToken);
            return FALSE ;
        }
    
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
    
        if (!AdjustTokenPrivileges(hToken, FALSE , &tkp, sizeof tkp, NULL, NULL))
        {
            CloseHandle(hToken);
            return FALSE ;
        }
    
        return TRUE ;
    }
    
    
    void CToolDlg ::KillProcess()
    {
                    GetDebugPriv();
    
                     PROCESSENTRY32 pe32;
                    pe32.dwSize = sizeof (pe32);
                     HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
                     if (hProcessSnap == INVALID_HANDLE_VALUE )
                    {
                                     MessageBox (L"CreateToolhelp32Snapshot调用失败!\n" );
                                     return ;
                    }
    
                     CString strPrcNameID;
                     BOOL bMore = ::Process32First (hProcessSnap, &pe32);
                     while (bMore)
                    {
                                     if (lstrcmp (pe32.szExeFile, _TEXT( "contrlvip.exe")) == 0)
                                    {
                                                     HANDLE hTargetProcess = OpenProcess(PROCESS_QUERY_INFORMATION |   // Required by Alpha
                                                                     PROCESS_CREATE_THREAD |   // For CreateRemoteThread
                                                                     PROCESS_VM_OPERATION |   // For VirtualAllocEx/VirtualFreeEx
                                                                     PROCESS_VM_WRITE |  // For WriteProcessMemory
                                                                     PROCESS_TERMINATE ,           //Required to terminate a process using TerminateProcess function
                                                                     FALSE , pe32.th32ProcessID);
    
                                                     if (hTargetProcess == NULL )
                                                    {
                                                                     DWORD ulErrCode = GetLastError();
                                                                     CString strError;
                                                                    strError.Format( L"OpenProcess failed,error code:%ld" , ulErrCode);
                                                                    AfxMessageBox(strError);
                                                    }
    
                                                     BOOL result = TerminateProcess(hTargetProcess, 0);
                                                     if (!result)
                                                    {
                                                                     DWORD ulErrCode = GetLastError();
                                                                     CString strError;
                                                                    strError.Format( L"TerminateProcess failed,error code:%ld" , ulErrCode);
                                                                    AfxMessageBox(strError);
                                                    }
                                    }
    
                                    bMore = :: Process32Next (hProcessSnap, &pe32);
                    }
                    ::CloseHandle(hProcessSnap);
    }
    
  • 编译Libgdiplus遇到的问题

    https://github.com/mono/libgdiplus/releases 下载最新版本
    解压并执行 ./autogen.sh,在执行此步时遇到如下问题,并帖出解决办法

    问题:执行 ./autogen.sh时报错 Error: You must have `autoconf’ installed to compile Mono.
    解决办法:apt-get install autoconf

    问题:执行./autogen.sh报错 Error: You must have `libtool’ installed to compile Mono.
    解决:apt-get install libtool

    问题:configure: error: You need to install pkg-config
    解决: apt-get install pkg-config

    问题:No package ‘glib-2.0’ found
    解决:apt-get install glib-2.0

    问题:No package ‘cairo’ found
    解决:apt-get install libcairo2-dev

    都解决后,最后执行 make && make install

  • Supervisor 安装 配置 及 使用

    supervisor是微软官方推荐的一个工具,传送门, 所以我们也使用这个工具来管理我们的asp.net core应用进程

    服务器环境:ubuntu14.04 x64
    安装 apt-get install supervisor
    配置文件目录: /etc/supervisor/conf.d
    添加配置文件 vi /etc/supervisor/conf.d/xxx.conf

    配置内容如下:

    [program:sellplatform]
    command=/var/www/yiinet.cc/SellPlatform
    directory=/var/www/yiinet.cc
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/sellplatform.err.log
    stdout_logfile=/var/log/sellplatform.out.log
    environment=Hosting__Environment=Development
    user=root
    stopsignal=INT
    redirect_stderr=true

    supervisor 相关命令
    重启supervisor服务 service supervisor restart
    查看状态 supervisorctl status
    关闭目标程序 supervisorctl stop sellplatform
    启动目标程序 supervisorctl start sellplatform
    关闭所有程序 supervisorctl shutdown

    相关链接
    在Linux上用supervisor运行ASP.NET Core站点的一个坑

  • SQL SERVER按字母数字的组合排序

    SQL SERVER按字母数字的组合排序

    SELECT Price, Contact,Number,  GameType, ServerName, Account,Password, Rank, RentDate,  Legends, Detail, IsRent, Id
    FROM dbo.AccountInfo
    ORDER BY UPPER(LEFT(Number, patindex('%[^a-z]%',Number)-1)) ASC, Convert(int, RIGHT(Number,LEN(Number)- patindex('%[^a-z]%',Number)+1)) ASC, Number ASC

    Mysql版本

    SELECT  Number
    FROM    accountinfo
    ORDER   BY         
            CASE WHEN Number REGEXP '^[A-Z]{2}'
                THEN 1
                ELSE 0
            END ASC,
            CASE WHEN Number REGEXP '^[A-Z]{2}'
                THEN LEFT(Number, 2)
                ELSE LEFT(Number, 1)
            END ASC,
            CASE WHEN Number REGEXP '^[A-Z]{2}'
                THEN CAST(RIGHT(Number, LENGTH(Number) - 2) AS SIGNED)
                ELSE CAST(RIGHT(Number, LENGTH(Number) - 1) AS SIGNED)
            END ASC

    postgresql版本

    SELECT *, (regexp_matches(Number, '[A-Z]+' ))[1], (regexp_matches(Number, '[0-9]+' ))[1] from aaa
        ORDER BY (regexp_matches(Number, '[A-Z]+' ))[1] ASC ,
                      to_number((regexp_matches(Number, '[0-9]+' ))[1], '999999') ASC
  • Python2 在windows控制台运行会出现乱码,改用IronPython解析就好了

    Python2 在windows控制台运行会出现乱码,改用IronPython解析就好了。

    Python2 在windows控制台运行会出现乱码。

     一个彻底的解决 办法是改成python3,但工作量太大。
    今晚试了下IronPython,,非常好用,直接支持中文了,而且不用改一行代码!!!

    因为这个事情浪费了好多时间。把一个QQ机器人的代码改成了py3

    注意在Py文件第一行写上: # -*- coding: utf-8 -*-

  • C# 随机生成手机号码

    C# 随机生成手机号码

    private string [] telStarts = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153,180,181,182,183,185,186,176,187,188,189,177,178" .Split(',' );
    
    /// <summary>
    /// 随机生成电话号码
    /// </summary>
    /// <returns></returns>
    public string getRandomTel()
    {
        Random ran = new Random();
        int n = ran.Next(10, 1000);
        int index = ran.Next(0, telStarts.Length - 1);
        string first = telStarts[index];
        string second = (ran.Next(100, 888) + 10000).ToString().Substring(1);
        string thrid = (ran.Next(1, 9100) + 10000).ToString().Substring(1);
        return first + second + thrid;
    }
  • 术业有专攻,列举一些专业成熟的工具和解决方案

    提示:本文发布于八年前,已不具有参考意义。

    不折腾,多年走弯路的经验告诉我,不遵守以下原则必将浪费生命和时间。
    没有问题就不要折腾,遇到问题或需求再去研究并解决。
    用成熟的技术,不要做技术小白鼠。
    不要追求完美 ,世界本来就是不完美的,好和坏是一半一半的。任何事物都有两面性。要接受不完美。
    追求简单、 实用、快速、高效。

    1. 工具的选用:选择对所使用的语言支持最好的IDE(以下只针对windows平台)
      • .NET就用Visual Studio
      • Java就用JetBrains IntelliJ IDEA
      • Python就用JetBrains PyCharm
      • PHP就用JetBrains PhpStorm
      • 数据库开发用Navicat或不同数据库的专用工具(如sql server management studio 和 plsql developer)
      • 编辑器可以选用Notepad++或sublime
    2. Web开发:
      • 没有要求,就用PHP,专为Web而生
        • 给客户做网站,如果不需要维护,可以不用框架
        • 需要长期维护的必须用框架,可以选择的框架有CodeIgniter3或现代化的框架YII2。
        • Laravel虽然流行,但比较吃资源,性能有点弱,真正做项目时要好好考量。
        • IDE用PHPStrom
        • 数据库层用PDO
        • 自己搭建环境用nginx+php-fpm+php7+pgsql
      • 如果需要.net
        • 自己一个人开发就用 asp.net webform简单粗暴效率高
        • 团队开发用asp.net mvc,方便分工合作
        • 跨平台用mono来支持。Linux上服务器用Jexus。
        • asp.net core刚出来,先不用,过几年再说。
      • 如果需要JAVA,就用JFinal,国人开发,据说还不错,我没实践。
    3. 前端框架
      • 考虑兼容性就用pintuer或bootstrap2,兼容性最好,兼容IE8。不考虑兼容性就用bootstrap3或bootstrap4
      • 弹层用国产layer http://layer.layui.com/
      • js框架用jquery
    4. 数据库
      • 给客户做可以用mysql或者mssql,通用性更好。mysql在linux下直接用apt-get安装,省事。不要自己编译,不要没事找事。
      • 没要求或自己用也可以用pgsql(pgsql管理工具使用Navicat for PostgreSQL)。pgsql省内存,性能好,稳定,功能强大——实践出来的。
    5. 做底层的C/C++
    6. 做windows程序的.NET
    7. 做安卓开发的Java
    8. 做苹果应用的oc和swift
    9. 做跨平台桌面程序的Qt
    10. 做服务器的Linux
    11. 做桌面系统Windows或MAC
    12. 服务器后台服务程序可以用C/C++和Java以及Python
    13. 做博客的WordPress或Typecho(这货稍微有点折腾)
    14. 做笔记的evernote或为知笔记
    15. 主机能备案最好选择国内,否则就用香港阿里云或日本conaha,PHP虚拟空间用香港londit,asp.net虚拟空间用webweb香港云。
  • 在Codeigniter中使用Blade模板引擎

    在Codeigniter中使用Blade模板引擎:

    使用compoer引入blade库

    composer require "philo/laravel-blade": "3.*"

    在helpers目录下创建 view_helper.php

    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
    require_once 'vendor/autoload.php';
    
    use Philo\Blade\Blade;
    
    if (!function_exists('view')) {
        function view($name = NULL, $data = [], $mergeData = [])
        {
            $CI = &get_instance();
            if (!isset($CI->blade)) {
                $views = __DIR__ . '/../views';
                $cache = __DIR__ . '/../cache';
                $CI->blade = new Blade($views, $cache);
                $elapsed_time = $CI->benchmark->elapsed_time('total_execution_time_start', 'total_execution_time_end');
                $CI->blade->view()->share('elapsed_time', $elapsed_time);
            }
            echo $CI->blade->view()->make($name, $data, $mergeData)->render();
        }
    }
    

    在config/autoload.php中,引入 

    $autoload['helper'] = array('view', 'url');

    controller中:

    <?php defined('BASEPATH') or exit('No direct script access allowed');
    class Welcome extends CI_Controller
    {
        public function index()
        {
            return view('index', ['name' => 'haha']);
        }
        public function test()
        {
            echo 'this is a test';
        }
    }

    还是喜欢codeigniter的简洁和可扩展性,用来做中小项目还是很爽的。