分类存档: vip - 第2页

mysql去重的最方便的方法

方法一:

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段

下面先来看看例子:

table
id name
1 a
2 b
3 c
4 c
5 b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

name
a
b
c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

id name
1 a
2 b
3 c
4 c
5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

最终好用的语句如下:

select *, count(distinct name) from table group by name

结果:

id name count(distinct name)
1 a 1
2 b 1
3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错。。。。。。。。!OK了

总结语句:select *, count(distinct name) from (select * from table……等嵌套语句) group by name
参考出处:https://blog.csdn.net/djun100/article/details/84473838?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

yii2布局全屏

方法一:
导航栏下面的页面在宽屏上不留白的办法
修改views/layouts/main.php
将class=”container” 改成class=”container-fluid”
方法二:

<?php

/* @var $this yii\web\View */

$this->title = '企业画像123';
?>
<style>


.mydivstyle{ border-style:solid; border-width:1px; border-color:#000;width: 1s50px;height:100px;
  background:#000066;

}
h2{
color:#ffffcc;
}
//图片与div同缩放
#testfullscreen{
    background-image: url(img/bg.png);
    background-repeat: no-repeat;
    background-size: 100% 100%;
}


</style>

<script>
function showFull(){
               var full=document.getElementById("testfullscreen");
               launchIntoFullscreen(full);
            }

function delFull() {
                exitFullscreen();
            }
//全屏方法封装:
            function launchIntoFullscreen(element) {
                if(element.requestFullscreen){
                    element.requestFullscreen();
                }
                else if(element.mozRequestFullScreen) {
                    element.mozRequestFullScreen();
                }
                else if(element.webkitRequestFullscreen) {
                    element.webkitRequestFullscreen();
                }
                else if(element.msRequestFullscreen) {
                    element.msRequestFullscreen();
                }
            }
            //退出全屏
            function exitFullscreen() {
                if(document.exitFullscreen) {
                    document.exitFullscreen();
                } else if(document.mozCancelFullScreen) {
                    document.mozCancelFullScreen();
                } else if(document.webkitExitFullscreen) {
                    document.webkitExitFullscreen();
                }
            }
</script>

<div class="site-index">



    <div class="body-content" id="testfullscreen">
    <button  onclick="showFull();">
                全屏
            </button>
<button  onclick="delFull();">
                退出全屏
            </button>
<div class="row clearfix">
        <div class="col-md-4 column">

                            <div class="row-lg-4">
                                <h2>0</h2>
                                <h2>企业高管信息</h2>

                               <div id="main" class="mydivstyle"></div> 
                                <p><a class="btn btn-default" href="http://localhost/index.php?r=site%2Fabout">更多»</a></p>
                            </div>
                            <div class="row-lg-4">
                                <h2>0</h2>
                                <h2>企业综合信息</h2>

                                <div id="m2" class="mydivstyle"></div>
                               <p><a class="btn btn-default" href="http://localhost/index.php?r=site%2Fabout">更多»</a></p>
                            </div>
                            <div class="row-lg-4">
                                <h2>0</h2>
                                <h2>企业图谱</h2>

                                <div id="m3" class="mydivstyle"></div>
                                <p><a class="btn btn-default" href="http://localhost/index.php?r=site%2Fabout">更多»</a></p>
                            </div>
                        </div>
        </div>
        <div class="col-md-4 column">
        </div>
        <div class="col-md-4 column">
        </div>
</div>









    </div>
</div>

<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>

<script language="javascript">
$('#aa').load("data.txt");
</script>


       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat/dist/ecStat.min.js"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/world.js"></script>
       <script type="text/javascript" src="https://api.map.baidu.com/getscript?v=2.0&ak=BAfb9bb97f7b712e5426859ac957c98f"></script>
       <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/bmap.min.js"></script>


<!--script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script-->

