0%

如果毫不费力,你就是在浪费时间

json_encode

PHP Version >= 5.0.0
Nesting Limit of 20.
PHP Version >= 5.2.3
Nesting Limit of 128.
PHP Version >= 5.3.0
Nesting Limit of 512.
Small footprint vs PHP’s serialize’d string.
serialize() & unserialize()

serialize

PHP Version >= 4.0.0
You’re storing objects that need to be unserialized as the correct class(反序列化的对象依然可以被正常调用)

Serialization of ‘Closure’ is not allowed

Apparently anonymous functions cannot be serialized.(匿名函数不能被序列化)

Example

1
2
3
4
$function = function () {
return "ABC";
};
serialize($function); // would throw error

You can try this:

1
2
3
4
5
6
function emailCallback() {
return 'ZendMail_' . microtime(true) . '.tmp';
}
$callback = "emailCallback" ;

serialize($callback); // success

生活就是这样, 在你最糟的时候,会遇到最好的人。

Web Worker是什么

Web Worker 是HTML5标准的一部分,这一规范定义了一套 API,它允许一段JavaScript程序运行在主线程之外的另外一个线程中。Web Worker 规范中定义了两类工作线程,分别是专用线程Dedicated Worker和共享线程 Shared Worker,其中,Dedicated Worker只能为一个页面所使用,而Shared Worker则可以被多个页面所共享,本文示例为专用线程Dedicated Worker。
web worker 是运行在后台的 JavaScript,不会影响页面的性能。

例子一: 简单通信

index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/socket.io/1.7.2/socket.io.min.js"></script>
<title></title>
</head>
<body>

</body>
<script>

var worker = new Worker("task.js");
worker.postMessage(
{
id:1,
msg:'Hello World'
}
);
worker.onmessage=function(message){
var data = message.data;
console.log(JSON.stringify(data));
worker.terminate();
};
worker.onerror=function(error){
console.log(error.filename,error.lineno,error.message);
}
</script>
</html>

task.js

1
2
3
4
5
onmessage= function(message){
var data=message.data;
data.msg = 'Hi from task.js';
postMessage(data);
}

例子二: 计数功能

index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
var worker = new Worker("task.js");
worker.onmessage=function(message){
var data = message.data;
console.log(JSON.stringify(data));
//终止woker
//worker.terminate();
};
worker.onerror=function(error){
console.log(error.filename,error.lineno,error.message);
}
</script>

task.js

