作者归档:邹义良

PHP开发中涉及到emoji表情的几种处理方法

PHP开发中涉及到emoji表情的几种处理方法

一般Mysql表设计时,都是用UTF8字符集的。把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串。这是怎么回事呢?

原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了。这要怎么办呢?我来介绍几种方法

1、使用utf8mb4字符集

如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集

这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,是最好的解决方案

至于字节增大带来的性能损耗,我看过一些评测,几乎是可以忽略不计的

2、使用base64编码

如果你因为某些原因无法使用utf8mb4的话,你还可以使用base64来曲线救国

使用例如base64_encode之类的函数编码过后的emoji可以直接存储在utf8字节集的数据表中,取出时decode一下放在www.itxdl.cn即可

3、干掉emoji表情

emoji表情是个麻烦的东西,即使你能存储,也不一定能完美显示。在iOS以外的平台上,例如PC或者android。如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才行。即便如此,还是可能因为emoji图片不够全而出现无法显示的情况

在大多数业务场景下,emoji也不是非要不可的。我们可以适当地考虑干掉它,节约各种成本

// 过滤掉emoji表情

function filterEmoji($str){

    $str = preg_replace_callback(

            ‘/./u’,

            function (array $match) {

                return strlen($match[0]) >= 4 ? ” : $match[0];

            },

            $str);

     return $str;

 }

curl curl_exec 报错 Problem with the SSL CA cert (path? access rights?)

使用cul扩展的时候提示 Problem with the SSL CA cert (path? access rights?) 或者使用yum 进行更新或者安装软件的时候提示失败

有一种可能就是系统的ca包没有更新

包名为

ca-certificates

更新一下这个包一般通过yum安装或者更新软件就没问题了

curl扩展还是提示这个问题 需要重启一下PHP 重新加载一下扩展才能解决问题

 yum -y install ca-certificates

pkill php-fpm

 /usr/local/php/sbin/php-fpm 

linux限制ssh用户使用命令

假设有机器A和B,分别有帐户a和b,现在希望允许a能以b的身份登陆B,但是限制a仅能访问$HOME/bin下面的命令(比如作为中转机,要求只能使用ssh命令),可以如下操作:
        1、在A上帐户a下生成RSA密匙对,并把公钥写入B的帐户b下的~/.ssh/authorized_keys中。
        2、编辑~/.ssh/authorized_keys,在前面加上语句:
command=”bash –restricted –noprofile –rcfile $HOME/.stricted_profile” ssh-rsa 。。。
         这句话的作用是使用restricted模式,并且不加载系统默认的profile文件,而加载我们定义的profile文件$HOME/.stricted_profile。上面添加command参数一定是在一个主机行的前面,每添加一台主机,需要添加一行。
         3、编辑 $HOME/.stricted_profile文件
                PATH=${HOME}/bin
                export PATH
         4、加入想让该用户使用的命令,如ssh
             mkdir $HOME/bin
             ln -s /usr/bin/ssh $HOME/bin/
这样当登陆这台机器的时候,除了ssh 命令,不能使用其他任何命令。效果如下:
ssh usr@192.168.122.28
bash-3.2$ ls bash: ls: command not found bash-3.2$
即使ls也不能使用

Linux批量添加用户(newusers、chpasswd)

在 Linux 用户管理中,大批量添加用户是经常需要的;如果用useradd或adduser 来添加大量用户,对系统管理员的体力和耐力是一个极大的挑战;好在Linux有大批量用户添加工具 newusers ,我们通过newusers 和chpasswd 就可以轻松完成大批量用户的添加;
 

为什么需要大批量添加用户;

我们什么时候才需要大批量添加用户呢?有时我们需要让几十个或更多的用户在主机上完成相同或相似的任务,比如我们想同时添加一堆的ftp 用户,这些ftp用户归属同一组,但不允许他们通过终端或远程登录服务器;有时我们可能为了教学,比如我们有50个学生,并且每个学生在服务器上有一个独立的用户名,能登录系统,并能管理自己的帐号或完成一些在自己权限下的作业;

批量用户添加流程;

批量添中用户流程是通过newusers 导入一个严格按照/etc/passwd 的书写格式来书写内容的文件来完成添加用户,然后通过chpasswd 导入用户密码文件来完成批量更新用户密码的过程;

1、newusers 成批添加用户的工具;

其用法很简单,newusers 后面直接跟一个文件;文件格式和/etc/passwd 的格式相同;

用户名1:x:UID:GID:用户说明:用户的家目录:所用SHELL

举例:

win00:x:520:520::/home/win00:/sbin/nologin
win01:x:521:521::/home/win01:/sbin/nologin
......

值得一提的是关于SHELL类型,查看主机上所有SHELL ,可以通过chsh 来查看;

[root@localhost beinan]# chsh --list
/bin/sh
/bin/bash
/sbin/nologin
/bin/ksh
/bin/tcsh
/bin/csh
/bin/zsh