<script type="text/javascript">
var dom = document.getElementById("main");
var myChart = echarts.init(dom);
var app = {};
option = null;
myChart.showLoading();
$.get('http://localhost/data.txt', function (data) {

    myChart.hideLoading();

    echarts.util.each(data.children, function (datum, index) {
        index % 2 === 0 && (datum.collapsed = true);
    });

  /* myChart.setOption(option = {
        tooltip: {
          //  trigger: 'item',
           // triggerOn: 'mousemove'
        },
        series: [
            {
                type: 'tree',

                data: [data1],

               s top: '1%',
                left: '7%',
                bottom: '1%',
                right: '20%',

               symbolSize: 7,

                label: {
                    position: 'left',
                    verticalAlign: 'middle',
                    align: 'right',
                    fontSize: 9
                },

                leaves: {
                    label: {
                        position: 'right',
                        verticalAlign: 'middle',
                        align: 'left'
                    }
                },

                expandAndCollapse: true,
               // animationDuration: 550,
                //animationDurationUpdate: 750
            }
        ]
    });*/
      myChart.setOption({
         tooltip: {
            trigger: 'item',
            triggerOn: 'mousemove'
        },
    series : 
    [
        {
           "name": "国资委",
           "type": "tree", 
           top: '1%',
                left: '7%',
                bottom: '1%',
                right: '30%',
                 symbolSize: 10,
                 label: {
                    position: 'left',
                    verticalAlign: 'middle',
                    align: 'right',
                    fontSize: 10
                },leaves: {
                    label: {
                        position: 'right',
                        verticalAlign: 'middle',
                        align: 'left'
                    }
                },
           'data':[
                {
                  "id": "000000000",
                  "parentId": null,
                  "name": "国资委",
                  "dataId": null,
                  "companyCount": 782,
                  "children": [{
                      "id": "73746554X9",
                      "parentId": "000000000",
                      "name": "上海同盛投资(集团)有限公司(集团汇总表)",
                      "dataId": "09a30b23-6ff2-4f9b-8d32-f4ac3f8529db",
                      "companyCount": 9,
                      "children": [{
                          "id": "7672369670",
                          "parentId": "73746554X9",
                          "name": "上海同盛置业有限公司(单户表)",
                          "dataId": "03621932-9a7d-4001-aabe-1443541daecd",
                          "companyCount": 0,
                          "children": [
                            {
            "id": "7377674250",
            "parentId": "73746554X9",
            "name": "洋山同盛港口建设有限公司(单户表)",
            "dataId": "459c3698-0bc0-4869-8b9f-df45a1efa9c2",
            "companyCount": 0,
            "children": [{
            "id": "7377674250",
            "parentId": "73746554X9",
            "name": "洋山同盛港口建设有限公司(单户表)",
            "dataId": "459c3698-0bc0-4869-8b9f-df45a1efa9c2",
            "companyCount": 0,
            "children": [{
            "id": "7377674250",
            "parentId": "73746554X9",
            "name": "洋山同盛港口建设有限公司(单户表)",
            "dataId": "459c3698-0bc0-4869-8b9f-df45a1efa9c2",
            "companyCount": 0,
            "children": [{
            "id": "7377674250",
            "parentId": "73746554X9",
            "name": "洋山同盛港口建设有限公司(单户表)",
            "dataId": "459c3698-0bc0-4869-8b9f-df45a1efa9c2",
            "companyCount": 0,
            "children": []
        }]
        }]
        }]
        }

                          ]
                      }, {
            "id": "7844456480",
            "parentId": "73746554X9",
            "name": "洋山同盛联合投资发展有限公司(单户表)",
            "dataId": "3f127dff-efc2-4aa1-93f7-2fbc1c85c388",
            "companyCount": 0,
            "children": []
        }, {
            "id": "7377674250",
            "parentId": "73746554X9",
            "name": "洋山同盛港口建设有限公司(单户表)",
            "dataId": "459c3698-0bc0-4869-8b9f-df45a1efa9c2",
            "companyCount": 0,
            "children": []
        }, {
            "id": "73746554X0",
            "parentId": "73746554X9",
            "name": "上海同盛投资(集团)有限公司(单户表)",
            "dataId": "46e1c2b8-034a-461f-a719-777b2997b955",
            "companyCount": 0,
            "children": []
        }, {
            "id": "73746554X1",
            "parentId": "73746554X9",
            "name": "上海同盛投资(集团)有限公司(集团差额表)",
            "dataId": "5766e8f8-1cac-4143-8de9-f5653ceeddbb",
            "companyCount": 0,
            "children": []
        }, {
            "id": "7605970730",
            "parentId": "73746554X9",
            "name": "上海同盛电力有限公司(单户表)",
            "dataId": "5ef32ea1-785c-4b9f-830b-3f8152d5f715",
            "companyCount": 0,
            "children": []
        }, {
            "id": "7595844510",
            "parentId": "73746554X9",
            "name": "上海同盛投资集团资产管理有限公司(单户表)",
            "dataId": "64073d4d-ed15-4ab9-9620-9030b8fd11b1",
            "companyCount": 0,
            "children": []
        }, {
            "id": "7655620720",
            "parentId": "73746554X9",
            "name": "上海同盛水务有限公司(单户表)",
            "dataId": "6f3b9252-5656-4ff7-8f96-39879caee530",
            "companyCount": 0,
            "children": []
        }, {
            "id": "1345456470",
            "parentId": "73746554X9",
            "name": "上海同盛投资集团房地产有限公司(单户表)",
            "dataId": "8b5e06f8-4dbc-41f4-8896-e1874b509853",
            "companyCount": 0,
            "children": []
        }]
                    }]
                  }
           ]
        }
    ]
});



});
if (option && typeof option === "object") {
    myChart.setOption(option, true);
}
       </script>

