SCIP读书笔记(二)

by admin on 2018年12月19日

上一篇惨遭介绍了扳平派系程序设计语言必须有的有的特征,以及Scheme语言的中坚语法。这同样篇用上一篇涉嫌的平方根的问题来看看一个问题是什么吃逐步分解并解决之。我们先是看下平方根的数学概念:

对于群的事数码智能开发之同僚来说,从仓库中领取出数后举行数量整理而导出csv文件的法力是万分普遍的,导出一个csv文件方便用其他的数目工具举行剖析。所以于这边享用一下自我在办事过程遭到落实导出csv文件功用的历程和所取。

平方根的数学概念

前言

第一,我受报告要以laravel框架中贯彻下载接口这些职责时,整个人口是懵逼的,完全无了然怎么在亲手去贯彻这职能,然则于一个理工科生来说,遭遇问题并无吓人,剥丝抽茧,一步一步来。我分析,既然要促成产充斥效能接口,首先需要做的虽然是供一个接口,而什么做一个接口我在<<Laravel使用体验–简易路由操作>>中一度介绍,向前端提供一个URI即达到了接口的意思,其次是咋样实现下载,最后是哪勾勒副一个csv文件,本篇随笔就打晚少只趋势介绍,并且最终附带PHP闽南语件包成效的落实介绍

本想打包功能独立写一篇博客的,后来察觉这些力量实现相比较简单,而非凡层次之本人为临时不晤面,就顺便本篇小说最终了

地方的数学公式描述了一个频的平方根所具有的习性,但并不曾告知我们相应咋样去告一个勤的平方根。那是数学公式和电脑程序的不同之处。对于和一个问题,数学公式关心的是欠问题的解所具备的习性
(what is);而电脑程序则关注应该咋样去得问题之解 (how
to
)。那么到底求一个往往底平方根呢?大家这里以牛顿(牛顿(Newton))提议的无穷逼近法,那一个算法思路很简短,先要大家渴求数y的平方根x

下载

  1. 啊x设定一个开始值
  2. 检查x^2是否等于y,倘若,则重回x, 否则拿x赋值为(x+(x/y))/2
  3. 再执行第2步直到拿到解。

一律、通过传递HTTP报头实现下载

率先以度娘上找到的贯彻下载的艺术有:是透过奔浏览器传递HTTP报头,告诉浏览器是URI的有关动作为浏览器去实现。
HTTP报头是HTTP协议的一个有些,一般达到用来客户端与服务端之间握手时的通信,通俗的知道就是是
http服务器和客户端(一般为浏览器)之间数据传以前的对话,告诉浏览器你想干什么。
倘当PHP中贯彻HTTP报头参数传递功效的是header()方法,header()函数为客户端发送原始的 HTTP
报头。其中认识及一些很重大,即必须以旁实际的出口为发送往日调用
header()函数,例如在调用header()函数前不要写print_r()或var_dump()等函数。
传送报头参数的代码:

header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=" . $start_date . '~' . $end_date . '_fare.csv');
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');

个中第一行是语浏览器我索要导出文件,格式是csv,在Content-type其一参数类型中好指定许多之导出文本的格式,例如rar、zip这样的压缩包格式
传送这样的报头后,导出的文本的情以凡若当调用该header()函数的主意外的return值,例如return 123;则csv文件中即使是123。
那种模式可以兑现下载,不过究竟看上去不绝为难,如此完美的laravel框架怎么可能会合无干到下载形式的包呢,于是后来以了另外一样栽办法。

简书的markdown对数学公式协理的不好,请见谅。有矣端的叙说,我们就得很快写起代码了,下边我就是试试用Scheme语言来落实。这里仍旧如拉点题外话,我看SCIP这遵照开并无是以求学Scheme语言,而是上书中剖析问题以及将抽象问题的点子,学习了这么些下,你会见冷不丁发现本多数语言或工具的片段特色在当下遵照开中还开口到了,比如python语言、guava库、Java8主打的lambda表明式,stream等。编程语言的提升产生点儿条全不同之行程,一久凡以适应总计机底层硬件仍然说电脑类别布局向上起来的,最富有代表性的虽是C语言;另一样长条路就算是关心总括的精神(相比较空虚,那里就是个人观点),首要的象征就是Lisp语言,而我辈这边的称到的Scheme就是Lisp语言的同等栽变体。但随着技术之上进,那片种植不同类型的言语有点融合之来头。
在形容代码前,我们首先分析下之问题,在达到同样篇被我们说过,要化解一个题目时,我们该以题目展开解释,得到六个子问题,当子问题解决后,我们将子问题的解组合就落了原问题之消。通过算法的描述我们可以老的题材说成一些子题目:判断数x是匪是题材的排;使用算法描述负之艺术将x加以立异,每便对x的改进都可以更为类似问题之散,这尽管是无穷逼近。大家就此Scheme语言翻译下就是是这般:

其次、通过response方法实现下载

于拘留了其他前辈写的代码中,我发现有一行代码

return reponse()->download($file)

扣押单词意思也精晓这行代码是打呀成效的。Response是laravel框架中之假相(facade),在斯框架中是可直接引用调用的听从
例如:

//响应重定向
Route::get('example/test24', function(){
    return Redirect::to('example/test21')->with('username', 'xiaoming');
});
//定制HTTP响应
Route::get('example/test21', function(){
    return Response::make('内容不存在', 404);
});
//响应视图
Route::get('example/test22', function(){
    return Response::view('test22');
});

上述之事例是response在封闭函数中的直白调用,在另外的地点本来也是可以直接动用的,而下载文件就足以运用Response::download()方法
俺们事先押一下这个的源代码:

    /**
     * Create a new file download response.
     *
     * @param  \\SplFileInfo|string  $file
     * @param  string  $name
     * @param  array  $headers
     * @param  string|null  $disposition
     * @return \\Symfony\\Component\\HttpFoundation\\BinaryFileResponse
     */
    public function download($file, $name = null, array $headers = [], $disposition = 'attachment');

可以看出是下载模式的参数,有$file, $name = null, array $headers = [], $disposition = 'attachment',前面还起默认值,可以免传递,也可用来参数增加,利用这么些措施就是可以兑现下载
例如:

public function getDownload()
{
    //PDF file is stored under project/public/download/info.pdf
    $file= public_path(). "/download/info.pdf";
    $headers = array(
              'Content-Type: application/pdf',
            );
    return Response::download($file, 'filename.pdf', $headers);
}

由此处的header()可以观望是要求下载一个pdf文件,而在laravel
5框架中行使这功效还可以够行使

return response()->download($file, 'filename.pdf', $headers);

这种艺术,效率是同样的,其中也得独自指定第一独参数,那样下载的文本就是公的公文前指定好之品种。

(define (sqrt-iter x y)
    (if (good-enough? x y)
         x
         (sqrt-iter (imporve x y) y)))

写副csv文件模式

介绍了哪兑现下载的有限种方法,现在吧一下安用数据形容副csv文件

此引入了函数sqrt-iter,它接受两单参数x和y,x表示对y的平方根的揣摸,通过递归调用(在Scheme语言里相当重中之重)拿到消除。在sqrt-iter里又引入了点滴单函数:good-enough?和imporve,对承诺着咱解析的两个子问题。而good-enough?应该怎么着定义之为?它接受五个参数x和y,判断x^2是否等于y。这么些问题是一个相比较经典的面试题:判断两独浮点数是否当。

字符串连接格局

首先要通晓,csv文件的情节实在就是同等差拼接起来的字符串,初始指定好表头字符串,后边就以该表头的依次依次拼接数据即可,只是于表头和各样一行数的结尾都抬高一个换行符\\n来达到表格对一起之职能即可。
例如:

$head_str = "日期,姓名,年龄,学校\\n";
$cnt  = count($data);
for ($i =0;$i<$cnt;$i++) {
        $tmp = implode(",",$data[$i]);
        $head_str .= $tmp."\\n";
}

其中$data凡起仓库中取有之数的二维数组,而各一个第一交汇索引指向的哪怕是对应之各一行数,然后用for巡回遍历取出每一行数举行拼接。
立马同样种办法是与传递HTTP报头实现下载的点子配合使用效果又好,因为在拼接完成后平昔当形式外return $head_str,就可知将通数据内容念入到了下载的csv文件中。当然,也堪下fwrite()法勾勒副一个新文件$file,然后以response->download($file)计下充斥该公文即可。