其中除了/sbin/nologin ,其它类型的SHELL 都能登录系统;nologin 大多是虚拟用户用的SHELL ,也就是说虽然他是系统用户,但他并无登录系统的权限;如果您想添加这类用户,就把他的SHELL 设置成/sbin/nologin ,比如上面的例子;

关于用户名、UID、GID及用户的家目录是怎么回事,您可以读相应的参考文档;

2、chpasswd 批量更新用户口令工具;

chpasswd 工具是成批更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中;

chpasswd < 文件

但文件的内容并不是没有约定的,必须以下面的格式来书写,并且不能有空行;

用户名:口令

用户名1:口令1
用户名2:口令2

举例:

win00:123456
win01:654321
… …

四、批量添加用户实例;

1、首先我们创建用户文件和密码文件;

我们要创建包含新用户的文件userfile.txt ;另一个是为新添加的用户设置密码的userpwdfile.txt;

[root@localhost ~]# touch userfile.txt
[root@localhost ~]# touch userpwdfile.txt

然后用文本编辑器打开文件userfile.txt,添加如下内容;

win00:x:520:520::/home/win00:/sbin/nologin
win01:x:521:521::/home/win01:/sbin/nologin
win02:x:522:522::/home/win02:/sbin/nologin
win03:x:523:523::/home/win03:/sbin/nologin

userfile.txt 文件内容格式和 /etc/passwd 的格式是一样的,必须严格按照/etc/passwd 的格式来书写;上面所添加的用户都不能登录系统,但完全能用于ftp登录,但您得在相应ftp服务器的配置文件中打开让本地用户有读写权限;如果您想让上面的部份用户可以登录系统,可以把SHELL类似改一改,比如改成/bin/bash ;

我们再来书写新增用户的密码文件userpwdfile.txt内容;这个文件的内容中的用户名要与 userfile.txt用户名相同;也就是说我们先是添加了win00到win09的用户,现在要为这些用户更新密码;比如下面的;

win00:123456
win01:654321
win02:123321
win03:qweewq

2、通过newusers和chpasswd 完成批量添加用户;

[root@localhost ~]# newusers userfile.txt
[root@localhost ~]# chpasswd < userpwdfile.txt

Xcode各版本dmg官网下载地址(最新7.3.1)

http://adcdownload.apple.com/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.3/Xcode_7.3.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.2.1/Xcode_7.2.1.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.2/Xcode_7.2.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.1.1/Xcode_7.1.1.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.1/Xcode_7.1.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7.0.1/Xcode_7.0.1.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_7/Xcode_7.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_6.4/Xcode_6.4.dmg

http://adcdownload.apple.com/Developer_Tools/Xcode_6.3.2/Xcode_6.3.2.dmg

http://adcdownload.apple.com/Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg

http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg

http://adcdownload.apple.com/Developer_Tools/xcode_4.6.3/xcode4630916281a.dmg

 

 

android studio 中获得发布版 SHA1 和开发版 SHA1

在 Android Studio 中获得开发版 SHA1
可以选择在 Android Studio 的 Terminal 中输入以下命令以得到 SHA1:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

 

在 Android Studio 中获得发布版 SHA1
可以选择在 Android Studio 的 Terminal 中输入以下命令以得到 SHA1:
keytool -list -v -keystore keystore 签名文件路径

例如 keytool -list -v  -keystore  keystore.jks 

 

Droid@screen:在PC屏幕上显示Android手机屏幕

这里介绍一款工具——Droid@screen,用来获取手机屏幕,显示在PC屏幕上。它集截图、录像等多种功能于一体。

安装

1.    下载地址: http://droid-at-screen.org/download.html ,下载后是一个jar包,放到某个目录就可以。

2.    安装JDK6或以上版本

3.    安装Android SDK(从Android官方 下载 一个完整包解压即可)

4.    设置ANDROID_HOME环境变量指向AndroidSDK主目录(这步如果不做,则需要在droidAtScreen主界面手动设置adb的绝对路径,效果一样)。

5.    安装你的Android设备的USB 驱动,需要支持adb的驱动。

6.    开启Android设备的USB Debugging选项(Settings-> Developer options -> USB debugging)

7.    用USB线将PC和Android设备连接起来,可以在cmd中输入adb devices确保你的设备已经被识别到。出现异常的情况下可以拔出USB线再插入进行再次识别。

重启adb服务:

adb kill-server
adb start-server

8.    运行Droid@Screen

java –jar droidAtScreen-1.2.jar

为以后方便使用,可以写个批处理命令,保存为Droid@Screen.bat,把bat文件和jar包在同一目录。

bat文件内容:

java -jar ./droidAtScreen-1.2.jar     [转自酷推]

C#限制程序重复运行

  bool ret;

            System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);

            if (!ret)

            {

                MessageBox.Show(null, “程序已运行!”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Warning);

                Application.Exit();

                return;

            }

            

修改Mac默认PHP运行环境

查看一下修改前的

which php
/usr/bin/php

编辑配置文件
vi ~/.bash_profile
加入一行
export PATH="/usr/local/php5-5.6.17-20160108-105408/bin:$PATH"

执行一次命令,或重启电脑

