卡德加

卡德加 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

php程序员

个人动态

卡德加 发布了文章 · 2月5日

用调度场算法计算表达式的值,javascript实现

最近想试下做微信小程序,刚开始写,想找点东西练手,试下写个计算器的小程序,查了一下,做表达式求值是用的Dijkstra的调度场算法,用两个栈就可以实现,一个输出栈,一个操作符栈,算法描述如下:

  • 依次按顺序读入,
  • 读到数字:直接输出;
  • 读到一般运算符:如果栈顶的运算符优先级不低于该运算符,则输出栈顶运算符并使之出栈,直到栈空或不满足上述条件为止;然后入栈;
  • 读到左括号:直接入栈;
  • 读到右括号:输出栈顶运算符并使之出栈,直到栈顶为左括号为止;令左括号出栈。
  • 当读入完毕时,依次输出并弹出栈顶运算符,直到栈被清空。

这里我写的比较简单,详细大家可以看以下这篇知乎上的文章:
https://zhuanlan.zhihu.com/p/...
以下是我用javascript实现的代码,加了一点自己的东西,也就是字符串转换成分解好的数组的代码,在node.js上运行通过。

function cal(strArr){
  let first={'+':1,'-':1,'*':2,'/':2,'sqrt':3,'sin':3,'cos':3}
  let opStack=[];
  let outputStack=[];
  let calStack=[];
  for(let i=0;i<strArr.length;i++){
    let s=strArr[i];
    if(!isNaN(s)){
      outputStack.push(s);
    }else{
      if(s == '(')opStack.push(s);
      else if (s == ')'){       
        while((topOp=opStack.pop()) != '('){          
          outputStack.push(topOp);         
        }        
      }else{
        if(opStack.length == 0){
          opStack.push(s)
        }else{
          let topOp=opStack[opStack.length-1];
          while(first[topOp] >= first[s]){
            outputStack.push(opStack.pop());
            if(opStack.length == 0)break;
            topOp=opStack[opStack.length-1];
          }
          opStack.push(s)
        }
      }
    }
  }
  while(opStack.length > 0)outputStack.push(opStack.pop())  
  for(let i=0;i<outputStack.length;i++){
      let s=outputStack[i];
      if(!isNaN(s))calStack.push(s);
      else {
        let r=Number(calStack.pop());       
        let v=0;
        if(s== '+')v=Number(calStack.pop())+r;
        else if(s=='-')v=Number(calStack.pop())-r;
        else if(s=='*')v=Number(calStack.pop())*r;
        else if(s== '/')v=Number(calStack.pop())/r;
        else if(s == 'sqrt')v=Math.sqrt(r)
        else if(s == 'sin')v=Math.sin(r)
        else if(s == 'cos')v=Math.cos(r)
        calStack.push(v);
      }
  }
  return calStack.pop();
}

//计算字符串按数字和操作符分解转换成数组
function str2arr(str){
 let resultArr=[];
 const symbolSet=['+','-','*','/','(',')','sqrt','sin','cos','log']
 let currentStr=''
 for (let s of str){
    if(symbolSet.indexOf(s) > -1){
      if(currentStr != '')resultArr.push(currentStr);
      resultArr.push(s)
      currentStr='';
    }else{     
      if(s == '.'){      
          currentStr=currentStr+s
      }else{
        let currentStrType= isNaN(currentStr)
        let sType=isNaN(s)       
        if(sType == currentStrType){
          currentStr=currentStr+s
        }else{
          if(currentStr != '')resultArr.push(currentStr)
          currentStr=s
        }
      }     
    }
 }
 if(currentStr != '')resultArr.push(currentStr)
 //检查括号,左括号进栈,右括号出栈,最后栈必须为空
  //检查数字
 let bracketsStack=[]
 for(let i=0;i<resultArr.length;i++){
   if(symbolSet.indexOf(resultArr[i]) > -1){
    if(resultArr[i] == '(')bracketsStack.push(resultArr[i])
    else if(resultArr[i] == ')'){
      if(bracketsStack.length == 0)return {result:false,msg:'括号错误',data:resultArr}; 
      bracketsStack.pop()
    }
   }else if (isNaN(resultArr[i])) return {result:false,msg:'字符串错误',data:resultArr};  
}
 
 if(bracketsStack.length > 0) return {result:false,msg:'括号错误',data:resultArr}; 
 return {result:true,msg:'转换成功',data:resultArr}; 
}


 let str="1-sin(2)*3.14/5"
 let {result,msg,data}=str2arr(str)
