月度归档: 2016 年 5 月

  • C#文件重命名

    C#文件重命名

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

  • C# 每两位插入一个空格

    C# 每两位插入一个空格

    string txt = "12345678" ;
    string result = Regex .Replace(txt, @"(\d{2}(?!$))", "$1 " );

    每N位插入一个就把2改成N


    上面只分操作全是数字的,如果是适应所有的,可以把\d换成.

    string txt = "ABCD1E2F4G" ;
    string result = Regex .Replace(txt, @"(.{2}(?!$))", "$1 " );

  • PHP验证码类

    PHP验证码类

    <?php
    /**
     * 验证码
     */
    class Code{
    
      // 1. 定义各个成员 有宽、高、画布、字数、类型、画类型
    
      private $width; //宽度
      private $height; //高度
      private $num; //验证码字数
      private $imgType; //生成图片类型
      private $Type; //字串类型 1,2,3 三个选项 1 纯数字 2 纯小写字母 3 大小写数字混合
      private $hb; //画布
      public $codestr; // 验证码字串
    
      public function __construct($height=20,$num=4,$imgType="jpeg",$Type=1){
        $this->width = $num*20;
        $this->height = $height;
        $this->num = $num;
        $this->imgType = $imgType;
        $this->Type = $Type;
        $this->codestr = $this->codestr();
        $this->zuhe();
      }
    
      // 2. 定义随机获取字符串函数
      private function codestr(){
        switch($this->Type){
    
          case 1:   // 类型为1 获取1-9随机数
            $str = implode("",array_rand(range(0,9),$this->num));
            break;
          case 2:   // 类型为2 获取a-z随机小写字母
            $str = implode("",array_rand(array_flip(range(a,z)),$this->num));
            break;
          case 3:   // 类型为3 获取数字,小写字母,大写字母 混合
            for($i=0;$i<$this->num;$i++){
              $m = rand(0,2);
              switch($m){
                case 0:
                  $o = rand(48,57);
                  break;
                case 1:
                  $o = rand(65,90);
                  break;
                case 2:
                  $o = rand(97,122);
                  break;
              }
              $str .= sprintf("%c",$o);
            }
            break;
        }
    
    
        return $str;
      }
    
    
      // 3. 初始化画布图像资源
      private function Hb(){
        $this->hb = imagecreatetruecolor($this->width,$this->height);
      }
    
      // 4. 生成背景颜色
      private function Bg(){
        return imagecolorallocate($this->hb,rand(130,250),rand(130,250),rand(130,250));
      }
    
      // 5. 生成字体颜色
      private function Font(){
        return imagecolorallocate($this->hb,rand(0,100),rand(0,100),rand(0,100));
      }
    
      // 6. 填充背景颜色
      private function BgColor(){
        imagefilledrectangle($this->hb,0,0,$this->width,$this->height,$this->Bg());
      }
    
      // 7. 干扰点
      private function ganrao(){
        $sum=floor(($this->width)*($this->height)/3);
        for($i=0;$i<$sum;$i++){
          imagesetpixel($this->hb,rand(0,$this->width),rand(0,$this->height),$this->Bg());
        }
      }
    
      // 8. 随机直线 弧线
      private function huxian(){
        for($i=0;$i<$this->num;$i++){
          imageArc($this->hb,rand(0,$this->width),rand(0,$this->height),rand(0,$this->width),rand(0,$this->height),rand(0,360),rand(0,360),$this->Bg());
        }
      }
    
      // 9. 写字
      private function xiezi(){
        for($i=0;$i<$this->num;$i++){
          $x=ceil($this->width/$this->num)*$i;
          $y=rand(1,$this->height-15);
          imagechar($this->hb,5,$x+4,$y,$this->codestr[$i],$this->Font());
        }
      }
    
      // 10. 输出
      private function OutImg(){
        $shuchu="image".$this->imgType;
        $header="Content-type:image/".$this->imgType;
        if(function_exists($shuchu)){
          header($header);
          $shuchu($this->hb);
        }else{
          exit("GD库没有此类图像");
        }
      }
    
      // 11. 拼装
      private function zuhe(){
        $this->Hb();
        $this->BgColor();
        $this->ganrao();
        $this->huxian();
        $this->xiezi();
        $this->OutImg();
      }
    
      public function getCodeStr(){
        return $this->codestr;
      }
    }
    ?>
    
  • Laravel不同设备使用不同的视图

    使用composer添加第三方库jenssegers/agent

    // language: bash
    composer require jenssegers/agent

    然后在app/config/app.php 里的服务提供者数组里添加该库, 并添加别名

    // language: php
    'providers' => [
         Jenssegers\Agent\AgentServiceProvider::class,
    ]
    
    'aliases' => [
         'Agent'    => Jenssegers\Agent\Facades\Agent::class,    
    ]

    使用artisan创建一个服务提供者类
    php artisan make:provider ResponseMacroServiceProvider

    同样要在app.php里面配置

    // language: php
    'providers' => [
         App\Providers\ResponseMacroServiceProvider::class,    
    ]
    // 别名用不到,不用配置了

    修改app/Providers/ResponseMacroServiceProvider.phpboot方法

    // language: php
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('ress', function ($viewname) use ($factory) {
            if ( Agent::isMobile() ) {
                return view()->make($viewname . "_mobile");
            } else {
                return view()->make($viewname . "_web");
            }
        });
    }

    在Controller中可以这样使用

    // language: php
    class HomeController extends Controller
    {
        public function index()
        {
            return response()->ress('home.index');
            //return view('home.index');
        }
    
        public function article()
        {
            return response()->ress('home.article');
        }
    }

    最后就是把视图名改为 _web.blade.php 和 _mobile.blade.php

  • ubuntu 14.04运行asp.net core程序所需要的一些运行库支持

    ubuntu 14.04运行asp.net core程序所需要的一些运行库支持

    apt-get install -y  libunwind8  libunwind8-dev  gettext  libicu-dev  liblttng-ust-dev  libcurl4-openssl-dev  libssl-dev  uuid-dev
  • .htaccess 隐藏index.php

    .htaccess 隐藏index.php

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
    </IfModule>

  • 放下对技术的执着

    选择技术的标准

    选择能既好又快完成需求的,不浪费时间的、不折腾的,最主要的是自己熟悉的技术;而不是选择最新最潮的技术。许多新技术就像潮流一样,一年一个新花样,无穷无尽层出不穷。人的精力是有限的,我们不能把有限的精力放到追求无限的技术潮流上。

    放下对技术的执着

    技术是工具,是用来解决问题的,解决问题需要好用的工具和趁手的工具。不要沉迷于那些“洋”工具上,不要做小白鼠。如果一直沉迷其中,那么很可能的结果就是一直在坑里打转,爬不出来,最终会一事无成,到头来什么都没得到。

    应该怎么做?

    放下执着,不要浮躁,潜心学习基础知识,比如数据结构和算法;或学习市面上使用率最高的编程语言,如 C、C++、Java、C#、PHP、Python等。但要一定要使用它们的稳定版本,因为我们是用这些知识和工具来解决问题的,当然要用稳定成熟的。

    感想

    由于我是一个自由开发者,有大量的时间,曾经长期把时间浪费在了搞新技术上,投入的时间成本很大,但收益很低,因为市场上可能还不接受最新的技术,学来没什么用,只能用来装装逼。但装逼能当饭吃吗?能当钱花吗?

    编程对我来说只是工作和爱好,但远远不是生活的全部。闲暇时间应该陪陪家人,或出去散散步,或锻炼身体,或看看书,或出去旅旅游,世界这么大,应该出去看看。

  • ASP.NET WebForm 下载文件,兼容各个浏览器,下载文件名无乱码

    ASP.NET WebForm 下载文件,兼容各个浏览器,下载文件名无乱码

    protected void btnDownload_Click(object sender, EventArgs e)
    {
        string webPath = Request.QueryString["filename"];
        string filePath = Server.MapPath(webPath);//路径
        FileInfo fileInfo = new FileInfo(filePath);
        string fileName = fileInfo.Name; //客户端保存的文件名
    
        if (fileInfo.Exists == true)
        {
            const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
            byte[] buffer = new byte[ChunkSize];
    
            Response.Clear();
            System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
            long dataLengthToRead = iStream.Length;//获取下载的文件总大小
            Response.ContentType = "application/octet-stream";
    
            if (Request.UserAgent.ToLower().IndexOf("msie") > -1 )
            {   
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
            }
            else if (Request.UserAgent.ToLower().IndexOf("firefox") > -1)
            {
                //为了向客户端输出空格,需要在当客户端使用 Firefox 时特殊处理     
                Response.AddHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
            }
            else if (Request.UserAgent.ToLower().IndexOf("edge") > -1) // edeg浏览器
            {
                Response.AddHeader("Content-Disposition", "attachment;filename=" + ToHexString(fileName));
            }
            else
            {
                Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            }
    
            while (dataLengthToRead > 0 && Response.IsClientConnected)
            {
                int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
                Response.OutputStream.Write(buffer, 0, lengthRead);
                Response.Flush();
                dataLengthToRead = dataLengthToRead - lengthRead;
            }
            Response.Close();
        }
    
    }
    
    /// <summary> 
    /// 为字符串中的非英文字符编码 
    /// </summary> 
    /// <param name="s"></param> 
    /// <returns></returns> 
    public string ToHexString(string s)
    {
        char[] chars = s.ToCharArray();
        StringBuilder builder = new StringBuilder();
        for (int index = 0; index < chars.Length; index++)
        {
            bool needToEncode = NeedToEncode(chars[index]);
            if (needToEncode)
            {
                string encodedString = ToHexString(chars[index]);
                builder.Append(encodedString);
            }
            else
            {
                builder.Append(chars[index]);
            }
        }
        return builder.ToString();
    }
    /// <summary> 
    ///指定 一个字符是否应该被编码 
    /// </summary> 
    /// <param name="chr"></param> 
    /// <returns></returns> 
    private bool NeedToEncode(char chr)
    {
        string reservedChars = "$-_.+!*'(),@=&";
        if (chr > 127)
            return true;
        if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
            return false;
        return true;
    }
    /// <summary> 
    /// 为非英文字符串编码 
    /// </summary> 
    /// <param name="chr"></param> 
    /// <returns></returns> 
    private string ToHexString(char chr)
    {
        UTF8Encoding utf8 = new UTF8Encoding();
        byte[] encodedBytes = utf8.GetBytes(chr.ToString());
        StringBuilder builder = new StringBuilder();
        for (int index = 0; index < encodedBytes.Length; index++)
        {
            builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
        }
        return builder.ToString();
    }
  • apache禁止使用服务器IP直接访问

    apache禁止使用服务器IP直接访问

    #禁止使用IP直接访问服务器
    <VirtualHost *:80>
        ServerName 47.89.43.68  #服务器IP
        DocumentRoot "/www/htdocs/guest"
        <Directory />
            Order deny,allow
            Deny from all
        </Directory>
    </VirtualHost>