d3.js自定义组件

<html>
    <head>
        <meta charset="utf-8">
        <!--script type="text/javascript" src="https://d3js.org/d3.v6.min.js"></script-->
        <script type="text/javascript" src="d3.js"></script>
        <script type="text/javascript" src="demo2.js?r=12s"></script>
    </head>
    <body onload="demo2()">
        <svg id="sticker" width="600" height="300" style="background: lightgrey"/>
            <p>hello,today is a good day!</p>
    </body>
</html>
function sticker(sel,label){
    sel.append("rect").attr("rx",5).attr("ry",5)
    .attr("width",70).attr("height",30)
.attr("x",-35).attr("y",-15)
.attr("fill","none").attr("stroke","blue")
.classed("frame",true);

sel.append("text").attr("x",0).attr("y",5)
.attr("text-anchor","middle")
.attr("font-family","sans-serif").attr("font-size",14)
.classed("label",true)
.text(label?label:d=>d);
    }

function demo2()
{
    var labels=["hello","world"];
var scX=d3.scaleLinear().domain([0,labels.length-1]).range([100,500]);
var scY = d3.scaleLinear().domain([0,labels.length-1]).range([50,150]);
d3.select("#sticker")
.selectAll("g").data(labels).enter().append("g")
.attr("transform",(d,i)=>"translate("+scX(i)+","+scY(i)+")")
.call(sticker);

d3.select("#sticker").append("g")
.attr("transform","translate(175,150)")
.call(sticker,"cool")
.selectAll(".label").attr("fill","red");
}

国产系统uos自定义桌面背景

用uos的画图板生成自定义图片,放到这个目录下,再在桌面选择切换背景就可以看到自定义的图片了,点击切换就可以了
/usr/share/wallpapers/deepin

python-gui-tkinter

系统实现:
HOME=/
SHELL=/bin/bash
* * * * * export DISPLAY=:0.0 && notify-send [“该休息一下啦”] “喝水!伸懒腰!动一动!”
python 实现:
sudo apt-get install python3-tk
#!/usr/bin/python3
from tkinter import *
top=Tk()

message='喝水时间到,休息一下吧!'

w=Label(top,text=message,bg='SeaGreen',width=1024,height=800)
w.pack()
top.mainloop()

crontab -e
* */1 * * * python3 /path/timer.py

[定时锁屏]
安装锁屏命令
sudo apt install gnome-screensaver

锁屏
gnome-screensaver-command -l