if(result == true){
  console.log(data)
  let calResult=cal(data)
  console.log(calResult)
}else console.log(msg)
console.log(1-Math.sin(2)*3.14/5)

以上代码我亲测可用,有写的不好的地方,欢迎大家点评。

查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 2月3日

linux 中用 scp 命令传文件的用法

想必小伙伴们经常有要在两台linux服务器间互传文件的需求,哪么在linux 下互传文件,用的就是scp命令,下面我就来介绍下scp的一些日常用法。
简单写法

scp [可选参数] file_source file_target 

只要记住前一个文件是源文件 后一个文件是目标文件就行了,参数嘛,就记住 -r 是递归复制整个目录,我觉得这个算是常用的一个参数吧,其他参数大家可以在网上查。
本地文件传远程的写法

scp 本地路径 远程用户名@远程IP地址:远程文件夹路径 

实例

scp /home/test/test.txt  root@192.168.1.200:/home/test/test.txt 

如果是从远程复制到本地,就调换源文件和目标文件位置就行了

scp root@192.168.1.200:/home/test/test.txt /home/test/test.txt   
查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 2月3日

linux 中 screen 命令及应用场景

公司服务器用的centos这个版本,一般的命令我们敲完,马上就有反馈,但是有时候也会碰到一些特殊的场景,比如网站数据比较多,图片都有几十个G,客户要迁移网站,要把图片打包,然后要用scp把图片打包文件上传到另一台服务器,按现有这种几十K的网速,太慢了,小伙伴们如果不想加班守在电脑跟前,可以使用screen命令,为什么要用这个呢,一般我们用xshell或者其他工具软件连上远程的服务器,当你关掉这个远程xshell窗口时,这个正在执行的命令就退出执行了,如果你想关掉窗口命令还继续执行的话就可以使用screen这个命令。
screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面。

语法

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]

安装

 yum install screen

比如我现在要执行一个需要很长时间才能完成的命令,比如用scp把一个几十个G的图片包传到另一台服务器,大概要十几个小时才能完成。可以这样做:

screen -S 作业名

然后你就会发现屏幕刷新了,可以用screen -ls来查看一下当前作业都有哪些

[root@localhost ~]# screen -ls
There is a screen on:
        30398.mywork    (Attached)
1 Socket in /var/run/screen/S-root.

然后我们scp复制一下大文件到远程

scp /home/myfile/本地大文件.tar root@192.168.1.100:/data/

复制非常慢,现在可以把xshell关掉,注意不要中断命令的执行,第二天上班,你可以看一下昨天的命令完成了没有

screen -R mywork

我个人更喜欢用htop,查看昨天命令执行进程,如果执行完成,screen就可以退出了。

查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 1月27日

word文档转html格式在线预览,使用了phpoffice,pydocx,java POI各方案,最终用unoconv解决

最近客户要做一个word,excel 文件在线预览功能,以下是实现此功能的全过程。
由于我们用的是PHP开发项目,最开始想到的是用PHPoffice里的phpword来进行转换,以下是关键代码。

