- 小麦子的ScalersTalk第四轮新概念朗读持续力训练Day66 20121212
小麦_3982
练习材料:Lesson66Sweetashoney!In1963aLancasterbombercrashedonWallisIsland,aremoteplaceintheSouthPacific,alongwaywestofSamoa.Theplanewasn'ttoobadlydamaged,butovertheyears,thecrashwasforgottenandthewreckrem
- Crash Course:10分钟心理学速成-【第27集】情绪,压力与健康
ado_l
链接:https://open.163.com/newview/movie/courseintro?newurl=%2Fspecial%2Fopencourse%2Fcrashcoursepsychology.html重点1、情绪情绪并不仅仅只是一个心理现象,因为很多情绪都具有一定的感染力,而由此引发我们的感受和行为,也会影响思维、身体和身心健康。2、面部表情情绪专家保罗·艾克曼认为面部表情具有跨
- 基于开源CrashRpt与微软开源Detours技术深度改造的异常捕获库分享
dvlinker
C/C++实战专栏异常捕获开源异常捕获库CrashRptCrashPaddump文件Windbg
目录1、异常捕获模块概述2、为什么需要异常捕获模块?3、在有些异常的场景下是没有生成dump文件的4、开源异常捕获库CrashRpt介绍5、对开源库CrashRpt的改进C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931
- 利用Core Dump调试程序
QuietHeart
描述这里介绍Linux环境下使用gdb结合coredump文件进行程序的调试和定位。简介当用户程序运行,可能会由于某些原因发生崩溃(crash),这个时候可以产生一个CoreDump文件,记录程序发生崩溃时候内存的运行状况。这个CoreDump文件,一般名称为core或者core.pid(pid就是应用程序运行时候的pid号),它可以帮助我们找出程序崩溃的原因。对于一个运行出错的程序,我们可以有多
- 华为APP UI自动化测试岗面试真题,真实面试经历。
自动化测试君
自动化测试接口测试软件测试ui面试职场和发展经验分享软件测试
1.AndroidAPP内存不足时,如何获得内存?系统优先结束被挂起(暂停)的进程,释放内存。2.APP测试常见问题有哪些?原因有哪些?常见的有crash、ANR(应用无响应、卡死),一般由设备碎片化、网络波动大、内存泄漏、代码编写错误。3.APP自动化测试工具开放性问题,带点主观意见:对比其他熟悉的自动化工具的优缺点;自动化的简要方案(简要的同时关键内容请具体)。4.Android与web测试区
- Python + Playwright(19):监听事件 & 移除监听事件「详细介绍」
blues_C
Python+Playwrightpython软件测试自动化测试playwright测试工具
Python+Playwright(19):监听事件&移除监听事件前言一、监听事件1.1`close`-页面关闭事件1.2`console`-控制台消息事件1.3`crash`-页面崩溃事件1.4`dialog`-对话框事件1.5`domcontentloaded`-DOM内容加载事件1.6`download`-下载事件1.7`filechooser`-文件选择器事件1.8`frameattach
- Python学习笔记36:进阶篇(二十五)pygame的使用之事件监听控制切歌和暂停,继续播放
明月望秋思
学习pythonpygamepython学习
前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,领取pythoncrashcourse中文版PDF。pygamePygame是一个开源的Python多媒体开发
- android开发浅谈之configChanges理解
hfreeman2008
android浅谈系统androidconfigChanges
问题手上有一个问题,光大银行应用的界面大小屏转换,configuration改变后会重启,但是重启后界面就会crash。这个是可以看到的enents日志configuration_changed:536874240am_relaunch_resume_activity:[0,27273074,89,com.cebbank.mobile.cemb/.ui.activity.HomeActivity反
- Immersive art
俗世尘沙
Achangeinhowpeopleconsumecontemporaryartisunderway人们消费当代艺术的方式正在发生变化Acrossallfourwallsofavasthall,VincentvanGogh'sblueirisesbegintosway.Theybloomgentlyatfirst,thenmoreviolently,asthemusicbuildstoacrash
- 环境配置的相关问题
月亮月亮要去太阳
python
一、shap安装踩坑遇到错误:AmodulethatwascompiledusingNumPy1.xcannotberuninNumPy2.0.0asitmaycrash.Tosupportboth1.xand2.xversionsofNumPy,modulesmustbecompiledwithNumPy2.0.Somemodulemayneedtorebuildinsteade.g.with'
- UE5打包iOS运行查看Crash日志
tangfuling1991
UE4移动端AndroidiOS入门ue5iosCrash
1、查看Crash1、通过xCode打开设备2、选择APP打开最近的日志3、选择崩溃时间点对应的日志4、选择对应的工程打开5、就能看到对应的Crash日志2、为了防止Crash写代码需要注意1、UObject在RemoveFromRoot之前先判断是否Rootif(SelectedImage&&SelectedImage->IsRooted()){SelectedImage->RemoveFrom
- python 命令行运行没问题,打包后运行crash
FateOfKing
检查是否使用了wx.lib.pubsubwx.lib.pubsub已经被弃用了,打包运行会出问题,用命令行运行没问题。只要需要使用pubsub命令行安装pipinstallpubsub
- Lily的Scalers Talk第四轮新概念朗读持续力训练 Day66 2018-12-12
王华丽_839b
听力材料In1963aLancasterbombercrashedonWallisIsland,aremoteplaceintheSouthPacific,alongwaywestofSamoa.Theplanewasn'ttoobadlydamaged,butovertheyears,thecrashwasforgottenandthewreckremainedundisturbed.Theni
- bugly升级配置
微尘_8957
build.gradle配置dependencies{//注释掉原有bugly的仓库implementation'com.tencent.bugly:crashreport_upgrade:1.2.4'}android{defaultConfig{ndk{//设置支持的SO库架构abiFilters'armeabi','x86','armeabi-v7a','x86_64','arm64-v8a'
- Android FileProvider 的使用
sanyer
1、前言从AndroidN(7.0)开始,将严格执行StrictMode模式。而从AndroidN开始,将不允许在App间,使用file://的方式,传递一个File,否者会抛出FileUriExposedException的异常引发Crash。解决方案就是通过FileProvider用content://代替file://,需要开发者主动升级targetSdkVersion到24才会执行此策略。
- 【iOS内功】ARM汇编实战,解析iOS14 UICollectionView死循环问题
iOS鑫
image.png【iOS内功】ARM汇编实战,解析iOS14UICollectionView死循环问题背景9月初iOS14正式发布,线上版本新冒出许多Crash。有一个Crash,UICollectionView刷新逻辑死循环,卡死了主线程。阳差阳错,中美两个程序员的“误会”造成了这个Crash。App有一个页面,自定义了一个XXCollectionView。XXCollectionView嵌套
- 安利一款Android日志工具
低情商的大仙
在平时开发时,大家最怕什么?当然是——bug,错!!!这是小白的言语,稍微有开发经验的人都知道:bug不可怕,就怕bug偶发。由于无法重现,这类bug简直堪称磨人的小妖精,通常为了防止这种情况,日志就是最好的办法了,那么接下来,我就向大家安利一款Android上的日志工具JlLog主要抓两种日志:网络请求在通知栏上提供入口,随时可以查看app的网络请求数据,即使appcrash了数据也不会丢失。c
- PCS驾驶辅助不等于自动驾驶,车上的防碰撞功能你用对了吗?(PCS篇)
十年筑己
汽车预防碰撞安全系统(pre-crashsafetysystem)是一种利用即时通讯技术、控制系统与信息科技侦测车辆周遭的动态状况,从而辅助汽车驾驶人进行安全驾驶的汽车安全科技。依各家车厂不同的命名,另有防撞系统(英语:collisionavoidancesystem)、前方碰撞预警系统(forwardcollisionwarningsystem)、减少碰撞系统(collisionmitigati
- R语言课程论文-飞机失事数据可视化分析
talle2021
数据分析r语言数据分析数据可视化
数据来源:AirplaneCrashesSince1908(kaggle.com)代码参考:ExploringhistoricAirPlanecrashdata|Kaggle数据指标及其含义指标名含义Date事故发生日期(年-月-日)Time当地时间,24小时制,格式为hh:mmLocation事故发生的地点Operator航空公司或飞机的运营商Flight由飞机操作员指定的航班号Route事故前
- 怎么定位SDK内部的crash
龙子陵
今天碰到群里的大佬讲解,记录一波我们经常会碰到给第三方写SDK的时候,那么,我们怎么定位SDK内部的crash?如果使用bugly,bugly会把合作方的crash都给上报了,如果合作方很多,那crash量非常恐怖,而且,绝大多数都不是SDK的问题,如何排除接入方的crash?而只上报我们自己的?用类名判断行不行哦?如果我SDK类很多,做白名单吗?又或者,crash堆栈没有出现类名信息怎么半?号了
- iOS编程提升程序数据健壮性
单线程Jack
在项目开发中,和服务端交互数据时,若服务端数据为空时,会出现,客户端解析时会Crash,为了增强程序的健壮性,减少Crash的发生,可以使用NullSafe这个类别。它对不识别的类型返回nil,而不是抛出异常,它减少了例如因为JSON解析中数组或字符串为null时导致的Crash。这些异常对客户端来说是不可预期的。使用时只需要把NullSafe.m文件拖进工程就可以了,它在程序运行时自动加载,你不
- 不安全的weak变量
Colla
对于存在多线程释放并且并发访问的对象,不建议使用weak修饰或访问。因为weak的底层实现并不完全是线程安全,否则较容易导致over-release而crash。一、问题每次版本升级初期总是有少部分会遇到如下的crash请在这里填写图片描述虽然量很少,但总是有也很是烦人。没办法只能看下到底是怎么回事。二、问题描述很明显,这是一个over-release的问题;挂在objc_release里;业务代
- monkey日志分析
隔壁laowang
上文说到执行命令:adbshellmonkey-pcom.hijingxi--ignore-crashes--ignore-timeouts--throttle1000--ignore-native-crashes-s100-v-v-v50>>D:\0606.txt找到所在目录打开文件:分析log日志开头日志结尾l日志内容分析一般测试结果分析-搜索关键字:1.程序无响应,ANR问题:在日志中搜索“
- 案例:CentOS8 在 MySQL8.0 实现半同步复制
Toasten
Linux小技巧数据库
异步复制MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果crash掉了,此时主节点上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。全同步复制指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全
- Tuning using the Alert log File
weixin_30875157
数据库
TheAlertlogfilecontainsthefollowinginformationwhichcanbeusedintuningthedatabase:Checkpointstartandendtimes.IncompletecheckpointsTimetoperformarchivingCrashrecoverystartandcompletetimes.egg:connsys/ora
- 工具篇 iOS Crash收集
下页天
在iOS程序的崩溃中,主要有两种异常引起的。一个是Mach异常,一个是Object-C异常(NSException,OC层的异常)平台一条龙Crash统计产品CrashlyticsHockeyapp友盟Bugly成熟的开源项目KSCrashplcrashreporterCrashKitCrash的收集方式1、使用Xcode从设备获取崩溃日志:如果你把你的手机连接到Mac,并选择Xcode->Win
- 关于Swift中音频访问权限问题出现的Crash
TonyTT
近期在维护公司的项目期间,在bugly上发现一则crash问题如下图crash图其中项目集成了ToastSwift这个库,而这个崩溃的提示信息Modificationstothelayoutenginemustnotbeperformedfromabackgroundthreadafterithasbeenaccess...这句话的意思大概是在子线程中修改了UI。根据这个提示我找到自己代码代码这里
- 5. Jenkins 兼容性测试
yywfy的昵称
做兼容性测试的原因:Android,iOS版本多,API在不同版本上的行为不一致,系统机制发生变化。Android定制Rom多,系统函数和机制被修改,系统参数差异,比如默认堆大小。硬件差异,GPU太差影响卡顿和渲染,屏幕尺寸,分辨率不同影响UI布局,相关的传感器硬件差异。兼容性不好造成的问题:App安装不上,Appcrash,业务流程中断,尺寸错乱,告警和报错,卡顿,相应慢,花屏,黑屏,白屏等。A
- CSS Notes
Hadjshell
csshtml5html
Author:DavidZhangDate:08/10/2021Version:1.0CSSNotesBasedonCSSCrashCourseIntroCSS-CascadingStylesheetsCascadingstylesheetsarecalledcascadingbecauseseveraldifferentstylesheetscanbeactiveforasingledocume
- k8s(kubernetes)服务部署dashboard时出现ImagePullBackOff/CrashLoopBackOff解决办法
搞运维的万精油
k8skuberneteslinux运维dockercentos
部署服务时镜像拉取过程中出现:ImagePullBackOffkubectldescribepodskubernetes-dashboard-975499656-krwl7-nkube-system查看pod的详细情况Events:TypeReasonAgeFromMessage-------------------------NormalScheduled4m38sdefault-schedul
- 312个免费高速HTTP代理IP(能隐藏自己真实IP地址)
yangshangchuan
高速免费superwordHTTP代理
124.88.67.20:843
190.36.223.93:8080
117.147.221.38:8123
122.228.92.103:3128
183.247.211.159:8123
124.88.67.35:81
112.18.51.167:8123
218.28.96.39:3128
49.94.160.198:3128
183.20
- pull解析和json编码
百合不是茶
androidpull解析json
n.json文件:
[{name:java,lan:c++,age:17},{name:android,lan:java,age:8}]
pull.xml文件
<?xml version="1.0" encoding="utf-8"?>
<stu>
<name>java
- [能源与矿产]石油与地球生态系统
comsci
能源
按照苏联的科学界的说法,石油并非是远古的生物残骸的演变产物,而是一种可以由某些特殊地质结构和物理条件生产出来的东西,也就是说,石油是可以自增长的....
那么我们做一个猜想: 石油好像是地球的体液,我们地球具有自动产生石油的某种机制,只要我们不过量开采石油,并保护好
- 类与对象浅谈
沐刃青蛟
java基础
类,字面理解,便是同一种事物的总称,比如人类,是对世界上所有人的一个总称。而对象,便是类的具体化,实例化,是一个具体事物,比如张飞这个人,就是人类的一个对象。但要注意的是:张飞这个人是对象,而不是张飞,张飞只是他这个人的名字,是他的属性而已。而一个类中包含了属性和方法这两兄弟,他们分别用来描述对象的行为和性质(感觉应该是
- 新站开始被收录后,我们应该做什么?
IT独行者
PHPseo
新站开始被收录后,我们应该做什么?
百度终于开始收录自己的网站了,作为站长,你是不是觉得那一刻很有成就感呢,同时,你是不是又很茫然,不知道下一步该做什么了?至少我当初就是这样,在这里和大家一份分享一下新站收录后,我们要做哪些工作。
至于如何让百度快速收录自己的网站,可以参考我之前的帖子《新站让百
- oracle 连接碰到的问题
文强chu
oracle
Unable to find a java Virtual Machine--安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案
作者:草根IT网 来源:未知 人气:813标签:
导读:安装64位版Oracle11gR2后发现启动SQLDeveloper时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\prod
- Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)
小桔子
java继承swing接口监听
都知道java中类只能单继承,但可以实现多个接口,但我发现实现多个接口之后,多个接口却不能共享同一个数据,应用开发中想实现:当用户按着ctrl键时,可以用鼠标点击拖动组件,比如说文本框。
编写一个监听实现KeyListener,NouseListener,MouseMotionListener三个接口,重写方法。定义一个全局变量boolea
- linux常用的命令
aichenglong
linux常用命令
1 startx切换到图形化界面
2 man命令:查看帮助信息
man 需要查看的命令,man命令提供了大量的帮助信息,一般可以分成4个部分
name:对命令的简单说明
synopsis:命令的使用格式说明
description:命令的详细说明信息
options:命令的各项说明
3 date:显示时间
语法:date [OPTION]... [+FORMAT]
- eclipse内存优化
AILIKES
javaeclipsejvmjdk
一 基本说明 在JVM中,总体上分2块内存区,默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。 1)堆内存(Heap memory):堆是运行时数据区域,所有类实例和数组的内存均从此处分配,是Java代码可及的内存,是留给开发人
- 关键字的使用探讨
百合不是茶
关键字
//关键字的使用探讨/*访问关键词private 只能在本类中访问public 只能在本工程中访问protected 只能在包中和子类中访问默认的 只能在包中访问*//*final 类 方法 变量 final 类 不能被继承 final 方法 不能被子类覆盖,但可以继承 final 变量 只能有一次赋值,赋值后不能改变 final 不能用来修饰构造方法*///this()
- JS中定义对象的几种方式
bijian1013
js
1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象):
<html>
<head>
<title>基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)</title>
</head>
<script>
var obj = new Object();
- 表驱动法实例
bijian1013
java表驱动法TDD
获得月的天数是典型的直接访问驱动表方式的实例,下面我们来展示一下:
MonthDaysTest.java
package com.study.test;
import org.junit.Assert;
import org.junit.Test;
import com.study.MonthDays;
public class MonthDaysTest {
@T
- LInux启停重启常用服务器的脚本
bit1129
linux
启动,停止和重启常用服务器的Bash脚本,对于每个服务器,需要根据实际的安装路径做相应的修改
#! /bin/bash
Servers=(Apache2, Nginx, Resin, Tomcat, Couchbase, SVN, ActiveMQ, Mongo);
Ops=(Start, Stop, Restart);
currentDir=$(pwd);
echo
- 【HBase六】REST操作HBase
bit1129
hbase
HBase提供了REST风格的服务方便查看HBase集群的信息,以及执行增删改查操作
1. 启动和停止HBase REST 服务 1.1 启动REST服务
前台启动(默认端口号8080)
[hadoop@hadoop bin]$ ./hbase rest start
后台启动
hbase-daemon.sh start rest
启动时指定
- 大话zabbix 3.0设计假设
ronin47
What’s new in Zabbix 2.0?
去年开始使用Zabbix的时候,是1.8.X的版本,今年Zabbix已经跨入了2.0的时代。看了2.0的release notes,和performance相关的有下面几个:
:: Performance improvements::Trigger related da
- http错误码大全
byalias
http协议javaweb
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。
响应码分五种类型,由它们的第一位数字表示:
1)1xx:信息,请求收到,继续处理
2)2xx:成功,行为被成功地接受、理解和采纳
3)3xx:重定向,为了完成请求,必须进一步执行的动作
4)4xx:客户端错误,请求包含语法错误或者请求无法实现
5)5xx:服务器错误,服务器不能实现一种明显无效的请求
- J2EE设计模式-Intercepting Filter
bylijinnan
java设计模式数据结构
Intercepting Filter类似于职责链模式
有两种实现
其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下:
package com.ljn.filter.custom;
import java.util.ArrayList;
- 修改jboss端口
chicony
jboss
修改jboss端口
%JBOSS_HOME%\server\{服务实例名}\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml
中找到
<!-- The ports-default bindings are obtained by taking the base bindin
- c++ 用类模版实现数组类
CrazyMizzz
C++
最近c++学到数组类,写了代码将他实现,基本具有vector类的功能
#include<iostream>
#include<string>
#include<cassert>
using namespace std;
template<class T>
class Array
{
public:
//构造函数
- hadoop dfs.datanode.du.reserved 预留空间配置方法
daizj
hadoop预留空间
对于datanode配置预留空间的方法 为:在hdfs-site.xml添加如下配置
<property>
<name>dfs.datanode.du.reserved</name>
<value>10737418240</value>
 
- mysql远程访问的设置
dcj3sjt126com
mysql防火墙
第一步: 激活网络设置 你需要编辑mysql配置文件my.cnf. 通常状况,my.cnf放置于在以下目录: /etc/mysql/my.cnf (Debian linux) /etc/my.cnf (Red Hat Linux/Fedora Linux) /var/db/mysql/my.cnf (FreeBSD) 然后用vi编辑my.cnf,修改内容从以下行: [mysqld] 你所需要: 1
- ios 使用特定的popToViewController返回到相应的Controller
dcj3sjt126com
controller
1、取navigationCtroller中的Controllers
NSArray * ctrlArray = self.navigationController.viewControllers;
2、取出后,执行,
[self.navigationController popToViewController:[ctrlArray objectAtIndex:0] animated:YES
- Linux正则表达式和通配符的区别
eksliang
正则表达式通配符和正则表达式的区别通配符
转载请出自出处:http://eksliang.iteye.com/blog/1976579
首先得明白二者是截然不同的
通配符只能用在shell命令中,用来处理字符串的的匹配。
判断一个命令是否为bash shell(linux 默认的shell)的内置命令
type -t commad
返回结果含义
file 表示为外部命令
alias 表示该
- Ubuntu Mysql Install and CONF
gengzg
Install
http://www.navicat.com.cn/download/navicat-for-mysql
Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html
Step2:进入下载目录,解压压缩包:tar -zxvf navicat11_mysql_en.tar.gz
- 批处理,删除文件bat
huqiji
windowsdos
@echo off
::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
rem 指定待删除文件的存放路径
set SrcDir=C:/Test/BatHome
rem 指定天数
set DaysAgo=1
- 跨浏览器兼容的HTML5视频音频播放器
天梯梦
html5
HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件。而html5media.js可以在不支持html5的浏览器上使video和audio标签生效。 How to enable <video> and <audio> tags in
- Bundle自定义数据传递
hm4123660
androidSerializable自定义数据传递BundleParcelable
我们都知道Bundle可能过put****()方法添加各种基本类型的数据,Intent也可以通过putExtras(Bundle)将数据添加进去,然后通过startActivity()跳到下一下Activity的时候就把数据也传到下一个Activity了。如传递一个字符串到下一个Activity
把数据放到Intent
- C#:异步编程和线程的使用(.NET 4.5 )
powertoolsteam
.net线程C#异步编程
异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。
本文中涉及关键知识点
1. 异步编程
2. 线程的使用
3. 基于任务的异步模式
4. 并行编程
5. 总结
异步编程
什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程。通常情况下,C#程序
- spark 查看 job history 日志
Stark_Summer
日志sparkhistoryjob
SPARK_HOME/conf 下:
spark-defaults.conf 增加如下内容
spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/var/log/spark spark.eventLog.compress true
spark-env.sh 增加如下内容
export SP
- SSH框架搭建
wangxiukai2015eye
springHibernatestruts
MyEclipse搭建SSH框架 Struts Spring Hibernate
1、new一个web project。
2、右键项目,为项目添加Struts支持。
选择Struts2 Core Libraries -<MyEclipes-Library>
点击Finish。src目录下多了struts