页面通知
为了更加优化,在锁屏前,弹出系统通知

notify-send -u normal -t 50000 -i appointment-new ‘1分钟后锁屏’ ‘注意休息,善待眼睛、善待颈椎’

定时任务
Terminal中输入 crontab -e 进入定时任务编辑页面(如果是第一次,会提示选择编辑器,本人选择vim)。输入如下内容:

# m h dom mon dow command
29 * * * * notify-send -u normal -t 50000 -i appointment-new ‘1分钟后锁屏’ ‘注意休息,善待眼睛、善待颈椎’
30 * * * * gnome-screensaver-command -l

奇怪的是,不管是通知还是锁屏,均无法生效。原因就在于 cron 中执行界面相关的命令,需要有如下合适的参数:$DBUS_SESSION_BUS_ADDRESS,$DISPLAY。如何给这两个参数设置合适的值呢?可以从系统中已运行的程序中获取,详情介绍请参考。
新建脚本:/usr/local/bin/gui-program-from-cron.sh,内容如下:

#!/bin/sh
[ “$#” -lt 1 ] && echo “Usage: $0 program options” && exit 1

program=”$1″
shift

user=$(whoami)
env_reference_process=$( pgrep -u “$user” xfce4-session || pgrep -u “$user” ciannamon-session || pgrep -u “$user” gnome-session || pgrep -u “$user” gnome-shell || pgrep -u “$user” kdeinit | head -1 )

export DBUS_SESSION_BUS_ADDRESS=$(cat /proc/”$env_reference_process”/environ | grep –null-data ^DBUS_SESSION_BUS_ADDRESS= | sed ‘s/DBUS_SESSION_BUS_ADDRESS=//’)
export DISPLAY=$(cat /proc/”$env_reference_process”/environ | grep –null-data ^DISPLAY= | sed ‘s/DISPLAY=//’)
“$program” “$@”

修改脚本权限:

sudo chmod +x /usr/local/bin/gui-program-from-cron.sh

再次执行 crontab -e

# m h dom mon dow command
29 * * * * /usr/local/bin/gui-program-from-cron.sh notify-send -u normal -t 50000 -i appointment-new ‘1分钟后锁屏’ ‘注意休息,善待眼睛、善待颈椎’
30 * * * * /usr/local/bin/gui-program-from-cron.sh gnome-screensaver-command -l

善待眼睛、善待颈椎,从看完本文开始!
参考:
https://blog.csdn.net/weixin_43834662/article/details/95596981?utm_medium=distribute.pc_relevant.none-task-blog-title-8&spm=1001.2101.3001.4242

以上在uos上都不行!!!

在Linux上搭建Actionscript开发环境

Actionscript的开发通常使用Flash Pro和Flash Builder完成,但这两款软件都没有Linux版本,在Linux下我们可以自己手动搭建一个Actionscript的开发环境。
Actionscript的开发环境主要有三个方面,分别是IDE、SDK和Flash Player Debugger。

IDE
Adobe为Actionscript的开发专门提供了Flash Builder,Flash Builder是基于Eclipse开发的,而Eclipse提供了Linux版本,所以我们只要在Eclipse上安装Actionscript插件就可以在Linux上实现Flash Builder的功能。
首先在Eclipse官网下载Eclipse IDE,目前的最新版为4.3。安装过程不再赘述。Eclipse的运行需要Java环境,没有预装Java的Linux发行版用户可以访问Oracle网站下载对应安装包。
Eclipse安装完成后,就要安装Flash Builder的插件了,官方没有为Linux提供插件,所以我们使用一个名为fb4linux的开源Flash Builder 4.5的Lniux插件,项目地址:http://code.google.com/p/fb4linux/。访问该地址下载FB4.5ForLinuxaa和FB4.5ForLinuxab两个安装包。下载完成后使用命令cat FB45ForLinux* >FB45ForLinux.tar.bz2将两个包和成为一个压缩包,并将其解压。
接下来在Eclipse中安装FB45ForLinux插件,在Eclipse中选择Help->Install New Software,点击Add,在弹出窗口中选择Local,定位到FB45Forinux.tar.bz2解压后的目录后,点击OK,此时列表中并没有出现可以安装的插件,将Group items by category选项去掉,即可显示出可安装的软件。全选所有可安装的项目,点击Next进行安装。
插件安装完成后,IDE部分的配置就结束了。接下来是SDK的安装。

SDK
SDK的配置和在Windows下基本一样,首先在Adobe或Apache官网上下载Flex SDK安装包,将包解压,在Eclipse中选择Window->Preference->Flash Builder->Installed Flex SDKs,点击Add添加解压好的SDK目录。

Flash Player Debugger
Flash Player 的Debugger版本的安装最为复杂,Adobe已经停止对Linux平台Flash Player的开发,目前Linux平台最新版的Flash Player是11.2。所以Debug版的Flash Player最新版也是11.2,Adobe在http://www.adobe.com/support/flashplayer/downloads.html上提供了Linux版的下载。
这里需要注意的是,Adobe提供的Debug版Flash Player只有32位版本,而64的Linux中的Firefox是无法直接使用该插件的。
在64位Firefox下使用Flash Player debugger,需要通过nspluginwrapper将其转换为可在64位Firefox下使用的插件。使用apt-get或yum等安装nspluginwrapper,并将Flash Player debugger压缩包中的libflashplugin.so拷贝到/usr/lib/mozilla/plugin下,启动Firefox,nspluginwrapper会自动将libflashplugin.so转换为64位插件,保存在/usr/lib64/mozilla/plugin-wrapped下。打开Firefox在地址栏中输入about:plugins,查看flash player是否安装正确。
在Eclipse中新建一个Actionscript Project,编译运行,如果能够编译并debug,表明配置正确,如果Firefox出现播放Flash就崩溃的情况,可能由于转换后的Flash Player造成的,Firefox默认开启了插件的防崩溃机制,导致debug版本崩溃。在Firefox地址栏中输入about:config搜索dom.ipc.plugins.enabled,将其值设置为false,重启Firefox,Flash Player debugger即可正常运行。

Alt text

至此,Linux上Actionscript开发环境就搭建完成了。
接下来参考flex开发教程进行as3开发
https://developer.ibm.com/zh/technologies/web-development/articles/wa-lo-flexdev/

用 Sublime Text 2 写 ActionScript3

参考 https://www.cnblogs.com/Richard-Core/p/Sublime-ActionScript3.html
mxmlc在flexsdk的bin目录下
mxmlc Test.as =>Test.swf

linux配置java环境变量(详细)

一. 解压安装jdk
在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,
执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车。之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下。
or
tar -axvf jdk-8u201-linux-x64.tar.gz

二. 需要配置的环境变量
1. PATH环境变量。作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把 jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好 PATH变量后,就可以在任何目录下执行javac/java等工具了。
2. CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们 需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
3. JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。

三. 三种配置环境变量的方法1. 修改/etc/profile文件
如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。
·用文本编辑器打开/etc/profile
·在profile文件末尾加入:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录
·注解
a. 你要将 /usr/share/jdk1.6.0_14改为你的jdk安装目录
b. linux下用冒号“:”来分隔路径
c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值
在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种
常见的错误。
d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。
e. export是把这三个变量导出为全局变量。
f. 大小写必须严格区分。

  1. 修改.bash_profile文件

这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bash_profile文件就可以了。
·用文本编辑器打开用户目录下的.bash_profile文件
·在.bash_profile文件末尾加入:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录 source .bash_profile

  1. 直接在shell下设置变量
    不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。
    只需在shell终端执行下列命令:
export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

四. 测试jdk
1. 用文本编辑器新建一个Test.java文件,在其中输入以下代码并保存:
public class test {
public static void main(String args[]) {
System.out.println(“A new jdk test !”);
}
}
2. 编译:在shell终端执行命令 javac Test.java
3. 运行:在shell终端执行命令 java Test
当shell下出现“A new jdk test !”字样则jdk运行正常。

五. 卸载jdk
·找到jdk安装目录的_uninst子目录
·在shell终端执行命令./uninstall.sh即可卸载jdk。
Desire has no rest.


Ubuntu 18.04安装JDK并配置环境变量

1、下载jdk
2、进行解压
tar -zxvf jdk-8u171-linux-x64.tar.gz
3、进行配置
使用全局设置方法,它是所有用户的共用的环境变量
命令如下:vim ~/.bashrc

然后把如下命令复制到最底部

export JAVA_HOME=jdk存放的地址
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

4、生效~/.bashrc文件
$source ~/.bashrc

5、测试是否安装成功
java -version 查看版本号是否改变

使用wget命令下载Google drive上的文件

此处的文件是指公开的文件,不需要输入密码也不需要登录Google drive即可获取的文件。

1. 下载小文件

wget –no-check-certificate ‘https://docs.google.com/uc?export=download&id=FILEID’ -O FILENAME

替换对应的FILEID即可,FILENAME自己命名。
FILEID是Google drive公开分享的链接中ID后面的,例如:

https://drive.google.com/open?id=ThisIsFileID

如果下载中断了,想要继续下载,可以在wget后面添加 -c 参数

2. 下载大文件

因为Google drive的大文件,无法通过安全查杀

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1wZhaEBYeg7da5gisxCb0MJSgeQnXSg9d' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1wZhaEBYeg7da5gisxCb0MJSgeQnXSg9d" -O 1.bin && rm -rf /tmp/cookies.txt

同样替换其中的FILEID和FILENAME即可。注意FILEID有两处。

原文链接:https://blog.csdn.net/Mao_Jonah/java/article/details/88372086

yii2对接支付宝

主要遇到三个问题:

1 如何引入支付宝的php库

1.1 把下载下来的文件放入web目录下的ali文件夹,然后控制器引入

require_once(“ali/pagepay/service/AlipayTradeService.php”);
require_once(“ali/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php”);

1.2.config配置文件可以直接写在config/params.php里,控制器里用

$config = Yii::$app->params["config"];引用配置文件

<?php
    //config/params.php
return [
    'adminEmail' => 'nbllq@qq.com',
    //'alldata' => 'test'
    "config" => [   
        //应用ID,您的APPID。
        'app_id' => "your id",

        //商户私钥
        'merchant_private_key' => "your key",

        //异步通知地址
        'notify_url' => "外网地址",

        //同步跳转
        'return_url' => "本地地址",

        //编码格式
        'charset' => "UTF-8",

        //签名方式
        'sign_type'=>"RSA2",

        //支付宝网关
        'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",

        //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        'alipay_public_key' => "your key",
]
];

1.3 $aop = new \AlipayTradeService($config); 注意前面的\,如果不加会报错

2. 页面传递给支付宝乱码

解决方法:控制器对应的php文件编码格式改成无bom的utf-8

3.官方的return_url.php验签成功,但是移植到控制器中验签失败

主要是yii2框架的url路由规则影响的,其他框架可能不会有这个问题
解决方法:开启url美化或者把传递的参数中r=对应的控制器参数去掉后再传递,参考代码:

    public function actionAlireturnurl()
    {   
        header("Content-Type: text/html;charset=utf-8");

        $arr = Yii::$app->request->get();
        $rc=array_shift($arr); //!!!!去除r控制器参数,不然验sign会失败!!!!!!花了我一天时间找这个bug,fuck!
        //$alipaySevice = new \AlipayTradeService(Yii::$app->params["config"]); 
        //$result = $alipaySevice->check($arr);
        $config = Yii::$app->params["config"];
        $aop = new \AlipayTradeService($config);
        $result = $aop->check($arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
        4、验证app_id是否为该商户本身。
    */

    //  print_r($arr2);
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);

            //支付宝交易号
            $trade_no = htmlspecialchars($_GET['trade_no']);

            //交易金额
            $total_amount =htmlspecialchars($_GET['total_amount']);

            echo "ok";

            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——


            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";
        }

    }