<?php
$phpWord = \PhpOffice\PhpWord\IOFactory::load('test.doc');
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
$xmlWriter->save('test.html); 

用这种方法转是可以转,但是转出来的html文件相对原文件,丢失了很多字,如果说样式和原文不一样还可以忍受,但是内容丢失,就不太好了,而且对DOC格式又无法处理,所以这种方法,我最终选择了放弃。
然后,我就想用python来解决这个问题,查到了python有个pydocx库可以处理word文档,于是我就安装了一下。

pip install pydocx

这个库用起来也很简单,主要代码如下:

from pydocx import PyDocX
html = PyDocX.to_html("test2.doc")
f = open("test.html", 'w', encoding="utf-8")
f.write(html)
f.close()

转换效果也还可以,除了表格样式和原文有点不一样以外,内容倒是没丢失,但是有一个问题,这个库是转换docx的,对doc转换不了,我们客户还上传挺多doc格式的文件的,于是我只好另外想办法。
查资料发现java有个poi库可以用来对word文件进行转换, Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。我想试一下,查资料半天,就开始写了,先Maven引入依赖:

    <dependencies>
        <dependency>
                   <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                    <version>4.1.2</version>
                </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- 针对2003版本的库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version></dependency>
    </dependencies>

以下是引用别人的可用代码:

import cn.hutool.core.img.ImgUtil;
import fr.opensagres.poi.xwpf.converter.xhtml.Base64EmbedImgManager;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLConverter;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.awt.image.BufferedImage;
import java.io.*;
/**
 * office转换工具测试
 *
 */
public class OfficeConvertUtil {

    /**
     * 将word2003转换为html文件 2017-2-27
     *
     * @param wordPath word文件路径
     * @param wordName word文件名称无后缀
     * @param suffix   word文件后缀
     * @throws IOException
     * @throws TransformerException
     * @throws ParserConfigurationException
     */
    public static String Word2003ToHtml(String wordPath, String wordName,
                                        String suffix) throws IOException, TransformerException,
            ParserConfigurationException {
        String htmlPath = wordPath + File.separator + "html"
                + File.separator;
        String htmlName = wordName + ".html";
        final String imagePath = htmlPath + "image" + File.separator;

        // 判断html文件是否存在,每次重新生成
        File htmlFile = new File(htmlPath + htmlName);
//      if (htmlFile.exists()) {
//          return htmlFile.getAbsolutePath();
//      }

        // 原word文档
        final String file = wordPath + File.separator + wordName + suffix;
        InputStream input = new FileInputStream(new File(file));
        HWPFDocument wordDocument = new HWPFDocument(input);
        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
                DocumentBuilderFactory.newInstance().newDocumentBuilder()
                        .newDocument());

        wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> {
            BufferedImage bufferedImage = ImgUtil.toImage(content);
            String base64Img = ImgUtil.toBase64(bufferedImage, pictureType.getExtension());
            //  带图片的word,则将图片转为base64编码,保存在一个页面中
            StringBuilder sb = (new StringBuilder(base64Img.length() + "data:;base64,".length()).append("data:;base64,").append(base64Img));
            return sb.toString();
        });

        // 解析word文档
        wordToHtmlConverter.processDocument(wordDocument);
        Document htmlDocument = wordToHtmlConverter.getDocument();
        // 生成html文件上级文件夹
        File folder = new File(htmlPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }

        // 生成html文件地址
        OutputStream outStream = new FileOutputStream(htmlFile);

        DOMSource domSource = new DOMSource(htmlDocument);
        StreamResult streamResult = new StreamResult(outStream);

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer serializer = factory.newTransformer();
        serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
        serializer.setOutputProperty(OutputKeys.INDENT, "yes");
        serializer.setOutputProperty(OutputKeys.METHOD, "html");

        serializer.transform(domSource, streamResult);

        outStream.close();

        return htmlFile.getAbsolutePath();
    }

    /**
     * 2007版本word转换成html 2017-2-27
     *
     * @param wordPath word文件路径
     * @param wordName word文件名称无后缀
     * @param suffix   word文件后缀
     * @return
     * @throws IOException
     */
    public static String Word2007ToHtml(String wordPath, String wordName, String suffix)
            throws IOException {
        ZipSecureFile.setMinInflateRatio(-1.0d);
        String htmlPath = wordPath + File.separator + "html"
                + File.separator;
        String htmlName = wordName + ".html";
        String imagePath = htmlPath + "image" + File.separator;

        // 判断html文件是否存在
        File htmlFile = new File(htmlPath + htmlName);
//      if (htmlFile.exists()) {
//          return htmlFile.getAbsolutePath();
//      }

        // word文件
        File wordFile = new File(wordPath + File.separator + wordName + suffix);

        // 1) 加载word文档生成 XWPFDocument对象
        InputStream in = new FileInputStream(wordFile);
        XWPFDocument document = new XWPFDocument(in);

        // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录)
        File imgFolder = new File(imagePath);
        //  带图片的word,则将图片转为base64编码,保存在一个页面中
        XHTMLOptions options = XHTMLOptions.create().indent(4).setImageManager(new Base64EmbedImgManager());
        // 3) 将 XWPFDocument转换成XHTML
        // 生成html文件上级文件夹
        File folder = new File(htmlPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        OutputStream out = new FileOutputStream(htmlFile);
        XHTMLConverter.getInstance().convert(document, out, options);

        return htmlFile.getAbsolutePath();
    }
    public static void main(String[] args) throws Exception {
        System.out.println(Word2003ToHtml("D:\\tmp", "test", ".doc"));
        System.out.println(Word2007ToHtml("D:\\tmp", "test2", ".docx"));
    }
}

用java 倒是转换doc格式转的挺好的,但是转换docx格式的时候,样式全乱了,我查了半天POI的文档,网上也没有哪位大佬来解决这个样式乱的问题,于是我想用python来转docx ,java来转doc,但是又觉得太麻烦。
在查了半天资料以后,我最终的解决办法如下。
还是回到了用php处理,但是不是用phpoffice来处理,而是用unocov进行转换,先装libreoffice

