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 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. ​可用的手机号码段:
    • telStarts 数组包含了当前中国大陆主要的手机号码段,每三个数字代表一个运营商和号段的组合,例如 134、135 等。这些前缀确保生成的号码符合运营商的分配规则。
  2. ​生成过程:
    • ​随机选择前缀:使用 Random 类从 telStarts 数组中随机选择一个号码前缀,保证了号码前3位的合法性和多样性。
    • ​生成中间四位:ran.Next(100, 888) + 10000 生成一个五位数,通过 Substring(1) 获取后四位。为了进一步提高号码的随机性和有效性,可以调整生成范围,避免生成不常用的数字组合。
    • ​生成末四位:类似地,ran.Next(1, 9100) + 10000 生成一个五位数,通过 Substring(1) 获取后四位。
    • ​拼接号码:将前3位、中间4位和末4位拼接起来,形成一个完整的11位手机号码。

在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的简洁和可扩展性,用来做中小项目还是很爽的。

Laravel无法加载.env的问题

在万网虚拟主机上,发现laravel无法加载.env中配置的信息,然后一路跟踪发现,问题出在PHPDotEnv这个库上
在Loader.php里有一个函数如下:

public function setEnvironmentVariable($name, $value = null)
{
    list($name, $value) = $this->normaliseEnvironmentVariable($name, $value);

    // Don't overwrite existing environment variables if we're immutable
    // Ruby's dotenv does this with `ENV[key] ||= value`.
    if ($this->immutable && $this->getEnvironmentVariable($name) !== null) {
        return;
    }

    putenv("$name=$value");

    $_ENV[$name] = $value;
    $_SERVER[$name] = $value;
}

里面使用了putenv函数,这个函数是用于设置或修改环境变量的,目的是把.env里面的配置放到环境变量里面。通过var_dump查看返回值发现都是NULL, 可以猜测万网虚拟主机应该是禁用了putenv这个函数。

解决办法就是放弃使用.env文件,把里面的一些配置信息放到config/app.php里面去。

C#文件重命名

C#文件重命名

DirectoryInfo dir = new DirectoryInfo(img); // 创建DirectoryInfo类的实例
var path = Path .GetDirectoryName(img); // 获取原图片文件的路径
dir.MoveTo(path + $"\\{ret.id}.jpg" ); // 进行改名