1
2
3
4
5
6
7
8
var i=0;
function timedCount()
{
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();

迷茫...
人情似纸张张薄,世事如棋局局新。贫居闹市无人问,富在深山有远亲。不信但看宴中酒,杯杯先敬富贵人。门前拴上高头马,不是亲来也是亲。门前放根讨饭棍,亲戚故友不上门。世人结交需黄金,黄金不多交不深,纵令然诺暂相许,终是悠悠路行心。有钱有酒多兄弟,急难何曾见一人。酒肉朋友朝朝有,无钱无势亲不亲。相逢好比初相识,到老终无怨恨心。胜者为王败者寇,只重衣冠不重人。三贫三富不到老,十年兴败多少人。在官三日人问我,离官三日我问人。古人不见今时月,今月曾经照古人。近水楼台先得月,向阳花木易为春。谁人背后无人说,那个人前不说人。百炼化身成铁汉,三缄其口学金人。十分伶俐使七分,常留三分与儿孙。如若十分都使尽,远在儿孙近在身。长江后浪推前浪,世上新人赶旧人。君子乐得做君子,小人枉自做小人。山中自有千年树,世上难逢百岁人。岂无远道思亲泪,不及高堂念子心。堂上二老是活佛,何用灵山朝世尊。平生不作皱眉事,世上应无切齿人。越奸越狡越贫穷,奸狡原来天不容。富贵若从奸狡起,世间呆汉喝西风。求人须求大丈夫,济人须济急时无。茫茫四海人无数,那个男儿是丈夫。人情似水分高下,世事如云任卷舒。入山不怕伤人虎,只怕人情两面刀。无求到处人情好,不饮随它酒价高。知事少时烦恼少,识人多处是非多。秋至满山皆秀色,春来无处不花香。贫无达士将金赠,病有高人说药方。美人卖笑千金易,壮士穷途一饭难。少时总觉为人易,华年方知立业难。用心计较般般错,退步思量事事难。世上闲愁千万斛,不教一点上眉端。毁身每是作恶日,成名皆在行善时。莫把真心空计较,唯有大德享万年。谗言败坏真君子,美色消磨狂少年。神仙难断阴骘命,皇天不昧苦心人。人恶人怕天不怕,人善人欺天不欺。善恶到头终有报,只争来早与来迟。平生不做亏心事,半夜敲门心不惊。万事劝人休瞒昧,举头三尺有神明。鬼神可敬不可谄,怨家宜解不宜结。人生何处不相逢,莫因小怨动声色。好义固为人所钦,贪利乃为鬼所笑。贤者不炫己之长,君子不夺人所好。善业可为须着力,是非闲杂莫劳心。良田不由心田置,产业变为冤业折。千年田地八百主,田是主人人是客。阴地不如心地好,命运在人不在天。有理问得君王倒,有钱难买子孙贤。不求金玉重重贵,但愿儿孙个个贤。枯木逢春犹再岁,人无两度再少年。水暖水寒鱼自知,花开花谢春不管。蜗牛角上校雌雄,石火光中争长短。留心学到古人难,立脚怕随流欲转。少而寡欲颜常好,老不求官梦也闲。妙药难医冤孽病,横财不富命穷人。多情自古空遗恨,好梦由来最易醒。命中只有八合米,走尽天下难满升。知恩报恩天下少,反面无情世间多。荣宠旁边辱等待,贫贱背后福跟随。各人生死各人了,管人闲事受人磨。易涨易退山溪水,易反易覆小人心。红粉佳人休说老,风流浪子莫叫贫。龙游浅水遭虾戏,虎落平阳被犬欺。得食猫儿强似虎,褪毛鸾凤不如鸡。为人莫作千年计,三十河东四十西。当路莫栽荆棘树,它年免挂子孙衣。天上众星皆拱北,世间无水不朝东。笋因落箨方成竹,鱼为奔波始化龙。屋漏偏遭连夜雨,船慢又遇顶头风。记得少年骑竹马,看看又是白头翁。美人绝色原妖物,乱世多财是祸根。畜牲易度人难度,宁度畜牲不度人。天作棋盘星作子,水有源头木有根。昨日花开今日谢,百年人有万年心。北邙荒冢无贫富,玉垒浮云变古今。世事茫茫难自料,清风明月冷看人。守口不谈新旧事,知心难得两三人。欲知世情须尝胆,会尽人情暗点头。是非只为多开口,烦恼皆因强出头。人生七十古来稀,问君还有几春秋。莺花犹怕春光老,岂可教人枉度春。一年之计在于春,一日之计在于晨。一家之计在于和,一生之计在于勤。一朝天子一朝臣,一辈新鲜一辈陈。一苗露水一苗草,一层山水一层人。闷坐书馆闲操心,看来全是论古今。书中有真就有假,世人认假不认真。假作真时真亦假,真作假时假也真。真真假假难分解,假者自假真自真。回忆世情般般假,借假修真破迷津。由来富贵三更梦,何必楚楚苦用心。识透人情惊破胆,看穿世间心胆寒。白璧易埋千古恨,黄金难买一身闲。人生究竟归何处,看破放下随万缘。佛法浩瀚广无边,度尽人间苦和难。开启自性真智慧,笑游清秀山水间。

当斧头来到树林里的时候,好多树都说,至少它的把手是我们自己人。
Let’s say that you have an array of data, e.g results from a search query, and you want to paginate them.

Laravel provides pagination for Eloquent results out of the box, but for custom data we need to do the pagination manually.

Let see how in the next example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php namespace App\Http\Controllers;

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

class SearchController extends Controller {

public function search()
{
.
.
.

$searchResults = [
'item1',
'item2',
'item3',
'item4',
'item5',
'item6',
'item7',
'item8',
'item9',
'item10'
];

//Get current page form url e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();

//Create a new Laravel collection from the array data
$collection = new Collection($searchResults);

//Define how many items we want to be visible in each page
$perPage = 5;

//Slice the collection to get the items to display in current page
$currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all();

//Create our paginator and pass it to the view
$paginatedSearchResults= new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage);

return view('search', ['results' => $paginatedSearchResults]);
}
?>

Now in the view add the following:

1
2
3
4
5
@foreach ($results as $result)
<p>{{ $result }}</p>
@endforeach

<?php echo $results->render(); ?>

http://psampaz.github.io/custom-data-pagination-with-laravel-5/

不管我本人多么平庸,我总觉得对你的爱很美。
super有三种用法, 第一参数总是召唤父类的那个类, 第二参数可缺(返回非绑定父类对象),也可以是实例对象或该类的子类. 最终返回的都是父类的实例(绑定或非绑定). 在Python3中,super函数多了一种用法是直接super(),相当于super(type,首参), 这个首参就是一般的传入的self实例本身啦. 因为在py2里面常用也是这种写法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

class A(object):
def __init__(self):
print("inter A")
print("leave A")
def demo(self):
print("demo A")

class B(A):
def __init__(self):
print("enter B")
super(B, self).__init__()
super(B, self).demo()

b = B()
print(b)
以上代码还可以这样写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A(object):
def __init__(self):
print("inter A")
print("leave A")
def demo(self):
print("demo A")

class B(A):
def __init__(self):
print("enter B")
A.__init__(self)
A.demo(self)

b = B()
print(b)
如果没有多继承, super其实和通过父类来调用方法差不多. 但, super还有个好处: 当B继承自A, 写成了A.__init__, 如果根据需要进行重构全部要改成继承自 E,那么全部都得改一次! 这样很麻烦而且容易出错! 而使用super()就不用一个一个改了(只需类定义中改一改就好了)

这样看你 用所有眼睛和所有距离 就像风住了 风又起
Elasticsearch把每条数据叫做Document,然后提交到Index中。

简单说,Document中的数据是如何转变成倒排索引的,以及查询语句是如何转换成一个个词(Term)使高效率文本搜索变得可行,这种转换数据的过程就称为文本分析(analysis)。

analysis 基本概念

elasticsearch全文搜索引擎会用某种算法(Tokenizer)对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些进一步的处理算法被称为Filter(过滤器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。

文本分析(analysis)工作由analyzer(分析器)组件负责。analyzer由一个分词器(tokenizer)和0个或者多个过滤器(filter)组成,也可能会有0个或者多个字符映射器(character mappers)组成。

tokenizer用来把文本拆分成一个个的Token。Token包含了比较多的信息,比如Term在文本的中的位置及Term原始文本,以及Term的长度。文本经过tokenizer处理后的结果称为token stream。token stream其实就是一个个Token的顺序排列。token stream将等待着filter来处理。

filter链将用来处理Token Stream中的每一个token。这些处理方式包括删除Token,改变Token,甚至添加新的Token。比如变小写,去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器),Elasticsearch中内置了许多filter,读者也可以轻松地自己实现一个filter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}