yum install libreoffice

然后装unocov

yum install unoconv

用以下命令就可以转换了

unoconv -f html -o test.html test.doc

-f是输出格式,-o是输出文件 最后面是输入文件,具体用法可以查相关文档,我在php里执行外部命令,生成转换好的文件以后再重定向到生成的文件上面去,由于excel 转html报错,所以我针对excel 转成了pdf.

        if (file_exists($source)) {
            $dir = dirname($source);
            $ext=pathinfo($source)['extension'];
            if(!in_array($ext,['xls','xlsx'])){
                $filetype='html';
            }else $filetype='pdf';
            $filename = strstr(basename($source), '.', true) . '.'.$filetype;
            $file =  $filename;            
            if(!file_exists('data/' . $file)){
                //echo "sudo /usr/bin/unoconv -f {$filetype} -o " . '/data/web/public/data/' . $file . ' ' . '/data/web/data_manage/public/' . $source;exit;
                $res= shell_exec("sudo /usr/bin/unoconv -f {$filetype} -o " . '/data/web/public/data/' . $file . ' ' . '/data/web/data_manage/public/' . $source);
                if(!file_exists('data/' . $file)){
                    dump($res);
                    exit('生成预览文件出错');
                }
            }
            header("Location:".'/data/' . $file);
            exit();
        } else exit('文件不存在');

最后,总算是把doc,docx 还有excel文件,wps文件都能预览出来,样式还是有点变化,内容没有丢失,客户也还算是能接受,以上是我解决这个问题的心得,希望能帮到大家。

查看原文

赞 1 收藏 1 评论 0

卡德加 发布了文章 · 1月25日

thinkphp 5 报错 显示 nginx 404页面

今天把项目布署到线上,报错了,却一直显示nginx的404页面,如果一直这样是没法解决问题的,我上线看了一下thinkphp的日志文件:

[ sql ] [ SQL ] SELECT `data_id`,`pid` FROM `tb_data_manage` WHERE  `pid` IN (53,49,47,46,35) [ RunTime:0.000595s ]
[ error ] [8]未定义数组索引: see[/data/web/data_manage/runtime/temp/5e9fc553d7acc7eaa186b674b2a29538.php:143]

很明显,是php出错,而不是nginx找不到页面,而且nginx的pathinfo设置也没有问题,config.php里面app_debug我也是设的是true,于是我在网上各种找解决办法,最终的解决办法是打开thinkphp/tpl下面的文件think_exception.tpl最后面,在最下面的php标签里加个退出

        })();
    </script>
    <?php } exit; ?>
</body>
</html>

然后问题就解决了,再访问一下浏览器,不会再显示404,thinkphp的错误页面出来了

查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 1月14日

centos 上安装ftp,及 530 Login incorrect,500 OOPS: chroot错误处理

vsftp的安装

我用的是centos ,所以直接yum安装,安装需要一段时间。

[root@localhost ~]#yum check-update

如果你不想更新系统,也可以直接用以下命令安装vsftp。

[root@localhost ~]#yum -y install vsftpd

然后修改一下vsftpd的配置文件

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

不允许匿名访问

anonymous_enable=No

允许使用本地帐户进行FTP用户登录验证

local_enable=YES

使用户不能离开主目录

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES

创建chroot_list文件

/etc/vsftpd/chroot_list

直接保存就行,然后重启一下vsftpd

systemctl restart vsftpd

可以用netstat -ntlp 查看一下端口,如果有21号端口占用,就是启动成功了。
然后创建ftp创号

[root@localhost home]# useradd -d /home/testftp -g ftp -s /sbin/nologin testftp

设置一下ftp帐号密码

[root@localhost home]# passwd testftp

用Filezilla连接一下ftp服务器,发现会报 530 Login incorrect 的错误。可以修改一下pam.d下的vsftpd配置

[root@localhost vsftpd]# vim /etc/pam.d/vsftpd

把auth required pam_shells.so 改为 auth required pam_nologin.so ,就可以解决这个问题。
再用Filezilla连一下,又报500 OOPS: chroot这个错误,这个是由于selinux引起的,关掉就行了,我用的
setenforce 0 这个命令,不用重启就可以了,当然你也可以改seliux配置文件来关掉。
然后我们再用Fillzilla连接一下服务器,发现可连上服务器了。

