- Laravel 用户授权 policy
CaptainRoy
应用场景:比如一个用户创建一篇文章,或者对文章进行修改,这个时候就要对其进行认证,是否有权进行修改或创建.用户表:users表id;文章表:posts表对应user_id1.phpartisanmake:policyPostPolicy生成策略,生成的策略将放置在app/Policies目录2.在PostPolicy里面添加需要增加的权限,比如用户修改,删除权限,判断当前用户的id和要修改的文章用
- docker部署snipe-it资产管理系统
野猪!林霸主来了!快趴下!
docker容器运维
Snipe-IT是一个基于Laravel构建的免费开源(FOSS)项目,主要能够跟踪谁拥有哪台笔记本电脑、购买时间、可用的软件许可证和附件等1.docker服务和docker-compose使用pip方式安装docker-compose_pip安装docker-compose-CSDN博客https://blog.csdn.net/baidu_35848778/article/details/12
- 【Laravel】关于Laravel8的session与Redis连接的问题
e1373773
Laravellaravelredisphp
1.安装predis包,也可以选择其他包,如phpredis。composerrequirepredis/predis2.配置config\database.php文件,添加session连接配置。'redis'=>['client'=>env('REDIS_CLIENT','predis'),//['cluster'=>env('REDIS_CLUSTER','redis'),'prefix'=
- 释放Laravel Blade的威力:掌握Laravel的模板引擎
2401_85812026
laravelphp
释放LaravelBlade的威力:掌握Laravel的模板引擎Laravel框架以其优雅和简洁的代码而闻名,其中Blade模板引擎是其核心组件之一。Blade不仅提供了强大的模板功能,还允许开发者以一种简单直观的方式编写视图。本文将带你深入了解如何在Laravel中使用Blade模板引擎,让你的应用开发更加高效。一、Blade模板引擎概述Blade是Laravel的内置模板引擎,它让你的前端代码
- php laravel 微服务,Laravel 如何设计微服务架构,及如何进行微服务间沟通?
weixin_39588084
phplaravel微服务
如题,我目前有需要用Laravel设计微服务架构的需求,但能找到的相关资料不多目前已有的一个思考方向是使用K8S统合各个独立的Laravel小服务,再开放统一对外的APIGateway但碰到一个问题是各个服务间要如何在不发生耦合的状况下沟通举例来说:订单发生后需要减少库存,若库存成功扣除后要再告诉订单更新状态我目前想到三种解决方式:在APIGateway处理流程问题,等订单服务回传成功后,再呼叫库
- 使用 Kubernetes 来部署你的 Laravel 程序
weixin_34247155
php运维git
Laravel是开发PHP应用程序的优秀框架。无论您是需要构建新想法的原型,开发MVP(最小可行产品)还是发布成熟的企业系统,Laravel都可以促进所有开发任务和工作流程。如何处理部署应用程序是一个很有选择性的问题。Vagrant非常适合搭建类似于远程服务器的本地环境。但是,在生产环境中,您很可能需要的不仅仅是一个Web主机和一个数据库。您可能会针对多个要求提供单独的服务。您还需要有适当的机制来
- K8s部署PHP项目
寻找09之夏
Kuberneteskuberneteslaravelphp
前言前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RU
- 如何在 Kubernetes 上快速部署 Python 和 Laravel 应用:一站式 DevOps 集成指南
数字沉思
效率工具运维系统架构kubernetespythonlaravel
如何在Kubernetes上快速部署Python和Laravel应用:一站式DevOps集成指南在当今快速发展的技术环境中,应用的快速迭代和稳定运行是每个开发团队的核心需求。随着Kubernetes(K8s)的广泛应用,容器化和自动化部署已成为最佳实践。那么,如何将你的Python脚本和Laravel应用快速部署到Kubernetes上,并集成DevOps流程呢?本文将为你提供一站式指南,从基础设
- 标题:重构传统电商:Moa - 融合Angular与Magento的新一代框架
伍辰惟
标题:重构传统电商:Moa-融合Angular与Magento的新一代框架1、项目介绍Moa是一款创新的开源项目,它将传统的Magento商店带入了新时代。这个框架采用AngularJS前端和Laravel后端API,旨在解决Magento在单元测试、配置优先原则、Prototype.js使用以及未经过测试的第三方模块等方面的问题。Moa的设计目标是提高性能、可维护性和用户体验,为电子商务提供更现
- Laravel-swoole扩展包的使用
周星星的学习笔记
如何在Laravel简单快速地使用swoole呢?下面就简单给大家介绍一下。Github地址:https://github.com/swooletw/laravel-swoole。一、确认PHP安装了swoole扩展/var/www/html/backend#php-m|grepswooleswoole二、进入Laravel工程中,安装Laravel-swoole扩展#首先进入到你的Laravel
- laravel ApiResponse接口统一响应封装
一只路人甲
laravellaravelphp
一,新增接口返回码配置文件在config中新增配置文件apicode.php[/***@Message("OK")*对成功的GET、PUT、PATCH或DELETE操作进行响应。也可以被用在不创建新资源的POST操作上*/'HTTP_OK'=>200,/***@Message("Created")*对创建新资源的POST操作进行响应。应该带着指向新资源地址的Location头*/'CREATED'
- 推荐超好用的 6 款 Laravel Admin 管理模版
码匠官方账号
低代码前端后端laravel
全文3440字阅读时间约11分钟目录LaravelAdmin管理后台模板的不同类型脚手架CRUD可视化编程主题和组件库付费/开源码匠LaravelAdmin管理后台模板推荐LaravelNovaOrchidBackpackVoyagerInfyOmLaravelGeneratorArgon写在最后如果您正在为您的企业调研开发Admin管理后台的最佳方案,那么基于PHP的Laravel框架会是一个不
- Laravel01 课程介绍以及Laravel环境搭建
boy快快长大
PHPlaravelphp
Laravel01课程介绍1.Laravel2.mac开发环境搭建(通过Homebrew)3.创建一个项目1.Laravel公司中面临着PHP项目与Java项目并行,所以需要我写PHP的项目,公司用的框架就是Laravel,所以在B站上找了一门课学习。课程地址2.mac开发环境搭建(通过Homebrew)安装composer安装composer国内源https://pkg.xyz/php-r"co
- 通过 Laravel 创建一个 Vue 单页面应用(三)
summerbluet
image文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34304我们将通过演示在vue-router进入一个路由之前,如何异步加载数据来继续使用Laravel构建我们的VueSPA。之前在通过Laravel创建一个Vue单页应用(二)中完成了UsersIndex组件异步地从API中加载用户。简化了从数据库构建一个真实的后端API,
- 记一次PHP并发性能调优实战 -- 性能提升104%
PHP9年架构师
适合阅读人群文中的调优思路无论是php,java,还是其他任何语言都是用.如果你有php使用经验,那肯定就更好了业务背景框架及相应环境laravel5.7,mysql5.7,redis5,nginx1.15centos7.5bbrdocker,docker-compose阿里云4C和8G问题背景php已经开启opcache,laravel也运行了optimize命令进行优化,composer也进行
- 从零开始建立一个Composer项目
kami1983
简介移植好的FEApi类库,需要打包发布到composer顺便记录一下。建立项目首先申请GitHub项目空间,这个不赘述了,我这里的项目空间是,https://github.com/kami1983/jk-laravel-feapi然后将git库clone到本地,建立develop分支,不赘述了:image.png修改vim.gitignore添加如下内容:composer.phar/vendor
- Let’ s Encrypt 现支持通配符的 HTTPS 认证
summerbluet
image.pngLet'sEncrypt发布公告称,本周新的ACME2(AutomatedCertificateManagementEnvironment自动证书环境管理)协议将支持通配符证书!去年我们写了免费的通配符公告,现在非常高兴看到这个功能发布。什么是通配符证书通配符证书是指,一个指定域名的证书,可以用于当前域名的下的全部子域名。例如使用*.laravel-news.com申请通配符域名
- Laravel mix样式美化
__o__o
在开始使用Mix之前,必须先确保你的机器上安装了Node.js和NPM。node-vnpm-vLaravelMix然后就只需要安装LaravelMix。在新的Laravel项目中,你可以在目录结构的根目录中找到一个package.json文件,它包括了运行基本的Mix所需的内容。就如同composer.json文件,只不过它定义的是Node的依赖而不是PHP。你可以使用以下的命令安装它引用的依赖项
- laravel数据填充异常
Krunner_坤少
phpartisandb:seed--class=RoomSeederIlluminate\Contracts\Container\BindingResolutionExceptionTargetclass[RoomSeeder]doesnotexist.atvendor/laravel/framework/src/Illuminate/Container/Container.php:807803
- CVE-2022-25487 漏洞复现
Jay 17
CVE复现漏洞复现CVEWeb安全网络安全PHPCVE-2022-25487
漏洞描述:AtomCMS2.0版本存在远程代码执行漏洞,该漏洞源于/admin/uploads.php未能正确过滤构造代码段的特殊元素。攻击者可利用该漏洞导致任意代码执行。其实这就是一个文件上传漏洞罢了。。。。打开之后,/home路由是个空白信息搜集:该cms有默认邮箱/密码
[email protected]/password,到/admin路由下尝试登录。Users下有个上传文件功能,可能是上传头像用的
- 新公司初感
成长开发者
在新公司一大感受,是做项目抓住客户核心需求,其他需求怎么简单就怎么实现,最后达到快速交付。使用laravel框架,真的是座宝藏。里面很多高效便捷的方法,还需要多多看。
- Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)
拉莫帅
开发技巧图片android数码相机程序人生
前言在项目研发中,相信大家都遇到过给用户增加头像照片的需求。随着手机版本的不断更新,android8、android9、android10、android12、android13、鸿蒙系统等等;遇到这个功能需求,大家肯定会想,“这还不好写?之前就已经写过了。”把老项目跑了一遍之后发现无法运行。要不大多数就会出现奔溃的情况!这也就遇到常见的高版本适配情况,以及针对不同版本该如何处理?碰到这种情况也不
- 【Django】Django文件上传
南歌EuanSu
djangopython后端
文件上传1定义&场景定义:用户可以通过浏览器将图片等文件上传至网站。场景:用户上传头像。上传流程性的文档[pdf,txt等]2上传规范-前端[html]文件上传必须为POST提交方式表单中文件上传时必须带有enctype="multipart/form-data"时才会包含文件内容数据。表单中用标签上传文件。3上传规范-后端[Django]视图函数中,用request.FILES取文件框的内容fi
- laravel 中模糊查询后通过 appends 添加参数实现分页
curioust
控制器方法代码publicfunctionindex(Request$request){//明白了明白了,为什么要使用appends把参数配置上//$request->input取得是url参数的值,把参数拼进去。再点击下一页的时候就链接跳转进入控制器处理,就可以获取到查询条件了。//获取到文本域输入的值$selects=$request->input('selects');$students=S
- laravel-admin 上传图片报错Disk [admin] not configured, please add a disk config in `config/filesystems....
米粒_hh
后台用户设置图片上传报错Disk[admin]notconfigured,pleaseaddadiskconfigin`config/filesystems.php`原因是config/filesystems.php下没有配置admin项目的文件上传相关设置解决办法:在filesystems.php下添加代码admin'=>['driver'=>'local','root'=>public_pat
- 微信公众号接入,关注/取消微信公众号,laravel框架版
Zero_200
微信公众号文档文档中验证消息来自微信服务器,按照文档来写privatefunctioncheckSignature(){$signature=$_GET["signature"];$timestamp=$_GET["timestamp"];$nonce=$_GET["nonce"];$token=TOKEN;$tmpArr=array($token,$timestamp,$nonce);sort(
- element-ui解决上传文件时需要携带请求数据的问题
小钱c7
vueelementui前端
一、问题描述在前端使用element-ui进行文件上传时,需要携带请求头信息,比如Token。二、问题解决1.表单实现action置空添加:http-request属性覆盖默认的上传行为,实现自定义上传文件。注意:src后的图片路径如果是个网络请求(外链),那么在前面拼接//即可,否则会出现localhost:8080/外链的奇葩问题。点击上传头像,只能上传jpg/png文件,且不超过1mb2.j
- 错误与日志
carter记录
1.Debug模式进行本地开发时,应该配置APP_DEBUG的环境变量为true。在线上环境,这个值设置为false.2.日志存储默认情况下,Laravel支持日志方法single,daily,syslog和errorlog。如果你想要日志文件按日生成而不是生成单个文件,应该在配置文件config/app.php中设置log值如下:'log'=>'daily'即:'log'=>env('APP_L
- 分享一组比 laravel 调度事件中 AppendOutputTo 方法更为便捷的宏方法
phplaravel
分享一组比laravel调度事件中AppendOutputTo方法更为便捷的宏方法特性默认根据命令名称自动生成输出日志文件路径默认输出日志文件路径格式为storage/logs/schedules/命令名称/命令名称.log由single渠道日志自动记录命令运行的开始运行时间,这样就会形成laravel标准的日志文件,可以更好的由第三方扩展去解析查看,例如opcodesio/log-viewer更
- Laravel独立验证器(表单请求)用例大全
表单请求(FormRequest)独立验证类完整例子created_at);if((time()-$registerTimestamp)all()*/publicfunctionvalidationData(){return['title'=>'不像我只会心疼哥哥','content'=>'哥哥,你女朋友要是知道我俩吃同一个棒棒糖,你女朋友不会吃醋吧!','password'=>'88888888
- 对于规范和实现,你会混淆吗?
yangshangchuan
HotSpot
昨晚和朋友聊天,喝了点咖啡,由于我经常喝茶,很长时间没喝咖啡了,所以失眠了,于是起床读JVM规范,读完后在朋友圈发了一条信息:
JVM Run-Time Data Areas:The Java Virtual Machine defines various run-time data areas that are used during execution of a program. So
- android 网络
百合不是茶
网络
android的网络编程和java的一样没什么好分析的都是一些死的照着写就可以了,所以记录下来 方便查找 , 服务器使用的是TomCat
服务器代码; servlet的使用需要在xml中注册
package servlet;
import java.io.IOException;
import java.util.Arr
- [读书笔记]读法拉第传
comsci
读书笔记
1831年的时候,一年可以赚到1000英镑的人..应该很少的...
要成为一个科学家,没有足够的资金支持,很多实验都无法完成
但是当钱赚够了以后....就不能够一直在商业和市场中徘徊......
- 随机数的产生
沐刃青蛟
随机数
c++中阐述随机数的方法有两种:
一是产生假随机数(不管操作多少次,所产生的数都不会改变)
这类随机数是使用了默认的种子值产生的,所以每次都是一样的。
//默认种子
for (int i = 0; i < 5; i++)
{
cout<<
- PHP检测函数所在的文件名
IT独行者
PHP函数
很简单的功能,用到PHP中的反射机制,具体使用的是ReflectionFunction类,可以获取指定函数所在PHP脚本中的具体位置。 创建引用脚本。
代码:
[php]
view plain
copy
// Filename: functions.php
<?php&nbs
- 银行各系统功能简介
文强chu
金融
银行各系统功能简介 业务系统 核心业务系统 业务功能包括:总账管理、卡系统管理、客户信息管理、额度控管、存款、贷款、资金业务、国际结算、支付结算、对外接口等 清分清算系统 以清算日期为准,将账务类交易、非账务类交易的手续费、代理费、网络服务费等相关费用,按费用类型计算应收、应付金额,经过清算人员确认后上送核心系统完成结算的过程 国际结算系
- Python学习1(pip django 安装以及第一个project)
小桔子
pythondjangopip
最近开始学习python,要安装个pip的工具。听说这个工具很强大,安装了它,在安装第三方工具的话so easy!然后也下载了,按照别人给的教程开始安装,奶奶的怎么也安装不上!
第一步:官方下载pip-1.5.6.tar.gz, https://pypi.python.org/pypi/pip easy!
第二部:解压这个压缩文件,会看到一个setup.p
- php 数组
aichenglong
PHP排序数组循环多维数组
1 php中的创建数组
$product = array('tires','oil','spark');//array()实际上是语言结构而不 是函数
2 如果需要创建一个升序的排列的数字保存在一个数组中,可以使用range()函数来自动创建数组
$numbers=range(1,10)//1 2 3 4 5 6 7 8 9 10
$numbers=range(1,10,
- 安装python2.7
AILIKES
python
安装python2.7
1、下载可从 http://www.python.org/进行下载#wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
2、复制解压
#mkdir -p /opt/usr/python
#cp /opt/soft/Python-2
- java异常的处理探讨
百合不是茶
JAVA异常
//java异常
/*
1,了解java 中的异常处理机制,有三种操作
a,声明异常
b,抛出异常
c,捕获异常
2,学会使用try-catch-finally来处理异常
3,学会如何声明异常和抛出异常
4,学会创建自己的异常
*/
//2,学会使用try-catch-finally来处理异常
- getElementsByName实例
bijian1013
element
实例1:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/x
- 探索JUnit4扩展:Runner
bijian1013
java单元测试JUnit
参加敏捷培训时,教练提到Junit4的Runner和Rule,于是特上网查一下,发现很多都讲的太理论,或者是举的例子实在是太牵强。多搜索了几下,搜索到两篇我觉得写的非常好的文章。
文章地址:http://www.blogjava.net/jiangshachina/archive/20
- [MongoDB学习笔记二]MongoDB副本集
bit1129
mongodb
1. 副本集的特性
1)一台主服务器(Primary),多台从服务器(Secondary)
2)Primary挂了之后,从服务器自动完成从它们之中选举一台服务器作为主服务器,继续工作,这就解决了单点故障,因此,在这种情况下,MongoDB集群能够继续工作
3)挂了的主服务器恢复到集群中只能以Secondary服务器的角色加入进来
2
- 【Spark八十一】Hive in the spark assembly
bit1129
assembly
Spark SQL supports most commonly used features of HiveQL. However, different HiveQL statements are executed in different manners:
1. DDL statements (e.g. CREATE TABLE, DROP TABLE, etc.)
- Nginx问题定位之监控进程异常退出
ronin47
nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧。
1. 在error.log中查看是否有signal项,如果有,看看signal是多少。
比如,这是一个异常退出的情况:
$grep signal error.log
2012/12/24 16:39:56 [alert] 13661#0: worker process 13666 exited on s
- No grammar constraints (DTD or XML schema).....两种解决方法
byalias
xml
方法一:常用方法 关闭XML验证
工具栏:windows => preferences => xml => xml files => validation => Indicate when no grammar is specified:选择Ignore即可。
方法二:(个人推荐)
添加 内容如下
<?xml version=
- Netty源码学习-DefaultChannelPipeline
bylijinnan
netty
package com.ljn.channel;
/**
* ChannelPipeline采用的是Intercepting Filter 模式
* 但由于用到两个双向链表和内部类,这个模式看起来不是那么明显,需要仔细查看调用过程才发现
*
* 下面对ChannelPipeline作一个模拟,只模拟关键代码:
*/
public class Pipeline {
- MYSQL数据库常用备份及恢复语句
chicony
mysql
备份MySQL数据库的命令,可以加选不同的参数选项来实现不同格式的要求。
mysqldump -h主机 -u用户名 -p密码 数据库名 > 文件
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
mysqldump -–add-drop-table -uusername -ppassword databasename > ba
- 小白谈谈云计算--基于Google三大论文
CrazyMizzz
Google云计算GFS
之前在没有接触到云计算之前,只是对云计算有一点点模糊的概念,觉得这是一个很高大上的东西,似乎离我们大一的还很远。后来有机会上了一节云计算的普及课程吧,并且在之前的一周里拜读了谷歌三大论文。不敢说理解,至少囫囵吞枣啃下了一大堆看不明白的理论。现在就简单聊聊我对于云计算的了解。
我先说说GFS
&n
- hadoop 平衡空间设置方法
daizj
hadoopbalancer
在hdfs-site.xml中增加设置balance的带宽,默认只有1M:
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
<description&g
- Eclipse程序员要掌握的常用快捷键
dcj3sjt126com
编程
判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。 曾有人在豆瓣评
《卓有成效的程序员》:“人有多大懒,才有多大闲”。之前我整理了一个
程序员图书列表,目的也就是通过读书,让程序员变懒。 程序员作为特殊的群体,有的人可以这么懒,懒到事情都交给机器去做,而有的人又可以那么勤奋,每天都孜孜不倦得
- Android学习之路
dcj3sjt126com
Android学习
转自:http://blog.csdn.net/ryantang03/article/details/6901459
以前有J2EE基础,接触JAVA也有两三年的时间了,上手Android并不困难,思维上稍微转变一下就可以很快适应。以前做的都是WEB项目,现今体验移动终端项目,让我越来越觉得移动互联网应用是未来的主宰。
下面说说我学习Android的感受,我学Android首先是看MARS的视
- java 遍历Map的四种方法
eksliang
javaHashMapjava 遍历Map的四种方法
转载请出自出处:
http://eksliang.iteye.com/blog/2059996
package com.ickes;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
* 遍历Map的四种方式
- 【精典】数据库相关相关
gengzg
数据库
package C3P0;
import java.sql.Connection;
import java.sql.SQLException;
import java.beans.PropertyVetoException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBPool{
- 自动补全
huyana_town
自动补全
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml&quo
- jquery在线预览PDF文件,打开PDF文件
天梯梦
jquery
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。
核心代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.
- ViewPager刷新单个页面的方法
lovelease
androidviewpagertag刷新
使用ViewPager做滑动切换图片的效果时,如果图片是从网络下载的,那么再子线程中下载完图片时我们会使用handler通知UI线程,然后UI线程就可以调用mViewPager.getAdapter().notifyDataSetChanged()进行页面的刷新,但是viewpager不同于listview,你会发现单纯的调用notifyDataSetChanged()并不能刷新页面
- 利用按位取反(~)从复合枚举值里清除枚举值
草料场
enum
以 C# 中的 System.Drawing.FontStyle 为例。
如果需要同时有多种效果,
如:“粗体”和“下划线”的效果,可以用按位或(|)
FontStyle style = FontStyle.Bold | FontStyle.Underline;
如果需要去除 style 里的某一种效果,
- Linux系统新手学习的11点建议
刘星宇
编程工作linux脚本
随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。这里介绍学习Linux的一些建议。
一、从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linu
- hibernate dao层应用之HibernateDaoSupport二次封装
wangzhezichuan
DAOHibernate
/**
* <p>方法描述:sql语句查询 返回List<Class> </p>
* <p>方法备注: Class 只能是自定义类 </p>
* @param calzz
* @param sql
* @return
* <p>创建人:王川</p>
* <p>创建时间:Jul