现在的孩子越来越早熟才炖了5分钟就烂了
## php

preg_match

1
2
3
$str = '<a><b><c>';
preg_match("/<(\w)+>/", $str, $abc);
dd($abc);

结果: ['<a>', 'a']

preg_match_all

1
2
3
$str = '<a><b><c>';
preg_match_all("/<(\w)+>/", $str, $abc);
dd($abc);

结果: [['<a>','<b>','<c>'],['a', 'b', 'c']]

python

re.match

1
2
3
4
5
6
7
import re

line = '<a><b><c>'
reg = "<(\w)>"
res = re.match(reg, line)
if res:
print(res.group(1))

结果: a

re.findall

1
2
3
4
5
6
7
import re

line = '<a><b><c>'
reg = "<(\w)>"
res = re.findall(reg, line)
if res:
print(res)

结果: ['a', 'b', 'c']

人生本无意义,唯有寻趣。
### 一个简单的例子
1
2
3
4
5
6
7
8
9
10
11
12
Event::listen('eloquent.created: App\User', function () {
Log::info('haha');
});

Route::get('hehe', function (){

\App\User::forceCreate([
'name' => 'yangzie',
'email' => 'yang11@qq.ttt',
'password' =>bcrypt(str_random(6))
]);
});
### 比较规整的写法
  • 在Providers\EventServiceProvider.php 添加:

    1
    2
    3
    4
    5
    protected $listen = [
    'App\Events\UserCreated' => [
    'App\Listeners\NotifyAdminUserCreated',
    ],
    ];
  • 执行命令:
    会生成两个文件
    Events/UserCreated.php
    Listeners/NotifyAdminUserCreated.php

    1
    php artisan event:generate
  • 在User 模型中:
    1
    2
    3
    4
    5
    use App\Events\UserCreated;

    protected $events = [
    'created' => UserCreated::class
    ];
  • 在监听文件中
    app\Listeners\NotifyAdminUserCreated.php
    1
    2
    3
    4
    5
    public function handle(UserCreated $event)
    {
    $post = $event->post;
    \Log::info($post);
    }
  • 在事件文件中:
    app\Events\UserCreated.php
    1
    2
    3
    4
    5
    6
    public $post;

    public function __construct($post)
    {
    $this->post = $post;
    }

Observer写法(推荐)

https://laravel-china.org/articles/6657/model-events-and-observer-in-laravel

我想用余生为你暖一盏茶,晚风微扬时勿忘归家。

前提

在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_SET函数就派上用场了.

使用

str 要查询的字符串

area 字段名 参数以”,”分隔 如 (1,2,6,8)

1
SELECT * from test where FIND_IN_SET('1',area)

FIND_IN_SET和like的区别

like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。

悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。

保留ID最小的

1
DELETE FROM NAMES WHERE id NOT IN( SELECT * FROM (SELECT MIN(n.id)FROM NAMES n GROUPBY n.name) x)

保留ID最大的

1
DELETE FROM NAMES WHERE id NOT IN( SELECT * FROM (SELECT MAX(n.id)FROM NAMES n GROUPBY n.name) x)