composer 源码小记录

话说在住院的时候,想起来了以前看过的一个帖子有说在加载 psr4 的时候记录的 namespace 的长度是用来替换路径用的。

但是在今天中午去看加载源码的时候发现已经没有这个替换了。于是赶紧翻看 github 上面的改动记录,发现已经不使用那种方式了,而是采用截取的方式去获取文件名什么的。然后路径就直接使用现存的了。

代码如下图

图片alt

估计等在过一段那个 namespace 的长度也可以不用了,但是看改动记录,还是存在,静待观察

php curl 模拟上传遇到的小问题记录

今天在公司写东西的时候遇到了一个奇怪的小问题,就是在用 curl 模拟文件上传的时候发现上传失败,最初始采用的代码如下

[
    'file' => '@' . $fileName
]

通过查看文档发现了下面的一段说明

图片alt

从这可以得知,CURLOPT_SAFE_UPLOAD 这个参数可以控制,由于 php 5.5 以前的默认值是 false ,所以我可能以前并没有关注,但是在 php 5.6 的时候这个默认值是 true 了,所以当我们想要采用上面那种方式就需要设置 CURLOPT_SAFE_UPLOAD 这个值为 false 才可以使用。

但是需要注意的是在 php 7 以后这个属性被删除了,所以当我们想要上传的时候,必须采用 CURLFile 才可以上传。具体可以参见 http://php.net/manual/zh/class.curlfile.php

所以现在就不要考虑 CURLOPT_SAFE_UPLOAD 这个参数了,以后在模拟上传的时候直接采用 CURLFile 就可以了

升级 homestead 小记录

又是一个周末,自觉状态调整的不错了,于是就像弄点东西玩,然后,就想到了升级相关版本,vagrant 和 virtual box 都升级完了,然后我又升级了 homestea 的脚本,并且切换到了最新的 release tag 上,最后执行 vagrant box update,会提示 ==> homestead-7: Box 'laravel/homestead' not installed, can't check for updates. 这个么个东西,在网上简单的看了一下也没发现什么

最后灵机一动,切换会原来的 tag,然后再升级 box 再换到最新的 tag 就 ok 了。

哈哈,太机智了,记录一下顺序吧,以后就不会出问题了,先升级 box,然后升级 homestead 脚本,最后切换到脚本最新的 release 的 tag 就大功告成了,继续写代码

对了,升级以后还得重新配置一下 composer 中国镜像

用 php 来实现微信跳一跳 (适用于安卓手机)

作为一个程序员,当微信出了跳一跳后,排行榜的前三名就没有低于 1k 分的,我甚是伤心,所以 php 也要来跳一跳,今天发出来的版本貌似已经是第五版了,每天晚上都回家写一个方法,分数越来越高,到了现在,运行速度和分数都已经让我满意了。刚才打的最高分。

github 地址: https://github.com/crazyhl/php_jump_auto

分数

下面说一下实现的思路,先用 adb 截图,然后再这个截图上寻找小人的位置,以及需要跳跃到的方块的位置,最后再利用 adb 模拟长按跳过去就行了。

分开说下,如何找小人。利用先确认一个小人身上的色块的色值,然后在再整图上找这个色值区间值的一个范围。

如下图 图片alt

再调整色块值之后,我觉得这个范围比较合适,所以我就定了下来,然后再计算这个范围的中心点,当做小人的中心点。

然后再去寻找需要需要跳跃的目标,这里有个优化后的方法,首先我们确认了小人的位置,然后就搜索半张图就可以了,然后寻找两个点,跟标准值差异的最高点以及最右的一个点,为什么不寻找左侧点,是因为有阴影会影响搜索的。

等找到最高点和最右点之后,取两个点的交点就确认跳跃的目标点了。

这样人物点位和目标点都确认好了,然后利用勾股定理就可以计算出来距离了。这个距离跟最终的长按时间是有一个比例了,这个比例自己测一测就能大概找出来了。

这样,一个跟 php 没有太大关系的辅助就成了,最后,铺天盖地求 star

dijkstra算法 PHP 实现

20171119 利用周末优化了一下代码。这次完全默写了出来。感觉好多了

这个是根据算法图解自己写的,理解的不是很好,注释都在代码里面,过几天再默写一下,好好理解一下

<?php

// 构造图
$graphs = [];
$graphs['start'] = [];
$graphs['start']['a'] = 5;
$graphs['start']['b'] = 2;

$graphs['a'] = [];
$graphs['a']['c'] = 4;
$graphs['a']['d'] = 2;

$graphs['b'] = [];
$graphs['b']['a'] = 8;
$graphs['b']['d'] = 7;

$graphs['c'] = [];
$graphs['c']['d'] = 6;
$graphs['c']['fin'] = 3;

$graphs['d'] = [];
$graphs['d']['fin'] = 1;

$graphs['fin'] = [];

// 处理过的节点
$processed = [];
// 所有节点的消费
$costs = [];
// 所有节点的父节点
$parents = [];

function getNodeCost($graphs, $nodeName = 'start', $isStartNode = false)
{
    if (empty($graphs)) {
        return [];
    }
    $costs = [];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($isStartNode) {
            $costs[$name] = $length;
        } else {
            $costs[$name] = INF;
        }
        $costs += getNodeCost($graphs, $name);
    }

    return $costs;
}

$costs = getNodeCost($graphs, 'start', true);

function getNodeParents($graphs, $nodeName = 'start', $isStartNode = false)
{
    if (empty($graphs)) {
        return [];
    }
    $parents = [];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($isStartNode) {
            $parents[$name] = $nodeName;
        } else {
            $parents[$name] = null;
        }
        $parents += getNodeParents($graphs, $name);
    }

    return $parents;
}

$parents = getNodeParents($graphs, 'start', true);

function findLowestCostNode($costs, $processed)
{
    $lowestNodeLength = INF;
    $lowestNOdeName = '';
    foreach ($costs as $name => $length) {
        if ($length < $lowestNodeLength && !in_array($name, $processed)) {
            $lowestNodeLength = $length;
            $lowestNOdeName = $name;
        }
    }

    return $lowestNOdeName;
}

$nodeName = findLowestCostNode($costs, $processed);
while ($nodeName) {
    $currentNodeCost = $costs[$nodeName];
    foreach ($graphs[$nodeName] as $name => $length) {
        if ($currentNodeCost + $length < $costs[$name]) {
            $costs[$name] = $currentNodeCost + $length;
            $parents[$name] = $nodeName;
        }
    }
    $processed[] = $nodeName;
    $nodeName = findLowestCostNode($costs, $processed);
}

var_dump($costs);
var_dump($parents);