大雄 https://199508.com 时光百转千回 en-us Mon, 10 Dec 2018 03:59:08 GMT 岁寒,然后知松柏 /post/2009

我一向觉得,自身对于他人而言,是一种不可理喻的存在,并且向他人寻求理解,也是一种荒谬不堪的暴力。他人总是超乎想象地难以理解我,但正因为这份不理解,我才得以自由;正因为这份不理解,我才得以活下去。我之所以拥有感受他人可爱之处的能力,也必定出于相同的理由。

]]>
Tue, 27 Nov 2018 11:14:09 GMT /post/2009
不害怕不是勇气 /post/2008

多数人认为勇气就是不害怕。现在让我来告诉你,不害怕不是勇气,它是某种脑损伤。勇气是尽管你感觉害怕,但仍能迎难而上;尽管你感觉痛苦,但仍能直接面对。

]]>
Tue, 27 Nov 2018 11:13:17 GMT /post/2008
喜欢的夏天一转眼 /post/2007

常以为人是一个容器,盛着快乐,盛着悲哀。但人不是容器,人是导管,快乐流过,悲哀流过,导管只是导管。各种快乐悲哀流过流过,一直到死,导管才空了。

]]>
Tue, 27 Nov 2018 11:12:12 GMT /post/2007
桌面记忆 /post/2006

人总是这样:只要活着,他的记忆就兢兢业业地工作着,不仅记得住个人的大量往事,而且还会记住在生活交叉路口萍水相逢的人们,他们中间有的已经永远淹没在翻腾的人流漩涡里了,有的却成了始终同你休戚与共、心心相连的人。

]]>
Tue, 27 Nov 2018 10:06:04 GMT /post/2006
广州地铁饶过谁 /post/2005

你从未想伤害别人,但是你却一直在伤害别人。就像生活一直在伤害着你。你是受害者又是加害人。生活太难,所以广州地铁饶过谁。

]]>
Mon, 19 Nov 2018 11:25:18 GMT /post/2005
盗将行 /post/2004

劫过九重城关,
我座下马正酣,
看那轻飘飘的衣摆,
趁擦肩把裙掀。
踏遍三江六岸,
借刀光做船帆,
任露水浸透了短衫,
大盗睥睨四野。
枕风宿雪多年,
我与虎谋早餐,
拎着钓叟的鱼弦,
问卧龙几两钱。
蜀中大雨连绵,
关外横尸遍野,
你的笑像一条恶犬,
撞乱了我心弦。
谈花饮月赋闲,
这春宵艳阳天,
待到梦醒时分睁眼,
铁甲寒意凛冽。
夙愿只隔一箭,
故乡近似天边,
不知何人浅唱弄弦,
我彷徨不可前。
枕风宿雪多年,
我与虎谋早餐,
拎着钓叟的鱼弦,
问卧龙几两钱。
蜀中大雨连绵,
关外横尸遍野,
你的笑像一条恶犬,
撞乱我心弦。
烽烟万里如衔,
掷群雄下酒宴,
谢绝策勋十二转,
想为你窃玉簪。
入巷间吃汤面,
笑看窗边飞雪,
取腰间明珠弹山雀,
立枇杷于庭前。
入巷间吃汤面,
笑看窗边飞雪,
取腰间明珠弹山雀,
立枇杷于庭前。

]]>
Sun, 11 Nov 2018 14:15:40 GMT /post/2004
程序员有两件事 /post/2003

倘若人生真的有什么意义的话,大概就是我每次努力生活却每次都失败,然后为此而留下了一点点挣扎过的痕迹。程序员有两件事,一件是用来创建错误,一件是用来改正错误。

]]>
Fri, 09 Nov 2018 10:16:41 GMT /post/2003
修复OneIndex文件列表按照时间排序 /post/2002

最近某基佬在弄一个OneDrive+OneIndex的网盘程序,发现从OneDrive获取下来的文件并没有按照创建时间的排序,后续进行了调整,利用PHP的数组排序函数array_multisort()把需要排序的数组放进去,然后用SORT_DESC进行降序排序即可。以下代码例子;代码文件在:/home/wwwroot/default/view/nexmoe/list.php;nexmoe为当前使用的模板文件文件夹。