which php
/usr/local/php5-5.6.17-20160108-105408/bin/php

C#实现Web服务器,支持GET、POST请求

通过.NET 为我们提供的HttpListener类实现对Http协议的处理,实现简单的web服务器。 注意:此类在 .NET Framework 2.0 版中是新增的。所以支持.NET Framework 2.0以上版本。该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。 引用命名空间:using System.Net; 使用Http服务一般步骤如下:

  1. 创建一个HTTP侦听器对象并初始化
  2. 开始侦听来自客户端的请求
  3. 处理客户端的Http请求
  4. 关闭HTTP侦听器

创建一个HTTP侦听器对象 创建HTTP侦听器对象只需要新建一个HttpListener对象即可。

HttpListener listener = new HttpListener();

初始化需要经过如下两步

    1. 添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
      listener.Prefixes.Add("http://127.0.0.1:8080/")    //必须以'/'结尾

      多个的话可以采用循环添加。

    2. 调用listener.Start()实现端口的绑定,并开始监听客户端的需求。

侦听来自客户端的请求 这里有2种方式可以侦听HTTP请求,获取HttpListenerContext的最简单方式如下:

HttpListenerContext context = listener.GetContext();

该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。 我使用的是异步方式实现对HttpListenerContext对象的获取。 处理客户端的HTTP请求 获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。

HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;

关闭HTTP侦听器 通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源 实现GET POST请求处理 GET请求比较简单,直接通过 request.QueryString[“linezero”]; QueryString就可以实现获取参数。 POST请求由于HttpListener 不提供实现,需要自己做处理。在下面相关代码中会贴出方法。 相关代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace WebConsole
{
  class Program
  {
    static HttpListener sSocket;
    static void Main(string[] args)
    {
      sSocket = new HttpListener();
      sSocket.Prefixes.Add("http://127.0.0.1:8080/");
      sSocket.Start();
      sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
      Console.WriteLine("已启动监听,访问http://127.0.0.1:8080/");
      Console.ReadKey();
    }
    
    static void GetContextCallBack(IAsyncResult ar)
    {
      try
      {
        sSocket = ar.AsyncState as HttpListener;
        HttpListenerContext context = sSocket.EndGetContext(ar);
        //再次监听请求
        sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
        //处理请求
        string a = Request(context.Request);
        //输出请求
        Response(context.Response, a);
      }
      catch { }
    }

    /// <summary>
    /// 处理输入参数
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    static string Request(HttpListenerRequest request)
    {
      string temp = "welcome to linezero!";
      if (request.HttpMethod.ToLower().Equals("get")) 
      {
        //GET请求处理
        if (!string.IsNullOrEmpty(request.QueryString["linezero"]))
          temp = request.QueryString["linezero"];
      }
      else if (request.HttpMethod.ToLower().Equals("post")) 
      {
        //这是在POST请求时必须传参的判断默认注释掉
        //if (!request.HasEntityBody) 
        //{
        //	temp = "请传入参数";
        //	return temp;
        //}
        //POST请求处理
        Stream SourceStream = request.InputStream;
        byte[] currentChunk = ReadLineAsBytes(SourceStream);
        //获取数据中有空白符需要去掉,输出的就是post请求的参数字符串 如:username=linezero
        temp = Encoding.Default.GetString(currentChunk).Replace("", "");
      }			
      return temp;
    }

    static byte[] ReadLineAsBytes(Stream SourceStream)
    {
      var resultStream = new MemoryStream();
      while (true)
      {
        int data = SourceStream.ReadByte();
        resultStream.WriteByte((byte)data);
        if (data <= 10)
          break;
      }
      resultStream.Position = 0;
      byte[] dataBytes = new byte[resultStream.Length];
      resultStream.Read(dataBytes, 0, dataBytes.Length);
      return dataBytes;
    }


    /// <summary>
    /// 输出方法
    /// </summary>
    /// <param name="response">response对象</param>
    /// <param name="responseString">输出值</param>
    /// <param name="contenttype">输出类型默认为json</param>
    static void Response(HttpListenerResponse response, string responsestring, string contenttype = "application/json")
    {
      response.StatusCode = 200;
      response.ContentType = contenttype;
      response.ContentEncoding = Encoding.UTF8;
      byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responsestring);
      //对客户端输出相应信息.
      response.ContentLength64 = buffer.Length;
      System.IO.Stream output = response.OutputStream;
      output.Write(buffer, 0, buffer.Length);
      //关闭输出流,释放相应资源
      output.Close();
    }
  }
}



===========
NameValueCollection postData = new NameValueCollection();
if (context.Request.HasEntityBody)
{
System.IO.Stream body = context.Request.InputStream;
// System.Text.Encoding encoding = context.Request.ContentEncoding;
System.Text.Encoding encoding = Encoding.UTF8;
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
string s = reader.ReadToEnd();
body.Close();
reader.Close();
postData = System.Web.HttpUtility.ParseQueryString(s);
//Console.WriteLine(postData.Get("name"));
}

最后启动程序,在地址栏里输入http://127.0.0.1:8080 就可以访问了。