(define (good-enough? x y)
    (< (abs (- (square x) y)) 0.001))
(define (square x) (* x x))
(define (abs x) 
    (if (> x 0) x (- x)))

export()方法

后来发现,每趟这样拼接数据分外的麻烦,可以写一个集体的法门,以便在外地点落实类似之效率时好直接调用

    public static function exportData($data = array(), $title = [])
    {
        $new_data = [];
        if (!empty($data)) {
            if(empty($title))
            {
                foreach ($data as $key => $val) {
                    $new_data[$key] = isset($val) ?   mb_convert_encoding($val, 'gbk', 'utf-8') : '';
                }
            } else {
                foreach ($title as $key => $val) {
                    $new_data[$key] = isset($data[$key]) ? mb_convert_encoding($data[$key], 'gbk', 'utf-8') : '';
                }
            }
            $str =  implode(',', $new_data);
            fwrite(self::$fp, $str."\\n");
        }
    }

本条方法的实现原理是以数据开展转码处理然后利用fwrite()措施勾勒副一个初文件。其中self::$fp大凡指定的文书之门道,这么些php手册上看一下fwrite()方的介绍就可以知道参数的意。写副了新的文本后就是可又经reponse->download()计来下充斥了。

improve函数大家好因算法描述得:

php文件包教程

每当数据量异常庞大时,一回性取出大量的多少然后形容副csv文件再次下载的是流程是无适用的,因为数据量庞大会导致取数时间很充裕,命令运行超出内存。此时能够使用的主意就是用大气之数目据时间维度写副多少个csv文件,然后再度冲需要的年华距离将大半只csv文件包下载即可,所以在及时吗谈一下本身怎么着实现公文包。
当php中,利用的凡ZipArchive()类似,通过这些近乎的实例化来兑现打包。

如故是感谢兴趣之同校自行在php手册上攻

代码:

//获取zip包名
$zip_file = $save_path . '/' . $start_date . '-' . $end_date . '.zip';
if (file_exists($zip_file)) {
        return response()->download($zip_file);
}
//文件打包
$zip = new ZipArchive();
if ($zip -> open($zip_file, ZipArchive::CREATE) == true) {
        foreach ($file_dir as $file) {
             if (file_exists($file)) {
             $zip -> addFile($file, basename($file));
             }
        }
}
$zip -> close();

这样尽管兑现了包,其中$file_dir变量是你要打包之文书之途径数组,里面含有有你想打包之公文路径,$zip_file变量是您想打包成zip文件的保之路线+名称。

一些同学在拔取此方法时有时会无用,以己之涉,一般依然文件的路不正确,或者是未曾点名相对路径
注意:在$zip -> addFile()办法被不用使用路径变量拼接,最好以用该法前即描写好路。使用了拼接不会师报错,但是如故会文件上加不上,这里是一个大坑,我搜寻了漫漫才察觉。

说到底:本人新手程序员,一起前进!!!

(define (improve x y) 
    (average x (/ x y)))
(define (average x y)
    (/ (+ x y) 2))

那一个子问题迎刃而解后,原问题就迎刃而解了:

(define (sqrt x)
    (sqrt-iter 1.0 x))

此处我们而任何数之平方根的开始值为1.0。现在我们再一次来拘禁下sqrt函数,我们好博得下边这张图:

sqrt函数分解图

俺们于处理原问题(sqrt)的当儿,我们只有待关注抽象的各种子问题,而每个子问题同时得分解为再度多之支行问题,各种子问题得以看作是一个个之黑匣子,我们管需关注于中贯彻之细节,大家关心其提供的成效就够了。其实另外次第设计还足以经这种手法去用问题日趋分解,这里的表达还得注意一个题目,就是每个被解释后底分段问题应当遵照单一任务的法则,唯有这么,解决该子问题之法才有或被其他的模块举办复用。就比如搭积木的事例里,我们理应去做有通用形状的积木。
哼了,那等同篇就概括介绍了剖析问题的办法。有问题?请留言。其余课后的功课暴发一致志题是前边搜狗公司之面试题,读者可考虑下:

爆发inc函数和dec函数,inc函数的企图是以输入的参数加1后回去,dec函数的意向是用输入的参数减1后归,利用inc函数和dec函数定义加法函数。
(define (+ a b) (…))

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图