<ul class="mdui-list">
    <li class="mdui-list-item th">
        <div class="mdui-col-xs-12 mdui-col-sm-7">文件 <i class="mdui-icon material-icons icon-sort" data-sort="name" data-order="downward">expand_more</i></div>
        <div class="mdui-col-sm-3 mdui-text-right">修改时间 <i class="mdui-icon material-icons icon-sort" data-sort="date" data-order="downward">expand_more</i></div>
        <div class="mdui-col-sm-2 mdui-text-right">大小 <i class="mdui-icon material-icons icon-sort" data-sort="size" data-order="downward">expand_more</i></div>
    </li>
    <?php if($path != '/'):?>
    <li class="mdui-list-item mdui-ripple">
        <a href="<?php echo get_absolute_path($root.$path.'../');?>">
            <div class="mdui-col-xs-12 mdui-col-sm-7">
            <i class="mdui-icon material-icons">arrow_upward</i>
                ..
            </div>
            <div class="mdui-col-sm-3 mdui-text-right"></div>
            <div class="mdui-col-sm-2 mdui-text-right"></div>
            </a>
    </li>
    <?php endif;?>
    <?php 
    $ctime_str = array();
            foreach((array)$items as $key=>$v){
            (array)$items[$key]['ctime_str'] = $v['lastModifiedDateTime'];
            $ctime_str[] = (array)$items[$key]['ctime_str']+$v;
    }
        array_multisort($ctime_str,SORT_DESC);
        /**
        主要是修改了这个位置的代码,把排序好的数组重新用foreach进行一次遍历即可;
        **/
    ?>
    <?php foreach($ctime_str as $item):?>
        <?php if(!empty($item['folder'])):?>

    <li class="mdui-list-item mdui-ripple">
        <a href="<?php echo get_absolute_path($root.$path.rawurlencode($item['name']));?>">
            <div class="mdui-col-xs-12 mdui-col-sm-7 mdui-text-truncate">
            <i class="mdui-icon material-icons">folder_open</i>
                <span><?php e($item['name']);?></span>
            </div>
            <div class="mdui-col-sm-3 mdui-text-right"><?php echo date("Y-m-d H:i:s", $item['lastModifiedDateTime']);?></div>
            <div class="mdui-col-sm-2 mdui-text-right"><?php echo onedrive::human_filesize($item['size']);?></div>
            </a>
    </li>
        <?php else:?>
    <li class="mdui-list-item file mdui-ripple">
        <a href="<?php echo get_absolute_path($root.$path).rawurlencode($item['name']);?>" target="_blank">
            <div class="mdui-col-xs-12 mdui-col-sm-7 mdui-text-truncate">
            <i class="mdui-icon material-icons"><?php echo file_ico($item);?></i>
                <span><?php e($item['name']);?></span>
            </div>
            <div class="mdui-col-sm-3 mdui-text-right"><?php echo date("Y-m-d H:i:s", $item['lastModifiedDateTime']);?></div>
            <div class="mdui-col-sm-2 mdui-text-right"><?php echo onedrive::human_filesize($item['size']);?></div>
            </a>
    </li>
        <?php endif;?>
    <?php endforeach;?>
</ul>

说明

array_multisort() 函数对多个数组或多维数组进行排序。

参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。

第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改默认的排列顺序)之一:

SORT_ASC - 默认,按升序排列。(A-Z) SORT_DESC - 按降序排列。(Z-A) 随后可以指定排序的类型:

SORT_REGULAR - 默认。将每一项按常规顺序排列。 SORT_NUMERIC - 将每一项按数字顺序排列。 SORT_STRING - 将每一项按字母顺序排列。

]]>
Thu, 01 Nov 2018 20:45:50 GMT /post/2002
Thinkphp运政违章查询接口 /post/2001

创建数据库

SQL 查询结果 Host: localhost Database: jtzf Generation Time: 2018-11-01 12:23:29 Generated by: phpMyAdmin 4.4.15.10 / MySQL 5.5.57-log SQL 查询: show CREATE TABLE ashe_case; 记录: 1

Table   Create Table
ashe_case   CREATE TABLE `ashe_case` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `content` longtext NOT NULL,
 `create_time` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8

创建case数据表用于储存查询之后返回来的数据;

SQL 查询结果 Host: localhost Database: jtzf Generation Time: 2018-11-01 12:24:58 Generated by: phpMyAdmin 4.4.15.10 / MySQL 5.5.57-log SQL 查询: show CREATE TABLE ashe_num; 记录: 1

