- python# python:3.5 aarch64构建镜像
Ling丶落
centos
构建失败从ubuntu中尝试构建FROMpython:3.5-slimLABELMAINTAINER="
[email protected]"#installrelatedpackagesENVENVIRONMENTDOCKER_PRODWORKDIR/workCOPY./dataset.py/work/dataset.pyCOPY./model.py/work/model.pyCOPY./PyA
- Vue+Openlayers加载OSM、加载天地图
文章目录1.介绍2.加载底图2.1加载默认OSM地图2.2加载天地图1.介绍Openlayers官网:https://openlayers.org/安裝依赖:npmiol2.加载底图参考博客:vue+openlayers环境配置:https://blog.csdn.net/cuclife/article/details/126195754加载天地图:https://blog.csdn.net/we
- 【Vue.js】 Mixin 局部混入与全局混入的介绍和使用总结以及优缺点分析
生活、追梦者
vuevue.js前端javascript
1.Vue.jsMixin概述1.1Mixin的定义与作用Mixin在Vue.js中是一种灵活的组件复用机制。它允许我们将多个组件之间的共通功能抽象出来,形成一个混入对象。这样,我们就可以避免在多个组件中重复编写相同的代码,提高代码的复用性和可维护性。Mixin对象可以包含多种组件选项,如数据(data)、计算属性(computed)、方法(methods)、生命周期钩子(lifecyclehoo
- 【Android】使用ViewTreeLifecycleOwner获取Lifecycle
fundroid
KotlinAndroidAndroidLifecycleKTX
ViewTreeLifecycleOwner是什么?ViewTreeLifecycleOwner是LifecycleKTX中提供的View的一个扩展方法,可以快速地获取一个最近的Fragment或者Activity的LifecycleOwner。view.findViewTreeLifecycleOwner()实现原理?ComponentActivity通过ViewTreeLifecycleOwn
- java分析tomcat日志_tomcat日志采集
催眠神兔
java分析tomcat日志
1、采集tomcat确实比之前的需求复杂很多,我在搭建了一个tomcat的环境,然后产生如下报错先贴出来:Jan05,201710:53:35AMorg.apache.catalina.core.AprLifecycleListenerlifecycleEventINFO:TheAPRbasedApacheTomcatNativelibrarywhichallowsoptimalperforman
- jenkins maven项目构建 踩坑
奇缘志骄✘
jenkinsmaven
jenkinsmaven项目构建踩坑Nogoalshavebeenspecifiedforthisbuild.Youmustspecifyavalidlifecyclephaseoragoalintheformat:or:[:]:.Availablelifecyclephasesare:pre-clean,clean,post-clean,validate,initialize,generate-
- Python咒语大全(学习笔记与使用指南)
桑迪Sandy.Q
Pythonpython开发语言
目录字符串格式限制,%xd(整数),%x.yf(小数点浮点数)f“内容{变量}快速格式化案例1:股价预测INPUT语句案例2:INPUT登陆界面语句布尔类型函数基础运用案例3:比较运算符的运用IF语句基本格式案例4:IF语句+INPUT语句练习案例5:IFELSE语句案例6:IFELIFELSE语句案例7:猜数字小游戏案例8:IFELSE嵌套规则案例9:IFELSE嵌套(符合工龄的员工可享受旅游)
- 分享一个 Cursor mdc 生成器,基于 Gemini 2.5,很实用!
前端cursor后端
大家好,我是Immerse,一名独立开发者、内容创作者。关注公众号:#沉浸式趣谈,获取最新文章(更多内容只在公众号更新)个人网站:https://yaolifeng.com也同步更新。转载请在文章开头注明出处和版权信息。我会在这里分享关于编程、独立开发、AI干货、开源、个人思考等内容。如果本文对您有所帮助,欢迎动动小手指一键三连(点赞、评论、转发),给我一些支持和鼓励,谢谢!大部分小伙伴现在应该都
- Android Jetpack架构组件(四)之LiveData
xiangzhihong8
深入Android应用开发
一、LiveData简介LiveData是Jetpack架构组件Lifecycle库的一部分,是一个可感知生命周期的可观察容器类(Observable)。与常规的可观察类不同,LiveData具有生命周期感知能力,这意味着它具有感知应用组件(如Activity、Fragment或Service)的生命周期的能力,并且LiveData仅更新处于活跃生命周期状态的应用组件观察者。因此,LiveData
- 手车互联基本介绍
车载开发
手车互联手车互联车载应用
目前常用的手车互联功能有CarPlay,AndroidAuto,CarLife,HiCar,Carlink等,其中AndrodiAuto在国外用得比较多,国内目前是CarPlay和CarLife比较多,HiCar和Carlink是最近几年才有的,势头也很猛;本人从事车载开发10余年,参与过这些功能的开发和认证,以下从认证的角度给出难易程度,五星最难,CarPlay:☆☆☆☆☆AndroidAuto
- C#.NET Autofac 详解
c#.net
简介Autofac是一个成熟的、功能丰富的.NET依赖注入(DI)容器。相比于内置容器,它额外提供:模块化注册、装饰器(Decorator)、拦截器(Interceptor)、强o的属性/方法注入支持、基于约定的程序集扫描等特性。核心组件ContainerBuilder:用于注册服务的构建器IContainer:服务容器,负责解析依赖ILifetimeScope:生命周期作用域,管理对象生命周期M
- Vue3 Lifecycle Hooks
Vue3生命周期钩子详解Vue3的生命周期钩子分为OptionsAPI和CompositionAPI两种使用方式,核心流程相同但语法有差异。以下是完整生命周期流程和每个钩子的详细说明:CompositionAPI生命周期流程图实际参数{{count}}import{ref,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmoun
- 常见专业术语:
组织过程定义控制程序processfororganizationalprocessdefinition软件生命周期模型softwarelifecyclemodel组织标准过程集合描述descriptionoforganization'ssetofstandardprocess.组织标准过程裁剪指南tailoringguidelinefororganizationalstandardprocess过
- 雅思英语----写作观点表达(一)
dulu~dulu
雅思雅思英语笔记雅思英语写作雅思写作话题
目录(1)犯罪话题(2)压力的来源(3)人口老龄化(4)接受教育(5)房屋问题1.保护老建筑2.住房紧缺雅思写作观点用在核心段的逻辑:观点表述+举例:Itisevidentthatlivingasimplelifemakesgreatcontributionstocombatingenvironmentalchallenges.Forexample,ifpeoplechoosetospendhol
- Unity脚本--01-脚本书写规则-脚本生命周期-脚本调试-常用API
秦果
开发语言
一、脚本书写规则脚本:.cs的文本文件类文件作用:附加到游戏物体中,定义游戏对象行为指令的代码与C#类的区别:脚本只有字段和方法,没有自动属性和构造函数publicintA{get{returna;}set{a=value;}}属性定义了在unity中不会显示publicLifecycle(){Debug.Log("构造函数")//b=Time.time;}不要在脚本中写构造函数,因为不能在子线程
- 深入理解Android应用生命周期:Demo实践指南
大数据无毛兽
本文还有配套的精品资源,点击获取简介:Android应用开发中,理解Activity等组件的生命周期至关重要,它决定了应用的性能和用户体验。本文结合《第一行代码》书籍内容,为新手开发者深入讲解Android生命周期,并通过实际项目代码和配置文件(如ActivityLifeCycle.iml、build.gradle等)的解析,阐述Activity的各个状态转换和生命周期方法(如onCreate()
- Java Web项目(Extjs)报错六
iteye_8264
java数据库开发工具
1、JavaWeb项目(Extjs)报错六具体报错如下:usage:javaorg.apache.catalina.startup.Catalina[-config{pathname}][-nonaming]{-help|start|stop}2014-3-2623:27:18org.apache.catalina.core.AprLifecycleListenerinit信息:LoadedAPR
- 这款AI生成播客工具,必须收藏!
程序员前端
大家好,我是Immerse,一名独立开发者、内容创作者。关注公众号:#沉浸式趣谈,获取最新文章(更多内容只在公众号更新)个人网站:https://yaolifeng.com也同步更新。转载请在文章开头注明出处和版权信息。我会在这里分享关于编程、独立开发、AI干货、开源、个人思考等内容。如果本文对您有所帮助,欢迎动动小手指一键三连(点赞、评论、转发),给我一些支持和鼓励,谢谢!周末突然有个想法,自己
- Python中input()和条件语句if elif else的使用
海米糕
python开发语言
目录input()函数input()的基本语法input的注意事项ifelifelse条件语句基本语法:if的基本语法:双条件ifelse的语法:三目运算ifelifelse多条件语句条件语句的嵌套input和ifelse的简单综合使用input()函数首先我们要理解什么时候使用input()输入函数,其实很简单,我们需要获取用户从键盘输入的值。input()的基本语法input()的基本语法:变
- Quick BI 自定义组件开发 -- 第三篇 echart 组件开发图表,使用动态数据
≯不见猫
javascript前端react.js数据可视化echarts
文章目录一、props参数类型1.1container1.2customProps二、customProps的具体属性2.1customProps.data获取数据2.2customProps.dataConfig字段配置一、props参数类型LifecycleProps描述的是传入自定义组件各个生命周期的props参数类型。包含了container和customProps两个属性,其接口为:in
- 全面指南:Amazon RDS/Aurora MySQL 用户权限管理与性能调优
ivwdcwso
运维与云原生mysql数据库Auroraaws管理运维DBA
一、RDS/Aurora用户管理基础1.1与标准MySQL的关键区别AmazonRDS和Aurora作为托管数据库服务,在用户权限管理上有一些特殊限制:不支持的功能:--密码过期策略相关功能不可用PASSWORDEXPIREPASSWORDEXPIREINTERVAL30DAYPASSWORDEXPIRENEVERdefault_password_lifetime系统变量--权限限制SUPER权限
- 安卓JetPack篇——LifeCycle原理
GoatJun
Androidandroidandroidjetpack
LifeCycle一、什么是Lifecycle具备宿主生命周期感知能力的组件。它能持有组件(如Activity或Fragment)生命周期状态的信息,并且允许其他观察者监听宿主的状态。二、基本原理1、安卓10以下版本隐形的Fragment注入在LifecycleOwner(宿主页面)中,当Fragment感知到宿主生命周期变化时,通知LifecycleRegister进行状态修改,然后Lifecy
- 我的 Vibe Coding 的第一个项目
前端后端知识
大家好,我是Immerse,一名独立开发者、内容创作者。关注公众号:#沉浸式趣谈,获取最新文章(更多内容只在公众号更新)个人网站:https://yaolifeng.com也同步更新。转载请在文章开头注明出处和版权信息。我会在这里分享关于编程、独立开发、AI干货、开源、个人思考等内容。如果本文对您有所帮助,欢迎动动小手指一键三连(点赞、评论、转发),给我一些支持和鼓励,谢谢!作为一名开发者,大家都
- 资源管理新视角:利用 FastAPI Lifespan 事件优化你的应用II
黑金IT
fastapifastapiAI编程python
本文说明在FastAPI应用程序中使用lifespan事件来管理资源的加载和卸载。lifespan事件允许你在应用启动时执行一些初始化代码,并在应用关闭时执行一些清理代码。这是通过使用异步上下文管理器实现的,具体来说,是通过asynccontextmanager装饰器创建一个异步生成器函数。#导入asynccontextmanager用于创建异步上下文管理器fromcontextlibimport
- tortoise-orm在fastapi的lifespan中访问数据库表时报for r in self._routers:TypeError: ‘NoneType‘ object is not it
waketzheng
fastapipython
解决:升级tortoise-orm到0.21.1以上版本,或使用github上的待发布版poetryadd'tortoise-orm>=0.21.1'||poetryadd'git+https://github.com/tortoise/tortoise-orm.git'或直接pip安装https://pip.pypa.io/en/stable/cli/pip_install/#examplesp
- springboot的后端处理HTML的页面请求
下面是一个完整的SpringBoot后端示例,用于接收提交的文件上传请求(/article/uploadLifeImage接口),并将上传的文件保存到本地目录。✅一、项目结构upload-demo/├──src/│└──main/│├──java/com/example/uploaddemo/││├──UploadDemoApplication.java││└──controller/Upload
- 用 py-spy 对 python 程序进行性能监控,并优化
python性能优化性能监控
py-spy安装#pipinstallpy-spy-ihttps://mirrors.aliyun.com/pypi/simple/输出sh-4.2#pipinstallpy-spy-ihttps://mirrors.aliyun.com/pypi/simple/DEPRECATION:Python2.7reachedtheendofitslifeonJanuary1st,2020.Pleaseu
- 微信小程序canvas实现抽奖动画
小糊涂加油
微信小程序小程序
本来想用setdata做抽奖动画的,但是存在合并更新以及性能问题,遂采用canvas的形式。参考了一篇blog,然后加了些抽奖逻辑的改动import{getRandomInt}from"../../utils/util";//components/names/names.tsComponent({lifetimes:{attached(){this.createSelectorQuery().se
- 安全开发详解
wespten
网络安全AI+渗透测试代码审计等保全栈网络安全开发安全
安全开发流程,能够帮助企业以最小的成本提高产品的安全性。它符合“SecureattheSource”的战略思想。实施好安全开发流程,对企业安全的发展来说,可以起到事半功倍的效果。1、SDL简介SDL的全称是SecurityDevelopmentLifecycle,即:安全开发生命周期。它是由微软最早提出的,在软件工程中实施,是帮助解决软件安全问题的办法。SDL是一个安全保证的过程,其重点是软件开发
- Vue3 + TypeScript 生命周期钩子使用错误解析 onMounted is called when there is no active component instance to be
BillKu
typescript前端vue.js
[Vuewarn]:onMountediscalledwhenthereisnoactivecomponentinstancetobeassociatedwith.LifecycleinjectionAPIscanonlybeusedduringexecutionofsetup().Ifyouareusingasyncsetup(),makesuretoregisterlifecyclehooks
- mondb入手
木zi_鸣
mongodb
windows 启动mongodb 编写bat文件,
mongod --dbpath D:\software\MongoDBDATA
mongod --help 查询各种配置
配置在mongob
打开批处理,即可启动,27017原生端口,shell操作监控端口 扩展28017,web端操作端口
启动配置文件配置,
数据更灵活 
- 大型高并发高负载网站的系统架构
bijian1013
高并发负载均衡
扩展Web应用程序
一.概念
简单的来说,如果一个系统可扩展,那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集,并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种:
1.
- DISPLAY变量和xhost(原创)
czmmiao
display
DISPLAY
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0
- 获取B/S客户端IP
周凡杨
java编程jspWeb浏览器
最近想写个B/S架构的聊天系统,因为以前做过C/S架构的QQ聊天系统,所以对于Socket通信编程只是一个巩固。对于C/S架构的聊天系统,由于存在客户端Java应用,所以直接在代码中获取客户端的IP,应用的方法为:
String ip = InetAddress.getLocalHost().getHostAddress();
然而对于WEB
- 浅谈类和对象
朱辉辉33
编程
类是对一类事物的总称,对象是描述一个物体的特征,类是对象的抽象。简单来说,类是抽象的,不占用内存,对象是具体的,
占用存储空间。
类是由属性和方法构成的,基本格式是public class 类名{
//定义属性
private/public 数据类型 属性名;
//定义方法
publ
- android activity与viewpager+fragment的生命周期问题
肆无忌惮_
viewpager
有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。
第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。
super.onResume();
bindService(intent, conn, BIND_AUTO_CREATE);
- base64Encode对图片进行编码
843977358
base64图片encoder
/**
* 对图片进行base64encoder编码
*
* @author mrZhang
* @param path
* @return
*/
public static String encodeImage(String path) {
BASE64Encoder encoder = null;
byte[] b = null;
I
- Request Header简介
aigo
servlet
当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request Header) 用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:
- HttpClient4.3 创建SSL协议的HttpClient对象
alleni123
httpclient爬虫ssl
public class HttpClientUtils
{
public static CloseableHttpClient createSSLClientDefault(CookieStore cookies){
SSLContext sslContext=null;
try
{
sslContext=new SSLContextBuilder().l
- java取反 -右移-左移-无符号右移的探讨
百合不是茶
位运算符 位移
取反:
在二进制中第一位,1表示符数,0表示正数
byte a = -1;
原码:10000001
反码:11111110
补码:11111111
//异或: 00000000
byte b = -2;
原码:10000010
反码:11111101
补码:11111110
//异或: 00000001
- java多线程join的作用与用法
bijian1013
java多线程
对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means t
- Java发送http请求(get 与post方法请求)
bijian1013
javaspring
PostRequest.java
package com.bijian.study;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURL
- 【Struts2二】struts.xml中package下的action配置项默认值
bit1129
struts.xml
在第一部份,定义了struts.xml文件,如下所示:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts
- 【Kafka十三】Kafka Simple Consumer
bit1129
simple
代码中关于Host和Port是割裂开的,这会导致单机环境下的伪分布式Kafka集群环境下,这个例子没法运行。
实际情况是需要将host和port绑定到一起,
package kafka.examples.lowlevel;
import kafka.api.FetchRequest;
import kafka.api.FetchRequestBuilder;
impo
- nodejs学习api
ronin47
nodejs api
NodeJS基础 什么是NodeJS
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了docum
- java-64.寻找第N个丑数
bylijinnan
java
public class UglyNumber {
/**
* 64.查找第N个丑数
具体思路可参考 [url] http://zhedahht.blog.163.com/blog/static/2541117420094245366965/[/url]
*
题目:我们把只包含因子
2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14
- 二维数组(矩阵)对角线输出
bylijinnan
二维数组
/**
二维数组 对角线输出 两个方向
例如对于数组:
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 },
slash方向输出:
1
5 2
9 6 3
13 10 7 4
14 11 8
15 12
16
backslash输出:
4
3
- [JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新)
comsci
工作流
既然是做开源软件的,我们的宗旨就是给大家分享设计和代码,那么现在我就用很简单扼要的语言来透露这个跳跃模式的设计原理
大家如果用过JWFD的ARC-自动运行控制器,或者看过代码,应该知道在ARC算法模块中有一个函数叫做SAN(),这个函数就是ARC的核心控制器,要实现跳跃模式,在SAN函数中一定要对LN链表数据结构进行操作,首先写一段代码,把
- redis常见使用
cuityang
redis常见使用
redis 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
引入jar包 jedis-2.1.0.jar (本文下方提供下载)
package redistest;
import redis.clients.jedis.Jedis;
public class Listtest
- 配置多个redis
dalan_123
redis
配置多个redis客户端
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo
- attrib命令
dcj3sjt126com
attr
attrib指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统.
只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的写保护.
存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件.
- Yii使用公共函数
dcj3sjt126com
yii
在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便。 在入口文件index.php里添加 require_once('protected/function.php'); 即可对其引用,成为公用的函数集合。 function.php如下:
<?php /** * This is the shortcut to D
- linux 系统资源的查看(free、uname、uptime、netstat)
eksliang
netstatlinux unamelinux uptimelinux free
linux 系统资源的查看
转载请出自出处:http://eksliang.iteye.com/blog/2167081
http://eksliang.iteye.com 一、free查看内存的使用情况
语法如下:
free [-b][-k][-m][-g] [-t]
参数含义
-b:直接输入free时,显示的单位是kb我们可以使用b(bytes),m
- JAVA的位操作符
greemranqq
位运算JAVA位移<<>>>
最近几种进制,加上各种位操作符,发现都比较模糊,不能完全掌握,这里就再熟悉熟悉。
1.按位操作符 :
按位操作符是用来操作基本数据类型中的单个bit,即二进制位,会对两个参数执行布尔代数运算,获得结果。
与(&)运算:
1&1 = 1, 1&0 = 0, 0&0 &
- Web前段学习网站
ihuning
Web
Web前段学习网站
菜鸟学习:http://www.w3cschool.cc/
JQuery中文网:http://www.jquerycn.cn/
内存溢出:http://outofmemory.cn/#csdn.blog
http://www.icoolxue.com/
http://www.jikexue
- 强强联合:FluxBB 作者加盟 Flarum
justjavac
r
原文:FluxBB Joins Forces With Flarum作者:Toby Zerner译文:强强联合:FluxBB 作者加盟 Flarum译者:justjavac
FluxBB 是一个快速、轻量级论坛软件,它的开发者是一名德国的 PHP 天才 Franz Liedke。FluxBB 的下一个版本(2.0)将被完全重写,并已经开发了一段时间。FluxBB 看起来非常有前途的,
- java统计在线人数(session存储信息的)
macroli
javaWeb
这篇日志是我写的第三次了 前两次都发布失败!郁闷极了!
由于在web开发中常常用到这一部分所以在此记录一下,呵呵,就到备忘录了!
我对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。
1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。
public class Ses
- bootstrp carousel初体验 快速构建图片播放
qiaolevip
每天进步一点点学习永无止境bootstrap纵观千象
img{
border: 1px solid white;
box-shadow: 2px 2px 12px #333;
_width: expression(this.width > 600 ? "600px" : this.width + "px");
_height: expression(this.width &
- SparkSQL读取HBase数据,通过自定义外部数据源
superlxw1234
sparksparksqlsparksql读取hbasesparksql外部数据源
关键字:SparkSQL读取HBase、SparkSQL自定义外部数据源
前面文章介绍了SparSQL通过Hive操作HBase表。
SparkSQL从1.2开始支持自定义外部数据源(External DataSource),这样就可以通过API接口来实现自己的外部数据源。这里基于Spark1.4.0,简单介绍SparkSQL自定义外部数据源,访
- Spring Boot 1.3.0.M1发布
wiselyman
spring boot
Spring Boot 1.3.0.M1于6.12日发布,现在可以从Spring milestone repository下载。这个版本是基于Spring Framework 4.2.0.RC1,并在Spring Boot 1.2之上提供了大量的新特性improvements and new features。主要包含以下:
1.提供一个新的sprin