查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 1月14日

PHP多维数组排序,用array_multisort函数对数组按指定字段排序

PHP中有一些函数可以用来对数组进行排序。

  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列

例如:

        $arr=['green','car','apple','book'];
        sort($arr);
        var_dump($arr);

可以得到排序结果:

array (size=4)
  0 => string 'apple' (length=5)
  1 => string 'book' (length=4)
  2 => string 'car' (length=3)
  3 => string 'green' (length=5)

但是对一个有多个字段的数组,要怎么按照指定的字段排序呢?比如下面这个数组:

        $arr=[
            [
                'age'=>50,
                'name'=>'张三'
            ],
            [
                'age'=>18,
                'name'=>'李四'
            ],
            [
                'age'=>27,
                'name'=>'王五'
            ]
        ];

我们怎么按照age或name排序呢?我们可以使用array_multisort这个函数来进行按指定字段排序。

 array_multisort(array_column($arr,'age'),SORT_ASC,$arr);
var_dump($arr);

打印结果

array (size=3)
  0 => 
    array (size=2)
      'age' => int 18
      'name' => string '李四' (length=6)
  1 => 
    array (size=2)
      'age' => int 27
      'name' => string '王五' (length=6)
  2 => 
    array (size=2)
      'age' => int 50
      'name' => string '张三' (length=6)

这样就排好了,也就是说用array_multisort这个函数排序时,用array_column排数组指定的列提取出来放第一个参数,排序常量放第二个参数,数组放到第三个参数,就可以按指定的字段进行排序了。SORT_ASC 是升序,SORT_DESC 是降序。以上就是按字段进行排序的方法,谢谢各位。

查看原文

赞 0 收藏 0 评论 0

卡德加 发布了文章 · 1月12日

PHP中数组的入门

php中的数组是一种非常实用的数据结构,它不同于C语言,C++,Java中的数组,其他语言中数组只是一种顺序存储的数据结构,php的数组不仅可做顺序存储,还可以把它当成哈希表使用,还可以当成对象使用,当成树使用,总之php的数组功能要远多于其他几种语言。

顺序数组的使用

<?php
$arr=array(1,2,3,4,5,6);

以上为顺序数组初始化,和其他语言相类似,由于php是弱类型语言,所以数组的成员可以是不同数据类型,比如整数,字符串,对象等。

$arr=array(1,1,2.3,'abc',array(1,2,3));

数组使用时可以直接使用下标来访问数组元素。

echo $arr[1];

这个和其他语言用法是一样的。

数组的遍历

PHP的数组没有象其他语的length,size()这样的东西,所以求数组长度一般是用count()函数。

for($i=0;$i<count($arr);$i++){
    echo $arr[i]
}

这样可以遍历打印出数组中的全部元素,但是还有另一种赢历,就是使用foreach对数组进行遍历。

foreach($arr as $k => $v){
      echo $k."-->".$v."\n";
}

这种语法,$k是数组索引,$v是数组元素。人个人推荐使用foreach,方便快速。
如果只是看以上这些操作,觉得PHP数好象没什么,但是php数组索引除了可以用数字以外,还可以用其他数据类型。

$arr['first']=1;
$arr[3.14]=3;
$arr[array(1,2,3)]=1;

是不是觉得PHP数组很奇特,当然我个人用的最多的还是字符串做索引,用字符串做数组索引,你可以把数组当成哈希表来用。或者当成一个对象来使用。

$data=array(
    '字段1'=>'字段1的值',
    '字段2'=>'字段2的值',
    '字段3'=>'字段3的值',
);
Db::table('表名')->insert($data);

由于这一特性,php数组可以直接作为插入数据库的变量,也可以作为接收数据库返回值的变量。
今天就为大家介绍PHP数组的简单使用到这里,谢谢各位。

查看原文

赞 0 收藏 0 评论 0

卡德加 关注了专栏 · 1月12日

CodeGuide | 程序员编码指南

公众号:bugstack虫洞栈,回复:设计模式,可以下载《重学Java设计模式》PDF,全网下载量17万+ | 这是一本互联网真实案例实践书籍。以落地解决方案为核心,从实际业务中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,来学习设计模式的运用。

关注 16323

卡德加 关注了专栏 · 1月12日

SegmentFault 社区运营

SegmentFault 思否社区管理官方专栏,在这里发布 SegmentFault 思否社区运营和管理相关的最新消息。

关注 18478

认证与成就

  • 获得 1 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 1月12日
个人主页被 551 人浏览