Table   Create Table
ashe_num    CREATE TABLE `ashe_num` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `card` longtext NOT NULL,
 `create_time` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

创建num数据表用于储存每次需要查询的车牌号码;

SQL 查询结果 Host: localhost Database: jtzf Generation Time: 2018-11-01 12:25:50 Generated by: phpMyAdmin 4.4.15.10 / MySQL 5.5.57-log SQL 查询: show CREATE TABLE ashe_rem; 记录: 1

Table   Create Table
ashe_rem    CREATE TABLE `ashe_rem` (
 `type` varchar(255) NOT NULL,
 `content` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建rem数据表用于储存当前查询的车牌的序号;

以下代码;

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Index extends Controller
{
    public function index()
    {
        $data = input('get.');
        if ($data['tokent'] == 'asheblog'){
//            Db::name('rem')
//                ->where('type','num')
//                ->update([
//                    'content' => 0
//                ]);exit;
            $resultValue = $result = Db::name('num')
                ->order('id','desc')
                ->limit('1')
                ->value('card');
            $cardArray = json_decode($resultValue,true);
            $cardNum = count($cardArray);
            $num = Db::name('rem')
                ->where('type','num')
                ->value('content');
            $postNum = $num+1;
            if ($num >= $cardNum){
                return '最新查询的车牌号码是粤X'.$cardArray[$postNum-1].'本次已经查询完成';
            }
            $post_data = array('CarId' => '粤X' . $cardArray[$postNum], 'Party' => '广东******有限公司');
            $result = $this->sendPost('http://121.33.200.117:9090/Cases/CaseSummarySjgx/GetWaitTransactsForForm', $post_data);
            if ($result != '[]'){
                $json = str_replace(array('[', ']'), '', $result);
                $dbInsert = Db::name('case')
                    ->insert([
                        'content' => $json,
                        'create_time' => time()
                    ]);
                if ($dbInsert){
                    Db::name('rem')
                        ->where('type','num')
                        ->update([
                            'content' => $postNum
                        ]);
                    return '粤X'.$cardArray[$postNum].'查询成功!';
                }
            }else{
                Db::name('rem')
                    ->where('type','num')
                    ->update([
                        'content' => $postNum
                    ]);
                return '粤X'.$cardArray[$postNum].'数据为空';
            }
        }else{
            return 'token不正确';
        }
    }

    function sendPost($url, $post_data)
    {
        $postdata = http_build_query($post_data);
        $options = array('http' => array('method' => 'POST', 'header' => 'Content-type:application/x-www-form-urlencoded', 'content' => $postdata, 'timeout' => 15 * 60));
        $context = stream_context_create($options);
        $result = file_get_contents($url, false, $context);
        return $result;
    }

    public function add(){
        return view();
    }

    public function addInsert(){
        $data = input('post.');
        $array = explode("\r\n",$data['content']);
        $array[0] = NULL;
        unset($array[0]);
        $result = Db::name('num')
            ->insert([
                'card' => json_encode($array),
                'create_time' => time()
            ]);
        if ($result){
            Db::name('rem')
                ->where('type','num')
                ->update([
                    'content' => 0
                ]);
            return '插入成功!';
        }else{
            return '插入失败!';
        }
    }

    public function getList(){
        $result = Db::name('case')
            //->whereTime('create_time', 'today')
            ->select();
        $resultArray = [];
        foreach($result as $item){
            $resultArray[$item['id']] = $item['content'];
        }
        $this->assign([
            'result' => $resultArray
        ]);
        return view();
    }
}

代码随手写的,懒得优化和美化了,将就看吧,估计以后会有用呢。

]]>
Thu, 01 Nov 2018 20:37:55 GMT /post/2001
使用geoIp免费查询IP归属地信息 /post/2000

数据分析不可避免经常遇到IP地址解析,在免费开源的前提下编写了一个IP归属查询工具类

发现IP开源库GEOIP现在只能查询到省级,于是又从csdn上面找到一个经纬信息对应城市的sql数据,于是便能免费查询到市级甚至市级一下的IP归属信息了 首先是官方依赖:

        <!--mmdb-->
        <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.10.0</version>
        </dependency>

然后上码:

/**
 * IPHelper
 *
 * @author nan
 * @date 2018/08/29
 */
@Slf4j
public class IpAddressHelper implements Closeable {

    private File databaseFile;
    private Reader reader ;
    private Db Db;
    private static final int RANGE = 5;
    private static final String UN_KNOWN  = "";
    private static final int COUNTRY_LENGTH = 4;
    private WeakCache<String, Map> weakCache = CacheUtil.newWeakCache(-1);

    public IpAddressHelper(Db Db){
        try {
            this.Db = Db;
            String path = "mmdb/GeoLite2-City.mmdb";
            if (!FileUtil.file(path).exists()){
                InputStream resourceAsStream = IpAddressHelper.class.getClassLoader().getResourceAsStream(path);
                File file = ResourceUtils.getFile(path);
                FileOutputStream tempStream = new FileOutputStream(FileUtil.touch(file));
                IoUtil.copy(resourceAsStream, tempStream);
                tempStream.close();
                reader = new Reader(FileUtil.touch(file));
            }else {
                reader = new Reader(FileUtil.file(path));
            }
        } catch (FileNotFoundException e) {
            log.error("Not Found File classpath:GeoLite2-City.mmdb",e);
            throw new RuntimeException(e);
        } catch (IOException e) {
            log.error("Error Reader databaseFile:GeoLite2-City.mmdb",e);
            throw new RuntimeException(e);
        }
    }

    public Map getRegionOrWithCache(final String ip){
        Map result = weakCache.get(ip);
        if (null != result ){
            return result;
        }else {
            result = getRegion(ip);
            weakCache.put(ip,result);
            return result;
        }
    }
    public Map getRegion(final String ip){

        Map<String, Object> result = new HashMap<>( 3 );
        try {
            InetAddress address = InetAddress.getByName(ip);
            JsonNode response = reader.get(address);
            if (!Objects.isNull( response )) {
                String latitude = response.get("location").get("latitude").toString();
                String longitude = response.get("location").get("longitude").toString();
                String country = response.get("registered_country").get("names").get("zh-CN").toString();
                if (StrUtil.isNotBlank( country ) && country.length()>= COUNTRY_LENGTH) {
                    country = country.substring( 1, country.length()-1 );
                }

                List<Entity> queryResult = Db.query("select * from dc_area_position " +
                        "   where sqrt(  \n" +
                        "         (  \n" +
                        "          (("+longitude+"-longitude)*PI()*12656*cos((("+latitude+"+latitude)/2)*PI()/180)/180)  \n" +
                        "          *  \n" +
                        "          (("+longitude+"-longitude)*PI()*12656*cos ((("+latitude+"+latitude)/2)*PI()/180)/180)  \n" +
                        "         )  \n" +
                        "         +  \n" +
                        "         (  \n" +
                        "          (("+latitude+"-latitude)*PI()*12656/180) \n" +
                        "          *  \n" +
                        "          (("+latitude+"-latitude)*PI()*12656/180)  \n" +
                        "         )  \n     " +
                        "   )<"+ RANGE);

                if ((!Objects.isNull( queryResult )) && queryResult.size() > 0) {
                    result.put( "province", queryResult.get(0).get("province") );
                    result.put( "city", queryResult.get(0).get("city") );
                    result.put( "country", country );
                }
            }
        } catch (NullPointerException e) {
            log.error( "GeoLite2-mmdb search Exception", e );
        } catch (IOException io) {
            log.error( "Get GeoLite2-Country.mmdb file Exception", io );
        } catch (SQLException e) {
            log.error( "数据库操作异常", e );
        }
        result.computeIfAbsent("province",(k)->UN_KNOWN);
        result.computeIfAbsent("city",(k)->UN_KNOWN);
        result.computeIfAbsent("country",(k)->UN_KNOWN);
        return result;
    }

    @Override
    public void close() throws IOException {
        IoUtil.close(reader);
    }

    @Override
    protected void finalize() throws Throwable {
        close();
        super.finalize();
    }
}

注册到spring容器

    @Bean
    public IpAddressHelper ipAddressHelper(@Qualifier("dcDb")Db Db){
        return new IpAddressHelper(Db);
    }

使用:

ipAddressHelper.getRegionOrWithCache("1.2.3.4".toString()) 

代码: https://gitee.com/nanfree/springboot_code_set

]]>
Wed, 31 Oct 2018 05:46:06 GMT /post/2000