2021-04-30

为什么女性更年期后容易骨质疏松?预防要做好4件事

核心提示:很多女性更年期后都会出现骨质疏松的问题,这到底是怎么回事呢?更年期女性该如何预防骨质疏松?

为什么女性更年期后容易骨质疏松?


骨质疏松症是一种危害骨骼健康的慢性疾病。特别偏爱绝经后的女性。这是因为女性进入绝经期后,卵巢功能开始走下坡路,体内雌激素水平也会急剧下降,从而导致骨代谢失去平衡,骨量开始丢失,慢慢地就会出现骨质疏松,患者还容易出现骨折。

更年期女性如何预防骨质疏松?

建议女性30岁起就要开始预防骨质疏松了,虽然很少女性会在这个年龄阶段出现骨质疏松。但如果年轻时候预防工作做得好,到了绝经期时还是能很大程度上降低骨质疏松的发病率。

1.适当补充维生素D和钙

维生素D和钙能提高骨密度,也是骨质疏松治疗时的常见用药。在日常生活中,饮食口味以清淡为主,注意多补充优质蛋白、富含维生素的食物,还有就是少喝咖啡、浓茶等。必要时在医生的指导下服用维生素D和钙片。这里需要特别提醒的是,女性在生完孩子以后也要适当的补钙。这是因为宝宝骨骼的形成和发育需要的大量的钙,外源性钙补给不足,只能由母体内摄取。所以生孩子后,妈妈是非常有必要进行有效补钙。如果等到出现问题再补钙,那就迟了。

2.骨密度检查

定期的骨密度检查,有助于了解自身骨骼情况,从而采取防治措施。女性从40岁开始就要定期的检查骨密度,如果没有问题,可以三年做一次骨密度检查,但如果是绝经后的女性,或者有长期服用类固醇、抗抑郁药物的女性,最好能做到一年一次骨密度检查。

3.必要时可补充雌激素

对于绝经后的女性,可以在医生的专业指导和评估下,适当的进行雌激素补充。雌激素能减轻绝经症状和保持骨密度,但是在使用雌激素的过程中,还是要注意切勿自己乱服用。


4.适当运动和晒太阳

要保证日常的运动量,多晒太阳。适量的运动和晒太阳是能促进机体对钙的吸收利用,增加骨密度,而且,运动还能改善机体的平衡功能,增加肌力,降低骨折的发生风险。所以,每天保证适量的户外运动,能够阻止并减缓骨质疏松的进展。

骨质疏松虽然是很普遍的疾病,但对患者的生活质量也是会造成一定影响的。因此,在年轻的时候就要做好预防工作,如果发现患上骨质疏松,就要及时治疗,避免加重。


原文转载:http://lady.shaoqun.com/a/304921.html

跨境电商:https://www.ikjzd.com/

法瑞儿:https://www.ikjzd.com/w/412

邓白氏集团:https://www.ikjzd.com/w/582


核心提示:很多女性更年期后都会出现骨质疏松的问题,这到底是怎么回事呢?更年期女性该如何预防骨质疏松? 为什么女性更年期后容易骨质疏松?骨质疏松症是一种危害骨骼健康的慢性疾病。特别偏爱绝经后的女性。这是因为女性进入绝经期后,卵巢功能开始走下坡路,体内雌激素水平也会急剧下降,从而导致骨代谢失去平衡,骨量开始丢失,慢慢地就会出现骨质疏松,患者还容易出现骨折。更年期女性如何预防骨质疏松?建议女性30岁起就
modcloth:https://www.ikjzd.com/w/1271
大森林:https://www.ikjzd.com/w/2268
net a porter:https://www.ikjzd.com/w/2132
分享:小卖家做亚马逊需要投入多少钱?:https://www.ikjzd.com/home/106653
W-8BEN席卷亚马逊,法国和意大利即将严查VAT:https://www.ikjzd.com/home/107400
今日起,亚马逊这一政策正式实行!:https://www.ikjzd.com/home/101959

2021-04-29

WPF教程十二:了解自定义控件的基础和自定义无外观控件

这一篇本来想先写风格主题,主题切换、自定义配套的样式。但是最近加班、搬家、新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的,又不想降低教程的质量,所以就打算把风格的主题这一篇,放后面等我找到了我喜欢的主题,然后在开始仿写。这一篇先入门自定义控件。

​ WPF支持样式、内容控件和模板。因此不在刻意的强调自定义控件。这些特性为开发人员提供了多种方式来完善和扩展标准的控件,而不用派生新的控件类。通过以下几种方式能实现大部分需求:

  • 样式。可以使用样式方便地重用控件属性和触发器的组合。

  • 内容控件。所有继承自ContentControl类的控件都支持嵌套的内容。使用内容控件,可以快速创建聚集其他元素的符合控件(比如,可将按钮变成图像按钮或将列表框变成图象列表)。

  • 控件模板。所有WPF控件都是无外观的,这意味着它们具有硬编码的功能,但它们的外观是通过控件模板单独定义的。使用其他新的控件模板代替默认模板,可重新构建基本控件,例如重新构建按钮、复选框、单选框和窗口。

  • 数据模板。所有派生自ItemsControl的类都支持数据模板,通过数据模板可创建某些数据对象类型的富列表标识。通过恰当的数据模板,可使用许多元素的组合显示每个项,这些组合元素可以是文本、图像甚至可以是可编辑控件(都在所选的布局容器中)。

    如果可以的话,在决定使用自定义控件或其他类型的自定义元素之前,可以继续使用这些方法。因为这些解决方案更简单,更容易实现,并且通常更容易重用。

    当微调元素外观时不适用与自定义元素,但是当希望改变底层的功能时,自定义元素就十分有用了。例如,WPF为TextBox控件和PasswordBox控件使用不同的类是有原因的。它们使用不同的方法处理按键,以不同的方式在内部保存它们的数据,以不同的方式与其他组件(剪切板)进行交互,等等,如果希望设计一个具有不同属性、方法和事件集合的控件,就需要构建自己的控件。

    这篇文章介绍如何创建自定义元素以及如何使用它们成为WPF中的重要成员。这意味着将使它们具备依赖项属性和路由事件功能,以获得对WPF重要服务的支持,如数据绑定、样式以及动画。还学习如何创建无外观的控件——模板驱动的控件,允许控件的用户提供不同的可视化外观以获得更大的灵活性。

    理解WPF中的自定义元素

    尽管可以在任意WPF项目中编写自定义元素,但是通常希望在专门的类库程序集(DLL)中放置自定义元素,用于在多个程序之前共享自定义元素。

    为确保具有正确得程序集引用和名称空间导入,我们在创建项目时选择Custom Control Library(WPF)项目类型。在类库中,可创建任意数量的控件。

    想要写好自定义控件,这个继承关系必须要记着,这些基类工作在WPF的哪个层一定要搞清楚。

名称说明
FrameworkElement当创建自定义元素时,这是常用的最低级的基类。通常只有当希望重写OnRender()方法并使用System.Windows.media.DrawingContext从头绘制内容时,才会使用这种方法。FrameworkElement类为哪些不打算与用户进行交互的元素提供了一组基本的属性和事件
Control当从头开始创建控件时,这是最常用的起点。该类时所有用户交互小组件的基类。Control类添加了用于设置背景、前景、字体和内容对其方式的属性。控件类还为自身设置了Tab顺序(通过IsTabStop属性),并且引入了鼠标双击功能(通过MouseDoubleClick和PreviewMouseDoubleClick事件)。但最重要的是,Control类定义了Template属性,为了得到无限的灵活性,该属性允许使用自定义元素树替换其外观
ContentControl这是能够显示任意单一内容的控件的基类。显示的内容可以是元素或集合使用模板的自定义对象(内容通过Content属性设置,并且可以通过ContentTemplate属性提供可选的模板)。许多控件都封装了特定的类型在一定范围内的内容(比如文本框中的文本字符串)。因为这些控件不支持所有元素,所以它们不是内容控件。
UserControl这是可以使用设计视图进行配置的内容控件。尽管用户控件和普通的内容控件是不同的,但是希望在多个窗口中快速重用用户界面中的不变模块时(而不是创建真正的能在不同应用程序之间转移的独立控件),通常使用该基类。
ItemsControl或SelectorItemsControl 是封装项列表的控件的基类,但不支持选择,二Selector类是支持选择的控件的更具体基类。创建自定义控件不经常使用这些类,因为ListBox、ListView以及TreeView控件的树绑定特性提供了很大的灵活性
Panel该类是具有布局逻辑控件的基类,布局空间能够包含多个子元素,并根据特定的布局语义安排这些子元素。通常,面板提供了用于设置子元素的附加属性,配置如何安排子元素。
Decorator封装其他元素的元素的基类,并且提供了一种图形效果或特定的功能。两个明显的例子是Border和Viewbox,其中Border控件在元素的周围绘制线条,Viewbox控件使用变换动态缩放其内容。其他装饰元素包括为普通控件(如按钮)提供熟悉边框和背景色的修饰类。
特殊控件类如果希望改进现有控件,可以直接继承该控件。例如,可创建具有内置验证逻辑的TextBox控件。然而,在采取这一步之前,应该首先分析是否可通过事件处理代码或单独的组件达到同一目的。这两种方法都可以使自定义逻辑和控件相分离,从而可在其他控件中重用。

我们通过使用UserControl创建一个颜色拾取器,来分析如何将这个控件分解成为功能更强大的基于模板的控件。

我们的颜色拾取器包含4个Slider、一个Rectangle。slider用来控制Color的A、R、G、B4个通道,Rectangle用来显示4个Slider值对应的ARGB颜色值。

然后再window中使用这个自定义控件。

我们再项目中创建UserControls文件夹,然后添加ColorPickerUserControls.xaml。

创建依赖项属性我们使用的propdp=>2次Tab来实现的。添加的路由事件是我们自己写的propurv=>2次Tab来实现的。

实现过程在这篇博客中:WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率 - 杜文龙 - 博客园 (cnblogs.com)

好了,自定义控件的代码如下:

<UserControl x:    
using System.Collections.Generic;using System.Windows;using System.Windows.Controls;using System.Windows.Input;using System.Windows.Media;namespace CustomElement.UserControls{ /// <summary> /// ColorPicker.xaml 的交互逻辑 /// </summary> public partial class ColorPickerUserControls : UserControl {  public byte Alpha  {   get { return (byte)GetValue(AlphaProperty); }   set { SetValue(AlphaProperty, value); }  }  // Using a DependencyProperty as the backing store for Alpha. This enables animation, styling, binding, etc...  public static readonly DependencyProperty AlphaProperty =   DependencyProperty.Register("Alpha", typeof(byte), typeof(ColorPickerUserControls), new PropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));  public byte Red  {   get { return (byte)GetValue(RedProperty); }   set { SetValue(RedProperty, value); }  }  // Using a DependencyProperty as the backing store for Red. This enables animation, styling, binding, etc...  public static readonly DependencyProperty RedProperty =   DependencyProperty.Register("Red", typeof(byte), typeof(ColorPickerUserControls), new PropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));  public byte Green  {   get { return (byte)GetValue(GreenProperty); }   set { SetValue(GreenProperty, value); }  }  // Using a DependencyProperty as the backing store for Green. This enables animation, styling, binding, etc...  public static readonly DependencyProperty GreenProperty =   DependencyProperty.Register("Green", typeof(byte), typeof(ColorPickerUserControls), new PropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));   public byte Blue  {   get { return (byte)GetValue(BlueProperty); }   set { SetValue(BlueProperty, value); }  }  // Using a DependencyProperty as the backing store for Blue. This enables animation, styling, binding, etc...  public static readonly DependencyProperty BlueProperty =   DependencyProperty.Register("Blue", typeof(byte), typeof(ColorPickerUserControls), new PropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));  private static void OnColorRGBChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  {   ColorPickerUserControls colorPicker = (ColorPickerUserControls)d;   Color color = colorPicker.Color;   if (e.Property == AlphaProperty)   {    color.A = (byte)e.NewValue;   }   else if (e.Property == RedProperty)   {    color.R = (byte)e.NewValue;   }   else if (e.Property == GreenProperty)   {    color.G = (byte)e.NewValue;   }   else if (e.Property == BlueProperty)   {    color.B = (byte)e.NewValue;   }   colorPicker.Color = color;  }   public Color Color  {   get { return (Color)GetValue(ColorProperty); }   set { SetValue(ColorProperty, value); }  }  // Using a DependencyProperty as the backing store for Color. This enables animation, styling, binding, etc...  public static readonly DependencyProperty ColorProperty =   DependencyProperty.Register("Color", typeof(Color), typeof(ColorPickerUserControls), new PropertyMetadata(new PropertyChangedCallback(OnColorChanged)));  private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  {   ColorPickerUserControls colorPicker = (ColorPickerUserControls)d;   Color oldColor = (Color)e.OldValue;   Color newColor = (Color)e.NewValue;   colorPicker.Alpha = newColor.A;   colorPicker.Red = newColor.R;   colorPicker.Green = newColor.G;   colorPicker.Blue = newColor.B;   if (!colorPicker.isUndo)   {    colorPicker.previousColors.Push((Color)e.OldValue);    colorPicker.OnColorChanged(oldColor, newColor);   }   colorPicker.isUndo = false;     }  private bool isUndo = false;  private Stack<Color> previousColors = new Stack<Color>(100);  private void OnColorChanged(Color oldValue, Color newValue)  {   RoutedPropertyChangedEventArgs<Color> args = new RoutedPropertyChangedEventArgs<Color>(oldValue, newValue);   args.RoutedEvent = ColorPickerUserControls.ColorChangedEvent;   RaiseEvent(args);  }  public static readonly RoutedEvent ColorChangedEvent = EventManager.RegisterRoutedEvent("ColorChanged", RoutingStrategy.Bubble,   typeof(RoutedPropertyChangedEventHandler<Color>), typeof(ColorPickerUserControls));  public event RoutedPropertyChangedEventHandler<Color> ColorChanged  {   add { AddHandler(ColorChangedEvent, value); }   remove { RemoveHandler(ColorChangedEvent, value); }  }  static ColorPickerUserControls()  {    CommandManager.RegisterClassCommandBinding(typeof(ColorPickerUserControls), new CommandBinding(ApplicationCommands.Undo, UndoCommand_Executed, UndoCommand_CanExecute));  }  public ColorPickerUserControls()  {   InitializeComponent();  }   private static void UndoCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)  {   ColorPickerUserControls colorPicker = (ColorPickerUserControls)sender;   e.CanExecute = colorPicker.previousColors.Count > 0;  }  private static void UndoCommand_Executed(object sender, ExecutedRoutedEventArgs e)  {   ColorPickerUserControls colorPicker = (ColorPickerUserControls)sender;   colorPicker.isUndo = true;   colorPicker.Color = (Color)colorPicker.previousColors.Pop();  } }}

完整代码如上,我们主要创建了4个ARGB对应byte依赖项属性,和OnColorRGBChanged变动的事件,如果ARGB值变动了,我们就去修改Color的值。

同时我们又创建了OnColorChanged事件用来更新ARGB。当各个属性改变试图改变其他属性时,WPF不允许重新进入属性变化回调函数。例如。如果改变Color属性,就会触发OnColorChanged()方法。OnColorChanged()方法会修改Alpha、Red、Green、Blue属性,从而触发OnColorRGBChanged()回调方法3次,每个属性一次。

然而OnColorRGBChanged()方法不会再次触发OnColorChanged()方法。

然后我们通过propurv=》2次tab实现了一个路由事件,当Color发生变化时会通知注册了这个事件的控件调用者。而后我们在静态构造函数通过RegisterClassCommandBinding注册了一个撤销命令,用于支持用户撤销他的操作。我们用了一个长度为100的Stack来保持用户操作。

我们在Window下使用这个我们创建好的自定义控件,注意这一行代码:

这是添加相关的引用。

其他完整代码如下:

<Window x:  
using System.Windows;using System.Windows.Media;namespace CustomElement{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window {   public string ColorTxt  {   get { return (string)GetValue(ColorTxtProperty); }   set { SetValue(ColorTxtProperty, value); }  }  // Using a DependencyProperty as the backing store for ColorTxt. This enables animation, styling, binding, etc...  public static readonly DependencyProperty ColorTxtProperty =   DependencyProperty.Register("ColorTxt", typeof(string), typeof(MainWindow));   public MainWindow()  {   InitializeComponent();   DataContext = this;  }  private void ColorPicker_ColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)  {   ColorTxt = "The new color is " + e.NewValue;  } }}

这是Window下使用自定义控件的代码。

用户控件的目标是提供增补控件模板的设计表面,提供一种定义控件的快速方法,代价是时去了将来的灵活性,如果喜欢用户控件的功能,但是需要修改其可视化外观时,使用这种方法就有问题了。比如希望使用相同的颜色选择器,但是希望使用不同的"皮肤",将其更好地融合到已有地应用程序窗口中。可以通过样式来改变用户控件地某些方面,但是该控件地一些部分是在内部锁定,并且硬编码到标记中地,比如无法将预览矩形移动到滑动条左边。一般情况下,我们写自定义控件也都是写到了这一步。一个window下放入多个UserControl。然后编辑这些UserControl。各种逻辑代码和状态代码都混到这里。

那么既然用自定义控件肯定是简单地使用样式、触发器、模板无法满足复杂要求然后才从新做的自定义控件,既然选择了这个还是希望能实现到通用控件的程度,比如做一个播放器控件,做一个图片浏览空间。等等。能够通用和适配的东西,但是这样就涉及到皮肤问题,就比如Button、ListBox等等。现在就开始梳理这个无外观控件。

我们回到最开头的表单中找到Control的描述:

Control:当从头开始创建控件时,这是最常用的起点。该类时所有用户交互小组件的基类。Control类添加了用于设置背景、前景、字体和内容对其方式的属性。控件类还为自身设置了Tab顺序(通过IsTabStop属性),并且引入了鼠标双击功能(通过MouseDoubleClick和PreviewMouseDoubleClick事件)。但最重要的是,Control类定义了Template属性,为了得到无限的灵活性,该属性允许使用自定义元素树替换其外观

所以我们创建一个继承自Control的类来实现无外观控件。

创建一个名为CustomControls的WPF Custom Control Library工程,然后新建类改名为ColorPicker并继承自Control

(不知道为什么在VS2017下有.Net Framework的WPF Custom Control Library工程,但是在VS2019下只有名字为.NET的WPF Custom Control Library工程,我创建的是NET Core3.1版本的,而我的CustomElement工程是.NET Framework 4.7.2的,没法引用没看清楚,导致这里出现了问题,添加引用后一直是黄色不可用状态,浪费了我快半个小时写的代码,然后重新写了)。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace CustomControls{ /// <summary> /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。 /// /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。 /// 将此 

这是ColorPicker.cs的当前的全部代码。注意ColorPicker.cs下的这段代码。默认样式在这里。

DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker))); 

然后开始写Style。我们在CustomControls下创建themes文件夹然后添加ColorPicker.xaml资源文件和generic.xaml(这应该是创建的时候自带的)。

样式在我们当前的情况下最大的作用就是应用新模板,新模板定义了控件的默认可视化外观。

注意以下几点:

1)当创建到连接到父控件类属性的绑定表达式时,不能使用ElementName,而需要使用RelativeSource属性指示需要希望绑定到的父控件,如果单向绑定完全能够满足要求,可以使用轻量级的TemplateBinding 标记表达式,而不需要使用功能完备的数据绑定。

2)不能再控件模板中关联事件处理程序。相反,需要为元素提供能够时别的名字,并再控件构造函数中通过代码为它们关联事件处理程序。

3)除非希望关联事件处理程序或通过代码与它进行交互,否则不要再控件模板中命名元素。当命名希望使用的元素时,使用"PART_元素名"的形式进行命名。

我们的Border下的Background使用的是TemplateBinding了,他是使用该控件的对象(并引用了该样式和模板)传入的Background。使用TemplateBinding能提取数据,但是如果需要双向绑定,或者继承自Freezable的类比如(SolidColorBrush)TemplateBinding就不工作了,就需要使用RelativeSource绑定的TemplateParent。

这样就完成了控件模板的外观,代码如下:

<ResourceDictionary 

Generic.xaml下代码如下:

<ResourceDictionary 

但是这么写的话,每一处模板样式都需要写很多这样的绑定,我们可以把bangding关系放在模板的初始化阶段。

我们再刚才定义了很多的以"PART_"开头的Name。以PART_开头,后面跟元素名称,元素名称的首字母大写。我们现在把这些绑定关系放到一个专用的OnApplyTemplate()方法中,这样就能最简单的来使用模板。移出上面代码中Slider和SolidColorBrush的绑定关系。关键部分代码如下:

  <Slider Name="PART_RedSlider" Minimum="0" Maximum="255" />       <Slider Name="PART_GreenSlider" Grid.Row="1" Minimum="0" Maximum="255"/>        <Slider Name="PART_BlueSlider" Grid.Row="2" Minimum="0" Maximum="255"/>       <Rectangle Width="50" Stroke="Black" Grid.RowSpan="3" Grid.Column="1" StrokeThickness="1">        <Rectangle.Fill>         <SolidColorBrush x:Name="PART_PreviewBrush" Color="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Color}"/>        </Rectangle.Fill>       </Rectangle>

打开ColorPicker.cs找个合适的位置重写OnApplyemplate()。

 public override void OnApplyTemplate()  {   base.OnApplyTemplate();   RangeBase slider = (RangeBase)GetTemplateChild("PART_RedSlider");   if (slider != null)   {    Binding binding = new Binding("Red");    binding.Source = this;    binding.Mode = BindingMode.TwoWay;    slider.SetBinding(RangeBase.ValueProperty, binding);   }   slider = (RangeBase)GetTemplateChild("PART_GreenSlider");   if (slider != null)   {    Binding binding = new Binding("Green");    binding.Source = this;    binding.Mode = BindingMode.TwoWay;    slider.SetBinding(RangeBase.ValueProperty, binding);   }   slider = (RangeBase)GetTemplateChild("PART_BlueSlider");   {    Binding binding = new Binding("Blue");    binding.Source = this;    binding.Mode = BindingMode.TwoWay;    slider.SetBinding(RangeBase.ValueProperty, binding);   }   //Color="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Color}"   //这里并没有生效,2个小时了也没有解决,所以这个算作一个问题先放着吧   //后面单独写博客,解决这个问题,现在把这个相关的binding放到ColorPicker.xaml中。   #region 这里没有生效 ,先注释掉吧,改用ColorPicker.xaml下使用TemplatedParent.   // SolidColorBrush brush = GetTemplateChild("PART_PreviewBrush") as SolidColorBrush;   // if (brush != null)   // {   //  Binding binding = new Binding("Color");   //  binding.Source = brush;   //  binding.Mode = BindingMode.OneWayToSource;   //  this.SetBinding(ColorPicker.ColorProperty, binding);   // }   

乔治首节15分后消失 末节连砍4分仍遭保罗抢戏_防守

原标题:乔治首节15分后消失 末节连砍4分仍遭保罗抢戏

北京时间4月29日,2020-21赛季NBA常规赛继续进行,洛杉矶快船队在客场挑战菲尼克斯太阳队。全场比赛,乔治贡献25分10篮板4助攻,在首节手感火热,单节砍下15分,而后,乔治便直接消失,在末节更是遭到严密防守,目送保罗连续砍分,扩大分差,虽然之后乔治连续砍分,但是也未能帮助快船扭转局面。最终,快船队以101-109不敌太阳队。

比赛开始后,乔治尝试在罚球线附近后撤步跳投,但是未能命中。到了本节中段,乔治终于找回手感,在低位接队友分球,横移一步后直接中距离出手命中。而后,乔治运球过半场,随后借助掩护找到太阳防守漏洞,穿过3名防守球员直接杀入禁区,到了禁区后,轻松上篮得手。之后,太阳队连续砍分,扩大分差,乔治随后强顶布克突破,再度杀入禁区后上篮得手。而后,乔治又通过外线强攻造成杀伤,获得三次罚球机会。到了本节末段,乔治连续发威,在外线连续飙中三分,帮助快船队追分。

第二节比赛开始后,乔治在本节中段重回球场,但上场后乔治接连试手,均未能命中。尽管手感不佳,但是乔治在进攻端通过屡次吸引防守为队友创造了不少的机会,屡次助攻队友获得轻松砍分的机会。

第三节比赛开始后,乔治在防守端抢断得手,随后直接自己发动快攻,冲到前场后上篮得手。到了本节中段,乔治终于找回外线手感,在三分线外直接飙射三分命中。

第四节比赛开始后,乔治虽然欲帮助快船队追分,但是无奈一直被太阳队严密盯防。而太阳队这边,保罗连续强攻得手,即使面对乔治的贴身防守也能强硬上篮打进,帮助太阳队渐渐扩大分差。到了本节末段,乔治终于发威,持球直接强硬杀入禁区,面对太阳严密防守反手上篮得手,并造成犯规,但遗憾加罚不中。而后,乔治利用无球跑位得到机会,倚靠住防守球员直接再度杀入禁区上篮得手。最终,快船队以101-109不敌太阳队。(豌豆)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/573772.html

跨境电商:https://www.ikjzd.com/

新蛋:https://www.ikjzd.com/w/79

aca:https://www.ikjzd.com/w/1371


原标题:乔治首节15分后消失末节连砍4分仍遭保罗抢戏北京时间4月29日,2020-21赛季NBA常规赛继续进行,洛杉矶快船队在客场挑战菲尼克斯太阳队。全场比赛,乔治贡献25分10篮板4助攻,在首节手感火热,单节砍下15分,而后,乔治便直接消失,在末节更是遭到严密防守,目送保罗连续砍分,扩大分差,虽然之后乔治连续砍分,但是也未能帮助快船扭转局面。最终,快船队以101-109不敌太阳队。比赛开始后,乔
万国邮政联盟:https://www.ikjzd.com/w/861
noon:https://www.ikjzd.com/w/259
铭宣:https://www.ikjzd.com/w/1551.html
怎么写好amazon review评论?:https://www.ikjzd.com/home/91438
Feedvisor最新数据:亚马逊广告回报率远超谷歌!:https://www.ikjzd.com/home/116335
宝贝真紧要被你夹断了 公公与儿媳妇的不伦乱史:http://www.30bags.com/a/254952.html

亚马逊多渠道配送费用及经度探索者名单发布

近期,亚马逊降低了英国部分最受欢迎的尺码的多渠道配送费用。这意味着,如果卖家拥有亚马逊物流的库存,并用他来完成来自亚马逊销售平台的订单,卖家所支付的费用将会变少。亚马逊英国多渠道配送费用减免于4月26日生效,具体可参阅:

l 将标准执行费用降低多达18%

l 减少多达24%的加急费用

MCF使您能够利用与Amazon Prime相同的交付速度,通过1天,2天或标准(3-5个工作日)交付选项,通过任何电子商务渠道履行订单。所有MCF订单均可通过亚马逊的Swiship跟踪网站以及在Shopify和eBay等市场上搜索的任何跟踪号进行100%跟踪。

新的多渠道配送费用示例

以下是一些典型的产品示例,这些示例显示了多渠道履行费用将如何在各种产品尺寸级别之间变化。

图片1.png

亚马逊经度探索者名单发布

亚马逊经度探索者大奖最终入围名单已经公布,来自11-16岁年龄组的40个鼓舞人心的项目正在进行中,以赢得20,000英镑的最高奖金。

亚马逊经度探索者奖竞赛旨在通过向所有背景的孩子介绍STEM创业的可能性,为STEM行业带来更多认可和多样性。今年,参加2021年经度探险家奖的所有参与者中,有一半以上是年轻女性。在获得2020年奖项之后,有93%的决赛选手表示他们希望从事STEM的事业。

决赛入围者

决赛入围者包括一个海洋清洁机器人球体,该球体通过红外传感器检测并清除微塑料。一款用于分配手部消毒剂和红外线温度计的手机壳,可提醒用户经常洗手并保持体温;此外,该应用程序还通过将女性参与运动和锻炼与每月免费的卫生包,动机,健身和健康信息相结合,解决了长期贫困的应用程序。心理健康提示。

其他一些决赛入围者包括:

每次打开和关闭门进入电网时都会收集动能的设备,可帮助人们轻松做出可持续购物决策的碳足迹测量应用程序以及使用AI来教人们签名的平台语。

决赛入围者将与来自亚马逊和其他行业领先组织的专家指导者建立联系。他们将接受有关数据分析,软件工程,机器人技术和应用程序开发等主题的指导,以创建其概念的原型,以帮助确定今年7月的获奖者。

决赛入围者还将被邀请参加亚马逊经度探索者奖的企业学院工作日研讨会,还将获得FireTech UK的一对一技术支持,FireTech UK是英国领先的面向8-17岁儿童的技术课程提供商。



原创:跨境知道 晓阳


文章来源:https://www.ikjzd.com/home/144494

跨境电商:https://www.ikjzd.com/

达方物流:https://www.ikjzd.com/w/2562

巴克莱:https://www.ikjzd.com/w/2775

gem:https://www.ikjzd.com/w/1997

亚马逊多渠道配送费用及经度探索者名单发布

近期,亚马逊降低了英国部分最受欢迎的尺码的多渠道配送费用。这意味着,如果卖家拥有亚马逊物流的库存,并用他来完成来自亚马逊销售平台的订单,卖家所支付的费用将会变少。亚马逊英国多渠道配送费用减免于4月26日生效,具体可参阅:

出汗=减肥?出汗=排毒?不清楚这两点,你汗白流了

核心提示:热就出汗,运动之后出汗,很多人觉得那样会有减肥的效果,确实不假,那么真相到底是什么呢?

出汗真的有那么多神奇的效果吗?出汗的多少能说明些什么呢?今天,我们就好好来聊一聊出汗那些事儿~


出汗不等于减肥

医学专家认为"夏天出汗能减肥"这种说法毫无道理。出汗能够帮助维持人体内温度的平衡,1克汗可以散发约580卡的热量。但汗水里的成份98%左右都是水分,其他主要是一些盐、钾等矿物质。汗水的来源除了血液中的自由水,就是储存在身体各处的结合水,所以汗液中很少是脂肪氧化生成的水,大部分是调节体温生成的,并非是脂肪能直接变成汗液排出体外。出汗只是排水而已,人在失水的状态下只是暂时减轻了体重,而正常的体重减轻是指减少脂肪。

出汗不等于排毒

排汗与排毒不是一回事。汗液中98%-99%的成分是水和电解质(包括钠、钾、氯、镁、钙、磷等矿物质),只有1%-2%是尿素和无机盐等代谢废物。所以汗水的排毒作用,实际是非常有限的。

关于出汗,我们还需要注意些什么?

出汗多数情况是对身体温度的一个调节,不用过多担心,可若出现下面两个症状时,就需要多加注意了。

1.出汗过多

出汗多到影响正常生活,比如手汗过多浸湿纸张,正常室温下出汗浸湿衣服或床单等,很可能是"盗汗",就需要救助专业医生了。

2.出汗过少

相对出汗过多的症状较少见,一般吃药可能会出现此症状,再有就是罕见遗传性皮肤病或神经系统疾病等的症状表现,更需要去医院进行治疗了。

补水小贴士:

当出汗过多时,要多喝水。可以喝少量淡盐水或柠檬水,补充流失的电解质;


运动前后和运动中要注意补水。运动前1~2小时可以喝一杯水,运动中和运动后少量多次喝低热量且含电解质的水,加起来2~3杯;

不要一次喝太多或者等到渴了再喝。因为渴了的时候,身体已经缺水了。

虽然出汗不能促进减肥也不能排毒,但运动时出汗的感觉,帮助压力释放,会让人心情变好。记得养成爱运动的习惯,它还能帮你减肥!


原文转载:http://health.shaoqun.com/a/238191.html

跨境电商:https://www.ikjzd.com/

亚马逊 海外购:https://www.ikjzd.com/w/998

淘粉8:https://www.ikjzd.com/w/1725.html


核心提示:热就出汗,运动之后出汗,很多人觉得那样会有减肥的效果,确实不假,那么真相到底是什么呢? 出汗真的有那么多神奇的效果吗?出汗的多少能说明些什么呢?今天,我们就好好来聊一聊出汗那些事儿~出汗不等于减肥医学专家认为"夏天出汗能减肥"这种说法毫无道理。出汗能够帮助维持人体内温度的平衡,1克汗可以散发约580卡的热量。但汗水里的成份98%左右都是水分,其他主要是一些盐、钾等矿物质。汗水的来源除了血
1淘网:https://www.ikjzd.com/w/1698
塔图:https://www.ikjzd.com/w/2274
cb体系:https://www.ikjzd.com/w/2063
老公出差 我被邻居脱掉衣服:http://www.30bags.com/a/251645.html
新手课堂 | Hold住FBA库存管理,让不必要的物流费用和损失统统消失:https://www.ikjzd.com/home/21288
KEEPA收费了,求大神来个破解版!:https://www.ikjzd.com/home/17203

减脂必不可少的器材——哑铃!怎么用效果最好?

核心提示:哑铃很多人一直认为是用来练力量的,其实不然,它还有很好的减脂效果。

哑铃是健身运动中不可或缺的一种器材,在健身房很常见,经常看到有人用来增肌,殊不知,它们的减脂效果也是相当不错的哦。


如何选择重量?

【男生标准】

·10kg哑铃能做1-5个,你的适用重量是8kg

·10kg哑铃能做6-10个,你的适用重量是12kg

·10kg哑铃能做11-15个,你的适用重量是14kg

……以此类推

【女生标准】

·5kg哑铃能做1-5个,你的适用重量是3kg

·5kg哑铃能做6-10个,你的适用重量是4kg

·5kg哑铃能做11-15个,你的适用重量是5kg

……以此类推

怎样选择合适的哑铃?

进行哑铃锻炼,首先要选择合适重量的哑铃。关于这个问题,记者采访了健身教练费斯,她说,如果练习目的是为了增强肌肉,应该选择65%至85%负荷的哑铃。

举个例子,如果每次能举起的负荷是10公斤,就应选择重量为6.5公斤至8.5公斤的哑铃进行锻炼。练习时每天5至8组,每组动作6至12次,动作速度不宜过快,每组间隔2至3分钟。

如果女性为了减脂,可以选择3公斤左右较轻的哑铃,建议练习时应做到每组15至25次,每组间隔控制在1至2分钟,可以选择自己喜欢的音乐配合练习。

有些办公一族,还想出了用矿泉水瓶代替哑铃的方法。比如选择大瓶的矿泉水或是空瓶内灌沙的方法,这样可以在办公室里随时锻炼。

只需7分钟,坚持每天抽空做一做,在家里就能轻松并高强度地运动减肥。


一、持铃蹲伸

两腿分开与肩同宽,两手各握住一个8-10磅重的哑铃,放在两脚之间。臀部内收,下蹲,膝盖不要超过脚趾。

收紧腹部,双腿下压,站直,双手向上举起越过头顶,两手维持肩膀宽度。然后再回到下蹲姿势,重复动作60秒。


二、侧举铃

两腿分开肩膀宽度,左手拿着一个8-10磅的哑铃,并举起右臂,左手在身侧自然下垂。

上身向右侧弯曲,右手五指并拢,掌心向下,下降至右脚前。同时左臂向上举,垂直于地面。注意两腿伸直。换边重复相同动作,共做60秒。


原文转载:http://health.shaoqun.com/a/238193.html

跨境电商:https://www.ikjzd.com/

美森:https://www.ikjzd.com/w/1693

萌店:https://www.ikjzd.com/w/1538


核心提示:哑铃很多人一直认为是用来练力量的,其实不然,它还有很好的减脂效果。 哑铃是健身运动中不可或缺的一种器材,在健身房很常见,经常看到有人用来增肌,殊不知,它们的减脂效果也是相当不错的哦。如何选择重量?【男生标准】·10kg哑铃能做1-5个,你的适用重量是8kg·10kg哑铃能做6-10个,你的适用重量是12kg·10kg哑铃能做11-15个,你的适用重量是14k
智邦:https://www.ikjzd.com/w/2376
商标抢注:https://www.ikjzd.com/w/1053
aicpa:https://www.ikjzd.com/w/1373
搜索量暴涨!美国"地狱"山火引商机?亚马逊又出新规,这些订单将被自动取消!:https://www.ikjzd.com/home/130329
紧急:印度严查该认证,新增6类产品强制认证近日生效!:https://www.ikjzd.com/home/22911
跨境电商选品:基于市场标准如何评估产品的细分市场?:https://www.ikjzd.com/home/90663

穆雷三双巴特勒29+8+6 热火5人上双击败马刺_德拉季奇

原标题:穆雷三双巴特勒29+8+6 热火5人上双击败马刺

北京时间4月29日,热火坐镇主场迎战马刺,双方均有人员缺席,热火后卫奥拉迪波因伤休战,马刺后卫德里克-怀特因伤无法出场。最终,热火116-111击败马刺。

双方四节比分(马刺在前):20-31,34-24,20-27,37-34

马刺数据:德罗赞20分8助攻,穆雷22分10篮板11助攻,约翰逊14分6篮板,波尔特尔6分7篮板,沃克18分,盖伊13分,瓦塞尔11分

热火数据:巴特勒29分8篮板6助攻,阿德巴约21分11篮板,纳恩18分,罗宾逊8分,戴德蒙18分9篮板,德拉季奇18分7助攻

比赛开场,阿德巴约为热火赢得跳球,接着造成犯规两罚全进。约翰逊突破上篮打进回应,双方比分交替上升。4分15秒,巴特勒突破上篮打进,热火开始拉开分差,2分22秒,巴特勒再跳投命中,热火领先马刺两位数,随后又突破上篮打进,热火领先马刺13分。节末,马刺后场连续得分将分差缩小,但巴特勒跳投命中再将分差拉开,热火领先11分结束第一节。

第二节,马刺替补阵容开始反击,米尔斯和沃克连进三分,盖伊中投命中,马刺将分差缩小到3分。6分28秒,沃克投进三分,马刺将比分反超,随后双方交替领先,节末,德拉季奇投进压哨三分,热火带着1分领先优势结束第二节。

易边再战,纳恩开场连拿4分,巴特勒跳投打进,热火领先5分。随后双方比分交替上升,5分08秒,德罗赞两罚全进,戴德蒙随后补篮打进,瓦塞尔命中三分,马刺领先热火7分,但巴特勒和戴德蒙连续得分将分差缩小,1分58秒,巴特勒转身跳投命中,热火反超2分。节末,马刺陷入得分荒,德拉季奇连续得分,热火领先8分结束第三节。

第四节,马刺开场连中三分,热火立即叫出暂停,暂停回来,德拉季奇连得5分拉开分差。随后,到巴特勒接管比赛,5分53秒,巴特勒突破上篮2+1打进,随后上篮再进,4分40秒又突破打进2+1,4分16秒,纳恩投进三分,热火领先10分。马刺手感回暖,逐渐缩小分差,1分46秒,穆雷突破上篮打进,马刺落后3分。节末,热火顶住压力,拿下比赛。

热火首发:巴特勒,阿里扎,阿德巴约,罗宾逊,纳恩

马刺首发:约翰逊,德罗赞,波尔特尔,瓦塞尔,穆雷

(胖布欧)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/573768.html

跨境电商:https://www.ikjzd.com/

xinong:https://www.ikjzd.com/w/1368

stylenanda:https://www.ikjzd.com/w/1675.html


原标题:穆雷三双巴特勒29+8+6热火5人上双击败马刺北京时间4月29日,热火坐镇主场迎战马刺,双方均有人员缺席,热火后卫奥拉迪波因伤休战,马刺后卫德里克-怀特因伤无法出场。最终,热火116-111击败马刺。双方四节比分(马刺在前):20-31,34-24,20-27,37-34马刺数据:德罗赞20分8助攻,穆雷22分10篮板11助攻,约翰逊14分6篮板,波尔特尔6分7篮板,沃克18分,盖伊13分
海鹰数据:https://www.ikjzd.com/w/2539
汇通天下物流:https://www.ikjzd.com/w/2055
马士基集团:https://www.ikjzd.com/w/1296
口述:新婚夜 老公的哥们睡在新床上:http://lady.shaoqun.com/m/a/3744.html
速卖通2019年招商政策及运营方向解读:https://www.ikjzd.com/home/18011
口述:前妻与我合租只是情欲游戏:http://lady.shaoqun.com/a/273434.html

清明扫墓有啥禁忌?农村老人说保持“和谐”,啥是和谐?

后天就是我国传统的节日清明节,这是人们扫墓祭祖的日子,人们扫墓除了祭奠先人,也是希望先人在天有灵,保佑子孙后代平平安安,因此,清明上坟扫墓有诸多禁忌,我国幅员辽阔,千里不同风,百里不同俗,但是扫墓的禁忌却都有一个共同点,那就是保持与先人的"和谐"。


坟墓所在的地方虽然是先人长眠,但是人鬼殊途,在世上人们还是普遍认为阴森、不干净,因为除了先人外,还有其他人们心中认定的鬼神存在,比如阎王爷、黑白无常、勾魂使者等,清明扫墓既要孝敬先人,也要打点好其它鬼神,保持"和谐",才能不会被不干净的东西损伤身体。


万物阴阳调和,天地有阴阳,男女有阴阳,有阳间阴间之说法,在世的人是阳,去世的人是阴,扫墓时若是阳气太盛,会压制阴,也会出现适得其反的局面,阴压住阳更会自损其身,所以大部分地区上坟怀孕的妇女、孩童不让跟着扫墓,就是这样的人群阳气弱,扫墓很容易招惹不干净的东西,所谓中邪,归根到底就是没有处理好"和谐"。


阳压制阴更不行,那样无疑于挑衅先人,所以人们扫墓时不能携带铁器、镜子等五行相克东西,这样就会完全压制阴,想想这种关系的不和谐如何求的先人庇佑,我们扫墓点香烛的目的不就是讨好看管坟墓的土地神吗?烧纸钱一部分是给先人,一部分也是讨好阴间里所谓的各种长官吗?所以扫墓"和谐"非常重要。


不仅如此,扫墓的时间一般都是清明期间的上午,具体时间为卯时,因为此时天似亮非亮,天地处于阴气下降,阳气上升的"和谐"点,这个时辰扫墓,阴阳调和,对双方都有利,就像我们到医院看望病人一样,不都是选择上午去看望,没有人选择下午再去看望病人的吧?其实,这都是阴阳和谐,才能达到万物的中和。


总之,清明扫墓祭奠先人,缅怀先烈,这是我国传统的祭祀日子,扫墓禁忌很多,归根结底就是保持"和谐",你们认为对不对?



    上一篇: 赵丽颖冯绍峰离婚:婚姻中,要当心"刺猬效应"


    下一篇: 代课教师性侵4女童获刑 受害者均为留守儿童



原文转载:http://lady.shaoqun.com/a/303898.html

跨境电商:https://www.ikjzd.com/

亿恩网:https://www.ikjzd.com/w/1461

outfit:https://www.ikjzd.com/w/938


后天就是我国传统的节日清明节,这是人们扫墓祭祖的日子,人们扫墓除了祭奠先人,也是希望先人在天有灵,保佑子孙后代平平安安,因此,清明上坟扫墓有诸多禁忌,我国幅员辽阔,千里不同风,百里不同俗,但是扫墓的禁忌却都有一个共同点,那就是保持与先人的"和谐"。坟墓所在的地方虽然是先人长眠,但是人鬼殊途,在世上人们还是普遍认为阴森、不干净,因为除了先人外,还有其他人们心中认定的鬼神存在,比如阎王爷、黑白无常、勾
执御:https://www.ikjzd.com/w/717.html
乐宝:https://www.ikjzd.com/w/2200
Sunrate:https://www.ikjzd.com/w/2685
用数据说话:wish平台政策走势与运营方向解读:https://www.ikjzd.com/home/60010
500亿之后,特朗普或将对额外2000亿美元中国商品征收10%关税!:https://www.ikjzd.com/home/2057
如何审查自己在亚马逊刊登的产品是否安全?:https://www.ikjzd.com/home/111170

记一次 .NET医疗布草API程序 内存暴涨分析

一:背景

1. 讲故事

我在年前写过一篇关于CPU爆高的分析文章 再记一次 应用服务器 CPU 暴高事故分析,当时是给同济做项目升级,看过那篇文章的朋友应该知道,最后的结论是运维人员错误的将 IIS 应用程序池设成 32bit 导致了事故的发生,这篇算是后续😂😂😂,拖了好久才续上哈。

犹记得那些天老板天天找我们几个人开会,大概老板是在传导甲方给过来的压力,人倒霉就是这样,你说 CPU 爆高可怕吧,我硬是给摁下去了,好了,Memory 又爆高了,尼玛我又给摁下去了,接着数据库死锁又来了,你能体会到这种压力吗?🤣 就像我在朋友圈发的那样,程序再不跑我就要跑了。

所以有时候敬敬风水还是很有必要的,有点扯远了哈,这篇我们来看看程序的内存暴涨如何去排查,为了让你更有兴趣,来一张运维发的内存监控图。

从图中可以看出,9点开始内存直线暴涨,绝对惊心动魄,要是我的小诺安这样暴涨就好了🤑🤑🤑,接下来 windbg 说话。

二: windbg 分析

1. 说一下思路

内存暴涨了,最怕的就是 非托管层 出了问题,它的排查难度相比 托管层 要难10倍以上,所以遇到这类问题,先祈祷一下吧,gc堆也罢,loader堆也不怕,所以先看看是否 进程内存 ≈ gc堆内存 ?

2. 排查托管还是非托管

排查方式也很简单,通过 !address -summary 看看进程的已提交内存,如下输出:

0:000> !address -summary--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotalMEM_FREE        261  7fb`4b151000 ( 7.982 TB)   99.77%MEM_RESERVE        278  2`6aafc000 ( 9.667 GB) 51.35% 0.12%MEM_COMMIT        2199  2`4a3a3000 ( 9.160 GB) 48.65% 0.11%

可以看到已提交内存是 9.1G,接下来看下 gc 堆的大小,使用 !eeheap -gc 即可。

0:000> !eeheap -gcNumber of GC Heaps: 8------------------------------Heap 0 (0000000002607740)generation 0 starts at 0x00000001aaaa5500generation 1 starts at 0x00000001aa3fd070generation 2 starts at 0x0000000180021000Heap 7 (0000000002713b40)generation 0 starts at 0x000000053b3a2c28generation 1 starts at 0x000000053a3fa770generation 2 starts at 0x0000000500021000------------------------------GC Heap Size:   Size: 0x1fdfe58c8 (8556271816) bytes.

从最后一行输出中可以看到当前的占用是 8556271816 / 1024 /1024 /1024 = 7.9G ,太幸运了,果然是托管层出了问题,gc 上有大块脏东西,这下有救了 😁😁😁。

3. 查看托管堆

知道托管堆出了问题后,接下来就可以用 !dumpheap -stat 去gc堆上翻一翻。

0:000> !dumpheap -statStatistics:    MT Count TotalSize Class Name000007fef7b5c308 32867  788808 System.DateTime000007fef7b5e598 33049  793176 System.Boolean000007feec7301f8 30430  1217200 System.Web.HttpResponseUnmanagedBufferElement000007fef7b56020  2931  3130928 System.Object[]000007fef7b580f8 219398  5265552 System.Int32000007fe9a0c5428 46423  7799064 xxx.Laundry.Entities.V_InvoiceInfo000007fef7b59638 164418  7892064 System.Text.StringBuilder000007fef7b56980 164713  10059852 System.Char[]000007fef7b5a278  7351  26037217 System.Byte[]000007fe9a0d8758  35  28326856 xxx.Laundry.Entities.V_ClothesTagInfo[]0000000002536f50 76837  77016088  Free000007fe9a327ab0 46534 312964608 xxx.Laundry.Entities.V_InvoiceClothesInfo[]000007fe9a0c4868 2068912 397231104 xxx.Laundry.Entities.V_ClothesTagInfo000007fef7b55b70 98986851 3483764540 System.String000007fe9a10ef80 23998759 3839801440 xxx.Laundry.Entities.V_InvoiceClothesInfoTotal 126039641 objects

我去,托管堆上的 xxx.Laundry.Entities.V_InvoiceClothesInfo 对象居然高达 2399w ,占了大概 3.6G,这还不算其附属对象,对了,如果直接用 !dumpheap -mt xxx 输出 address 的话,很难进行UI中止,所以这里有一个小技巧,用 range 来限定一下,如下代码所示:

0:000> !dumpheap -mt 000007fe9a10ef80 0 0000000180027b30   Address    MT  Size0000000180027800 000007fe9a10ef80  160  0000000180027910 000007fe9a10ef80  160  0000000180027a20 000007fe9a10ef80  160  0000000180027b30 000007fe9a10ef80  160  Statistics:    MT Count TotalSize Class Name000007fe9a10ef80  4   640 xxx.Laundry.Entities.V_InvoiceClothesInfoTotal 4 objects

4. 查找引用根

接下来用 !gcroot 随便找一个 address 查看它的引用链,看看它到底被谁引用着?

0:000> !gcroot 0000000180027800HandleTable: 00000000013715e8 (pinned handle) -> 000000058003c038 System.Object[] -> 00000004800238a0 System.Collections.Generic.List`1[[xxx.Laundry.APIService.Models.Common.BaseModel, xxx.Laundry.APIService]] -> 0000000317e01ae0 xxx.Laundry.APIService.Models.Common.BaseModel[] -> 000000028010caf0 xxx.Laundry.APIService.Models.Common.BaseModel -> 00000003014cbbd0 System.Collections.Generic.List`1[[xxx.Laundry.Entities.V_InvoiceInfo, xxx.Laundry.Entities]] -> 00000003014f3580 xxx.Laundry.Entities.V_InvoiceInfo[] -> 00000003014cd7f0 xxx.Laundry.Entities.V_InvoiceInfo -> 000000038cc49bf0 System.Collections.Generic.List`1[[xxx.Laundry.Entities.V_InvoiceClothesInfo, xxx.Laundry.Entities]] -> 000000038cc49c18 xxx.Laundry.Entities.V_InvoiceClothesInfo[] -> 0000000180027800 xxx.Laundry.Entities.V_InvoiceClothesInfoFound 1 unique roots (run '!GCRoot -all' to see all roots).

从输出中可以看到,它貌似被一个 List<BaseModel> 所持有,哈哈,总算找到了,接下来就简单了,直接用 !objsize 看一看它的 size 有多大?

0:000> !objsize 00000004800238a0sizeof(00000004800238a0) = -1972395312 (0x8a6fa2d0) bytes (System.Collections.Generic.List`1[[xxx.Laundry.APIService.Models.Common.BaseModel, xxx.Laundry.APIService]])

看到上面的 -1972395312 了吗? 我去,int 类型的 size 直接给爆掉了,果然是个大对象,就是你了。。。如果非要看大小也可以,写一个脚本遍历一下。

三:总结

知道是 List<BaseModel> 做的孽后,仔细阅读了源码才知道,原来是给用户第一次数据全量同步的时候,服务端为了加速将数据缓存在 List<BaseModel> 这个静态变量中,很遗憾的是并没有在合适的时机进行释放,造成了高峰期内存直线暴增,优化方案很简单,就是修改业务逻辑咯,增加释放内存的时机。

题外话

  • 如果你遇到的是这种 Strong Handles 的静态变量,也可以直接用可视化的 dotMemory 查看。

当然你要保证你有足够的内存,毕竟也算是小10G的dump 🤣, 我的 16G 内存一下子就被吃掉了。。。

  • 善于用 String 驻留池机制来优化,看看它的源码定义吧。
 public sealed class String {  [SecuritySafeCritical]  public static string Intern(string str)  {   if (str == null)   {    throw new ArgumentNullException("str");   }   return Thread.GetDomain().GetOrInternString(str);  } }

对于那些重复度很高的string,用驻留池机制可以节省千百倍的内存空间,至于为什么可以优化,可参考我之前的文章:字符串太占内存了,我想了各种奇思淫巧对它进行压缩

更多高质量干货:参见我的 GitHub: dotnetfly









原文转载:http://www.shaoqun.com/a/713745.html

跨境电商:https://www.ikjzd.com/

landing:https://www.ikjzd.com/w/2368

好卖家:https://www.ikjzd.com/w/776


一:背景1.讲故事我在年前写过一篇关于CPU爆高的分析文章再记一次应用服务器CPU暴高事故分析,当时是给同济做项目升级,看过那篇文章的朋友应该知道,最后的结论是运维人员错误的将IIS应用程序池设成32bit导致了事故的发生,这篇算是后续😂😂😂,拖了好久才续上哈。犹记得那些天老板天天找我们几个人开会,大概老板是在传导甲方给过来的压力,人倒霉就是这样,你说CPU爆高可怕吧,我硬是给摁下去了,好了
easel:https://www.ikjzd.com/w/1721
心怡科技:https://www.ikjzd.com/w/1327
trax:https://www.ikjzd.com/w/1489
亚马逊选品:https://www.ikjzd.com/w/1042
Facebook营销策略:独立站流量转化终极答案:https://www.ikjzd.com/home/132459
新增190万新卖家?!这个平台"疯"了:https://www.ikjzd.com/home/133990

关于关键词排名提高的秘密!

亚马逊老鸟都知道,一个listing基本上流量的构成就是搜索流量和关联流量,其中占大头就是关键词的搜索流量了,通常大多情况下能占到整体流量的七成左右。如果产品处于新品期的话,搜索流量的占比会更大,有时候甚至能达到百分百,这也很好理解,因为新品前期没有流量和销量,是很难和其他产品形成关联的,所以自然搜索流量就占了绝大多数比重了。

所以说,想要获取到更多的流量,特别是在新品期,性价比最高也是最常用的方法就是提高关键词的自然排名了,所谓自然排名对应的就是自然流量,相较于广告来说,就是不花钱的流量。

一旦聊到提高关键词自然排名,很多亚马逊老铁第一印象肯定是刷单,但是刷单属于违反亚马逊规定的行为,稍有不慎就会导致账号被封,所以不在我们今天的讨论的范围之内。今天我们重点说一下第二种,一种非常白帽的提高关键词排名的手段,也就是大家熟知的亚马逊站内广告。

01

那么站内广告对于自然排名的促进作用到底有多大呢?单纯说理论未免太枯燥,而且不具备说服力,直接看案例可能会更合适,所以下面说一下我们最近做的一项比较测试的结果:

第一步,我们选取两个同类产品的ASIN(ASIN1 和 ASIN2),两个ASIN都是尚处在新品期,且共享一个核心关键词(Keyword A)。

第二步,其中ASIN 1通过站外放量来推广关键词的自然排名,放量的时候用的是针对Keyword A的二次跳转链接;对于ASIN 2我们采取的是比较激进的广告策略,针对Keyword A 设置一个商品推广广告里面的精准匹配,然后给到了高于建议出价两倍以上的价格,预算也相对更集中在这个词。

第三步,ASIN 1和ASIN 2虽然有不同的放量策略,但是保证每天两个ASIN的订单数量一致,让这个状态持续保持一周的时间,同时用工具持续监测Keyword A的自然排名变动轨迹。


一周以后,测试结果出来了,两者的差距还是很明显的。由于自然排名每天都有波动,很难摆出来具体的数值,所以我说一个大概的情况以供大家参考:ASIN 1 之于 Keyword A 的自然排名处在第三页靠前的位置,增长势头趋缓,但是ASIN 2 之于 Keyword A的自然排名已经冲到了首页靠后的位置了,而且一直有持续往前冲的势头。由此可见,站内广告对于提高相应关键词的自然排名有着非常大的作用,且在所有推排名渠道里面处于比较优势的地位。 

看到这里我相信有的老铁可能会说,如果是大词的话,为了推大词的自然排名,直接用高竞价和高预算去打这个大词的话,整个广告数据会比较难看,整体应该也会大幅超标。那么有没有相对来说更经济的做法呢?首先我想说的是如果你的广告目标是推高特定词的自然排名的话,你就不应该把广告数据诸如ACOS这些看的太重,因为只要达到了那个目标自然排名,这些所谓广告亏损的花费就当作推广费用了,只要亏损不超过既定的推广费用,就属于正常范围,毕竟哪有推广是不花钱的呢?如果是这样的话,ACOS和ROAS之类的指标其实意义不大。

02

当然了,话又说回来,相对于大词直接打精准匹配这个烧钱的方法外,的确还有一个相对来说更经济的方法,不过推自然排名的速度相对来说会缓慢一些。

这个方法具体做法就是针对想要推广自然排名的Keyword A, 搜集他的Phrase匹配模式下的精准长尾词,然后把这些长尾Keyword A给设置成精准匹配,通过去烧这些长尾Keyword A的广告, 从而提高这些长尾Keyword A的关键词自然排名,最终来实现我们提高Keyword A关键词自然排名的目的。


这里面的逻辑其实也很好理解,相当于我们把 CAB, ABC, CABD等等一系列AB的phrase匹配长尾词给推上去了,AB这个大词自然而然就会上去的。我们这么做的优势在于:推大词AB整体花费巨大,难度也大,且效果不一定能保证;但是推AB的Phrase匹配长尾词,不论是成功率还是花费,相较来说都会好很多的。

03

以上就是关于如何利用站内广告去推高相应关键词自然排名的思路和方法,相信各位老铁应该也理解了。接下来,我再给大家补充一个除了ACOS和ROAS之外,一个全新的广告指标:广告订单占比。如果你打广告是以提高关键词自然排名为主要目的,你可以不看ACOS和ROAS这些传统的广告数据指标,但是广告订单占比这个指标还是要看的,里面藏了不少的玄机。

简单来说,所谓的广告订单占比,其实就是广告创造的销售额占整个产品的总销售额的比例。如果你的广告销量占总体销量的20%, 那么剩下的自然销量就是80%, 两者的比值就是1:4。如果广告销量占总体销量的比例偏小的话,比如低于10%,那说明你并没有把广告的威力给发挥出来,特别是在新品期的时候,如果广告订单占比低于10%, 那只能说明你完全放弃了站内广告这把利器,这并不是一件好事儿,说明你得加大广告的使用和投放力度。


但是,如果你的广告订单占比超过60%的话,那么你可能存在广告超标的可能性,所谓广告超标就是说:一旦你想要控制ACOS,降低竞价和预算,马上产品销量就会断崖式下跌,但是不去控制的话,又会面临巨额的广告亏损,面临一种骑虎难下的状态。这种情况一般都是前期想通过广告销量去冲关键词自然排名,采取比较激进的广告策略,但是冲击情况并不理想,自然排名没上去所以自然销量也跟不上,这样就导致了广告销量长期位于高比例这种情况,而且这个时候产品也过了新品期,这种情况想要再调整就非常难了。

总的来说,我个人觉得比较健康且合适的广告订单占比应该是在20%-40%之间,这样属于非常合适的一个状态,既发挥出了广告的巨大优势,又没有广告超标的风险。对了,还有一点忘了说,如果是在新品推广期,而且又把广告当做推广关键词排名的重要手段的话,广告订单占比到90%也是OK的,但是慢慢的要压回到正常的20%-40%这个区间,不然的话又会面临在后期广告超标的风险,一般过了新品期,广告打很久以后再想要调整就非常的困难了。


文章来源:https://www.ikjzd.com/home/144464

跨境电商:https://www.ikjzd.com/

空中云汇:https://www.ikjzd.com/w/2684

东西网:https://www.ikjzd.com/w/1238

俄罗斯灰色清关:https://www.ikjzd.com/w/1409

关于关键词排名提高的秘密!

亚马逊老鸟都知道,一个listing基本上流量的构成就是搜索流量和关联流量,其中占大头就是关键词的搜索流量了,通常大多情况下能占到整体流量的七成左右。如果产品处于新品期的话,搜索流量的占比会更大,有时候甚至能达到百分百,这也很好理解,因为新品前期没有流量和销量,是很难和其他产品形成关联的,所以自然搜索流量就占了绝大多数比重了。所以说,想要获取到更多的流量,特别是在新品期,性价比最高也是最常用的方法

瓜帅复仇波叔带队强势逆转 欧冠淘汰赛胜场第一人_瓜迪奥拉

原标题:瓜帅复仇波叔带队强势逆转 欧冠淘汰赛胜场第一人

上周末的联赛杯决赛,瓜迪奥拉刚刚创造了一系列纪录,拿下冠军的同时,也成为联赛杯历史上首位实现四连冠的主教练。执教生涯仅仅开始12年,瓜迪奥拉就拿到了30个冠军,在足坛历史上排名第三。当然这已经成为历史,今天凌晨和大巴黎的比赛,是瓜迪奥拉首次带领曼城出征欧冠半决赛。

和本赛季重点赛事一样,本场比赛瓜迪奥拉也是排出了无锋阵,德布劳内顶在最前面。上半场比赛,一方面是保守稳定局面的心态,另外一方面大巴黎的攻势也是接连不断,导致曼城无论在控球、场面还是比分上都处于落后局面。中场休息时,瓜迪奥拉显然对球员进行了相关传达和调整,并且在第62分钟用津琴科换下了本场表现不佳的坎塞洛。随后,德布劳内立马破门,马赫雷斯利用任意球逆转比分。

尽管是两个非典型进球,但是下半场传导节奏加快,并且在扛过上半场的被动后,下半场主动出击是曼城得意反超的关键。在波切蒂诺的较量中,这次瓜帅报了之前欧冠被热刺淘汰的一箭之仇。本场比赛明显是占据优势的,波切蒂诺直到比分落后,格耶被红牌罚下后才知道换人调整,但是为时已晚,落后一球且少打一人的他们根本没有了反扑能力,只能眼睁睁看着曼城从主场带走胜利。此役过后,瓜帅取得执教生涯第34场欧冠淘汰赛胜利,成为历史上在欧冠淘汰赛取胜场次最多的主帅,目前瓜迪奥拉执教生涯总共带队参加了62场欧冠淘汰赛(包括决赛),本赛季西班牙人有机会继续刷新自己的纪录。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/572765.html

跨境电商:https://www.ikjzd.com/

farfetch:https://www.ikjzd.com/w/2133

福茂:https://www.ikjzd.com/w/1633


原标题:瓜帅复仇波叔带队强势逆转欧冠淘汰赛胜场第一人上周末的联赛杯决赛,瓜迪奥拉刚刚创造了一系列纪录,拿下冠军的同时,也成为联赛杯历史上首位实现四连冠的主教练。执教生涯仅仅开始12年,瓜迪奥拉就拿到了30个冠军,在足坛历史上排名第三。当然这已经成为历史,今天凌晨和大巴黎的比赛,是瓜迪奥拉首次带领曼城出征欧冠半决赛。和本赛季重点赛事一样,本场比赛瓜迪奥拉也是排出了无锋阵,德布劳内顶在最前面。上半场比
邮乐网购物商城:https://www.ikjzd.com/w/1776
泛亚班拿:https://www.ikjzd.com/w/1262
sgshop:https://www.ikjzd.com/w/1982
亚马逊旺季来袭,你做好这些爆单准备了吗?:https://www.ikjzd.com/home/108113
骗子狂卷3700万英镑,亚马逊Prime订阅服务电话诈骗风波!:https://www.ikjzd.com/home/108977
日本站FBA仓库设置库存保管上限!接下来是...:https://www.ikjzd.com/home/112353

surging 如何使用流媒体服务

前言

随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼、虎牙、抖音都随着直播业的大火而欣欣向荣,

大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频直播平台呢?那么针对于这个问题就是我今天想给大家讲解的一些东西,首先要对直播协议有所了解,然后怎么样使用作者研发的surging 去搭建直播平台,首先接下来,我就给大家简单介绍下常见的直播协议。

 

常见的直播协议

国内常见的直播协议有几个:RTMP、HLS、HTTP-FLV,下面我们来一一介绍。

RTMP,全称 Real Time Messaging Protocol,即实时消息传送协议。Adobe 公司为 Flash 播放器和服务器之间音视频数据传输开发的私有协议。工作在 TCP 之上的明文协议,默认使用端口 1935。协议中的基本数据单元成为消息(Message),传输的过程中消息会被拆分为更小的消息块(Chunk)单元。最后将分割后的消息块通过 TCP 协议传输,接收端再反解接收的消息块恢复成流媒体数据。

RTMP 主要有以下几个优点:RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出。现在 PC 市场巨大,PC 主要是 Windows,Windows 的浏览器基本上都支持 Flash。另外RTMP适合长时间播放,曾经有过测试,连续 10 天多连续播放没有出现问题。最后 RTMP 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。

当然 RTMP 并没有尽善尽美,它也有不足的地方。一方面是它是基于 TCP 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 RTMP 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放。

FLV (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。其格式相对简单轻量,不需要很大的媒体头部信息。整个 FLV 由 The FLV Header, The FLV Body 以及其它 Tag 组成。因此加载速度极快。采用 FLV 格式封装的文件后缀为 .flv。

而我们所说的 HTTP-FLV 即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输给客户端。

HTTP-FLV 依靠 MIME 的特性,根据协议中的 Content-Type 来选择相应的程序去处理相应的内容,使得流媒体可以通过 HTTP 传输。相较于 RTMP 协议,HTTP-FLV 能够好的穿透防火墙,它是基于 HTTP/80 传输,有效避免被防火墙拦截。除此之外,它可以通过 HTTP 302 跳转灵活调度/负载均衡,支持使用 HTTPS 加密传输,也能够兼容支持 Android,iOS 的移动端。

说了这么多优点,也来顺便说下 HTTP-FLV 的缺点,由于它的传输特性,会让流媒体资源缓存在本地客户端,在保密性方面不够好。因为网络流量较大,它也不适合做拉流协议。

 

上述两个协议都是有Adobe公司推出的,而下面要讲的 HLS (HTTP Live Streaming) 则是苹果公司基于 HTTP 的流媒体传输协议。主要应用于 iOS 设备,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音视频直播服务和录制内容(点播)等服务。

相对于常见的流媒体协议,HLS 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 M3U8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。

流媒体协议 RTMP, HTTP-FLV, HLS 简单对比

协议 传输协议格式延时
rtmpTcpflv1-3秒
http-flvhttpflv1-3秒
hlshttpm3u84-10秒

 

 

 

 

 

RTMP 协议为流媒体而设计,在推流中用的比较多,同时大多 CDN 厂商支持RTMP 协议。

HTTP-FLV 使用类似 RTMP流式的 HTTP 长连接,需由特定流媒体服务器分发的,兼顾两者的优点。以及可以复用现有 HTTP 分发资源的流式协议。它的实时性和 RTMP 相等,与 RTMP 相比又省去了部分协议交互时间,首屏时间更短,可拓展的功能也更多。

HLS 作为苹果提出的直播协议,在 iOS 端占据了不可撼动的地位,Android 端也同时提供相应的支持。

如何架构实现

 

 rtmp 协议架构图

调度服务网关是针对于外网服务调用, , 提供基于rest 查询流对应的服务器地址。

直播终端通过调度服务网关获取的rtmp 服务地址,通过地址进行推流,rtmp服务获取到数据后,然后转推到其它的rtmp服务上,rtmp再把流推给订阅的客户端

 

 http-flv 架构图

以上是通过rtmp 服务转推给http-flv 订阅的客户端

基于surging 微服务引擎如何实现

比如现在需要获取live1/livestream直播地址, 那么首先可以通过地址/locate 获取wanip外网地址, routepath 是rtmp服务的服务路由路径,key是直播需要传过去地址livestream,然后rtmp 端口定义为76,那么接下来获取的地址就是

surging 需要引用liveStream 模块,这样就能支持直播协议rtmp,http-flv,hls(暂时还未实现),然后还需要通过配置surgingsetting, 配置如下:

 "LiveStream": { "RtmpPort": 76, //rtmp 端口 "HttpFlvPort": 77, //HttpFlv 端口 "EnableLog": true, //是否启用log "RouteTemplate": "live1", //直播服务路由规则名称,可以根据规则设置,比如集群节点2,可以设置live2, 集群节点3,可以设置live3 "ClusterNode": 2 //集群节点数里,会根据routetemplate 转推流 }

然后可以通过ffmpeg或者obs进行推流,以ffmpeg 工具为例,可以输入以下命令

ffmpeg -re -i D:/大H包.HDTC1280高清国语中字版.mp4 -c copy -f flv rtmp://127.0.0.1:76/live1/livestream2

 客户端采用PotPlayer进行播放,比如可以添加地址rtmp://127.0.0.1:76/live1/livestream2 ,如果你部署了另外一台rtmp服务,设置的是65端口,那么可以添加rtmp://127.0.0.1:65/live1/livestream2进行播放

 

 

 可以支持一台N个推流,N个订阅播放,如下图:

 总结

surging 现在分为两个版本,一个是社区版本surging ,一个是企业版本microsurging/SurgingVista, 企业版不仅功能强大,支持流媒体服务等协议组件和中间件,并且还支持多语言定制化需求,完全可以满足各大公司的需要,如有意见,可以和作者联系。

 

 









原文转载:http://www.shaoqun.com/a/713737.html

跨境电商:https://www.ikjzd.com/

stylenanda官网:https://www.ikjzd.com/w/1675.html

tenso:https://www.ikjzd.com/w/1552


前言随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼、虎牙、抖音都随着直播业的大火而欣欣向荣,大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频直播平台呢?那么针对于这个问题就是我今天想给大家讲解的一些东西,首先要对直播协议有所了解,然后怎么样使用作者研发的surging去搭建直播平台,首先接下来,我就给大家简单介绍下常见的直播协议。常见的直播协
moss:https://www.ikjzd.com/w/1653
菜鸟网络:https://www.ikjzd.com/w/1547
myshow:https://www.ikjzd.com/w/2235
养殖场_养殖场新闻资讯_养殖场报道:http://tech.shaoqun.com/s/%E5%85%BB%E6%AE%96%E5%9C%BA.aspx
最全 | 跨境的邮件营销介绍:https://www.ikjzd.com/home/18151
35岁少妇口述换妻 匪夷所思!不能接受:http://www.30bags.com/m/a/254030.html

Zookeeper系列(4):搭建Zookeeper集群

简介

Zookeeper集群主要解决单节点故障问题以及提高整体并发访问能力。

Zookeeper集群具有以下特点:

  1. Zookeeper集群有一个leader服务器和多个follower服务器,leader是运行时动态选举出来的。

  2. Zookeeper集群中只要由半数以上的节点可用,Zookeeper集群就能正常提供服务。

  3. Zookeeper集群中每个服务器保存一份相同的数据副本,客户端无论连接哪台服务器,数据都是一致的。

  4. 更新请求顺序进行,来自同一个客户端的更新请求按其发送的顺序依次执行。

  5. 数据更新原子性,一次数据要么更新成功,要么更新失败。

  6. 实时性,在一定时间范围内,客户端能读到最新数据。

集群搭建

搭建Zookeeper集群至少需要三台服务器,并且服务器应该是奇数台。

假如集群只有两台服务器,那么其中任意一台服务器发生故障,集群就不可用了(集群中可用节点数量需要大于一半才可用),由于存在两个单点故障,因此两个服务器还不如单个服务器稳定。

下面将介绍如何在单台机器上搭建三个Zookeeper服务组成的集群。

1.创建三个dataDir:
mkdir /opt/zkdata1 /opt/zkdata2 /opt/zkdata3
2.分别在三个dataDir中创建myid文件,并在myid文件中指定服务器标识:
[root@localhost opt]# touch ./zkdata1/myid ./zkdata2/myid ./zkdata3/myid[root@localhost opt]# echo 1 > ./zkdata1/myid[root@localhost opt]# echo 2 > ./zkdata2/myid[root@localhost opt]# echo 3 > ./zkdata3/myid
3.创建三个Zookeeper配置文件,并添加集群配置:

zoo1.cfg:

tickTime=2000initLimit=10syncLimit=5# 指定数据存储位置dataDir=/opt/zkdata1# 指定客户端连接的端口clientPort=2181# 指定集群中服务器# 端口1:用于数据同步# 端口2:用于leader选举server.1=localhost:2880:3881server.2=localhost:2882:3883server.3=localhost:2884:3885

zoo2.cfg:

tickTime=2000initLimit=10syncLimit=5# 指定数据存储位置dataDir=/opt/zkdata2# 指定客户端连接的端口clientPort=2182# 指定集群中服务器# 端口1:用于数据同步# 端口2:用于leader选举server.1=localhost:2880:3881server.2=localhost:2882:3883server.3=localhost:2884:3885

zoo3.cfg:

tickTime=2000initLimit=10syncLimit=5# 指定数据存储位置dataDir=/opt/zkdata3# 指定客户端连接的端口clientPort=2183# 指定集群中服务器# 端口1:用于数据同步# 端口2:用于leader选举server.1=localhost:2880:3881server.2=localhost:2882:3883server.3=localhost:2884:3885
4.分别启动各个服务器:

依次启动服务器1、2、3。

[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfgStarting zookeeper ... STARTED[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfgStarting zookeeper ... STARTED[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfgStarting zookeeper ... STARTED
5.集群搭建完毕,可以使用客户端连接任意一台服务器进行操作:

连接服务器3,创建新的节点,连接服务器1,查看新创建的节点。

[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkCli.sh -server localhost:2183[zk: localhost:2183(CONNECTED) 1] ls /[zookeeper][zk: localhost:2183(CONNECTED) 2] create /mynode1 mydata1Created /mynode1[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkCli.sh -server localhost:2181[zk: localhost:2181(CONNECTED) 1] ls /[mynode1, zookeeper]

选举机制

集群中节点状态分为以下几种:

  1. LOOKING:表示当前集群中没有leader节点,需要进行选举。

  2. LEADING:表示当前节点为leader。

  3. FOLLOWING:表示leader已经被选出,当前节点为follower。

  4. OBSERVER:表示当前节点为observer。

查看集群中各个服务器角色信息:

[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfgClient port found: 2182. Client address: localhost. Client SSL: false.Mode: leader[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfgClient port found: 2183. Client address: localhost. Client SSL: false.Mode: follower

可以看出服务器2被选举为leader,服务器1和服务器3为follower。选举流程如下:

  1. 服务器1和服务器2启动后进入LOOKING状态,开始进行Leader选举。

  2. 每个服务器都会发出一个投票,在初始阶段,服务器1和服务器2将投票自己作为Leader服务器,每次投票都会包含推荐服务器的myid和zxid,然后将每个投票发送给集群中的其他服务器。

  3. 集群中的每个服务器接收到投票后,首先判断投票的有效性,例如是否为当前轮投票,是否来自处于LOOKING状态的服务器。

  4. 每个服务器都会将其他服务器的投票和自己的投票进行对比,首先对比zxid,较大zxid的服务器优先作为leader。如果zxid一样,则比较myid,myid较大的优先作为leader。

  5. 由于是集群初始化阶段,每个服务器的zxid都为0,所以开始比较myid,服务器2的myid较大,所以服务器2获胜。服务器1将其投票更新为投给服务器2,并将投票重新发送给服务器2,此时服务器的票数已经超过集群节点半数,服务器2被选为leader。

  6. 一旦确定了leader,每个服务器将更新自己的状态。服务器1将状态改为FOLLOWING,服务器2将状态改为LEADING,当服务器3启动时,发现已经有一个Leader,不再进行选举,直接将状态从LOOKING改为FOLLOWING。

当作为leader的服务器2被停止后,又会重新进行leader选举。停止服务器2:

[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfgStopping zookeeper ... STOPPED

再次查看各个服务器角色信息:

[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg ZooKeeper JMX enabled by defaultUsing config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfgClient port found: 2183. Client address: localhost. Client SSL: false.Mode: leader

此时服务器3被选举为leader,原因是服务器3最近创建了节点,拥有了比服务器1更大的zxid,所以服务器3被选举为leader。(节点的变化会导致zxid递增)

数据写入流程

在Zookeeper集群中,客户端可用连接集群中任意一台服务器进行操作。

如果是读请求,则直接从当前服务器读取数据。

如果是写请求则分为以下步骤:

  1. 如果请求的服务器不是leader,则当前请求的服务器会把请求转发给leader。

  2. leader将写请求广播给各个服务器,各个服务器写成功后会通知leader。

  3. 当leader收到大多数服务器写成功的通知,则表示写入成功,leader将通知之前的接收请求的服务器,由它进一步的通知客户端写入成功。









原文转载:http://www.shaoqun.com/a/713735.html

跨境电商:https://www.ikjzd.com/

DMM:https://www.ikjzd.com/w/2026

acedota:https://www.ikjzd.com/w/2070


简介Zookeeper集群主要解决单节点故障问题以及提高整体并发访问能力。Zookeeper集群具有以下特点:Zookeeper集群有一个leader服务器和多个follower服务器,leader是运行时动态选举出来的。Zookeeper集群中只要由半数以上的节点可用,Zookeeper集群就能正常提供服务。Zookeeper集群中每个服务器保存一份相同的数据副本,客户端无论连接哪台服务器,数据
徐家骏:https://www.ikjzd.com/w/1803
e邮包:https://www.ikjzd.com/w/594.html?source=tagwish
欧舒丹:https://www.ikjzd.com/w/1756
崩溃了!签收上架速度时快时慢,卖家Q3季度补货难!:https://www.ikjzd.com/home/125166
口述:做完胸部整形手术后 老公不再摸我了:http://lady.shaoqun.com/m/a/10895.html
和新电商:https://www.ikjzd.com/w/2072

气血两虚吃什么好?女性补气血食补餐单推荐

核心提示:目前很多女性气血不足,可能是微量元素缺乏,经血过多所致。女人气血虚食补吃什么好?

很多女性都有气血不足的问题,可能是微量元素缺乏,经血过多所致。女性朋友如果发现自己气血不足,可以通过食疗调理,很多食物都有补气血的作用。那么,女人气血虚食补吃什么好?今天就来给大家做介绍。


桂圆:吃桂圆可以滋养气血,特别是补身体精华。女性如果患有气血两虚,经期出现感冒、月经延迟、血块等症状,可以在月经前几天喝一些桂圆红枣汤,可以补充气血,有效改善不良症状。

银耳:很多女性喜欢吃银耳,银耳有美白功效,可以补充皮肤缺乏的胶原蛋白,是一种极好的美容食品。其实银耳也有补气养血的作用,气血两虚的女性可以经常吃一些银耳。

红枣:相信大家都吃过红枣,女性朋友如果气血亏虚,可以多吃红枣。女性多吃红枣能滋养气血,滋养身体,无论生吃还是用来煲汤,都很好。

苹果:苹果是最常见的水果,它营养丰富,不仅含有多种维生素,而且富含铁。女性常吃苹果,可以补铁补血,改善气血不足的症状。

玫瑰花:玫瑰花具有疏肝理气、宁心安神的功效。泡茶的时候放几朵玫瑰,不仅有平复气息的效果,还很赏心悦目。没有喝茶习惯的女性可以单独冲泡玫瑰,或者在客厅的花瓶里插上芬芳的玫瑰,吸进鲜花,让心灵平静。

柑橘:柑橘不仅味道香甜,还具有行气、扩胸的作用。除了果肉,橘络也有一定的药用价值,饮橘络,可通络化痰,理气消积。

山楂:山楂有活血化淤、减肥降脂的作用。生吃、熟吃、泡水吃,各种吃法都是有效的,但胃酸过多的女性慎用。


萝卜:萝卜有健胃清热化痰的功效,青萝卜疗效最好,其次是红皮白心。对于胃寒的女性,可以加入排骨、牛肉等炖萝卜汤。

茴香:茴香果实可以药用,幼叶可食用,种子和叶子都有行气的功能。煮馅或用叶煸炒,可以起到行气、健胃、止痛的作用。

39健康网()原创内容,未经授权不得转载,违者必究。内容合作请联系:020-85501999-8819或39media@mail.39.net

原文转载:http://health.shaoqun.com/a/238183.html

跨境电商:https://www.ikjzd.com/

环球b2b:https://www.ikjzd.com/w/1762

史泰博:https://www.ikjzd.com/w/2112


核心提示:目前很多女性气血不足,可能是微量元素缺乏,经血过多所致。女人气血虚食补吃什么好? 很多女性都有气血不足的问题,可能是微量元素缺乏,经血过多所致。女性朋友如果发现自己气血不足,可以通过食疗调理,很多食物都有补气血的作用。那么,女人气血虚食补吃什么好?今天就来给大家做介绍。桂圆:吃桂圆可以滋养气血,特别是补身体精华。女性如果患有气血两虚,经期出现感冒、月经延迟、血块等症状,可以在月经前几天喝
costco:https://www.ikjzd.com/w/1680
关键词分析工具:https://www.ikjzd.com/w/1968
mil:https://www.ikjzd.com/w/1285
口述:他远渡重洋我们的爱情如昙花一现(4/4):http://lady.shaoqun.com/m/a/45856.html
美国豁免口罩等进口关税!三巨头10万员工受波及......:https://www.ikjzd.com/home/117867
女友骑在我身上接情人电话:http://lady.shaoqun.com/a/272542.html

2021-04-28

厅官与多名女性发生不正当关系,纵容妻子情人收钱

作为一名领导干部,张常明本应不忘初心,牢记全心全意为人民服务的宗旨,但他却化公权为己用,身居高位后放任妻子、情人"狐假虎威"、以权谋利;秉承"一人得道鸡犬升天"之念,与熟人、朋友大搞权钱交易。他怠于修身,昧于事理,严于律人,宽以待己,最终害人、害己,令人唏嘘。

从一名农家子弟,一步步成长为一名副厅级领导干部。但随着职务升迁、权力增大,他在利益诱惑面前失去初心、逾越底线,甚至化公权为己用,身居高位后替以前的熟人、朋友谋取私利,并在生活作风上腐化堕落,最终深陷违法犯罪的泥潭。日前,湖南省长沙市检察院对永州市原副市长张常明涉嫌受贿案提起公诉,长沙市中级法院公开开庭审理了此案。

长沙市检察院指控,2008年至2016年,被告人张常明利用担任湖南省祁阳县县长、县委书记,永州市副市长等职务上的便利,为祁阳县浯溪水业有限公司、文某(另案处理)、李某(另案处理)等6家单位和个人在资产收购、承接工程、工程施工、人员聘用、开展业务、费用减免等方面谋取利益。先后直接或者通过其妻陈某(另案处理)、情人梁某(另案处理)非法收受上述单位、个人给予的财物共计折合人民币520万元。

此前,湖南省纪委通报,张常明违反政治纪律,不珍惜组织给予的机会,向组织提供虚假情况,对抗组织审查;违反组织纪律,利用职务上的便利在干部职务晋升中为他人谋取利益,弄虚作假为女儿谋取少数民族身份,享受高考加分优惠政策;违反工作纪律,违规出借公款;违反廉洁纪律、生活纪律,收受礼品礼金,与多名女性发生不正当性关系,搞钱色交易、权色交易;利用职务上的便利在企业经营等方面为他人谋取利益并收受巨额财物,涉嫌受贿犯罪。

张常明是永州市东安县人,参加工作以来,一直都在永州市工作、生活,为养育他的那方山水和人民付出了很多心力。然而,因为自己持身不廉,直接或纵容、默许妻子和情人收受贿赂520万元,最终站在了被告人席上。

1.收人一套房产,只能任人摆布

2008年,张常明担任祁阳县县长后,祁阳县决定收购本县浯溪水业有限公司的浯溪水厂,张常明出任该项工作领导小组组长。然而,收购谈判却久议未决。2010年8月,张常明的妻子陈某在浯溪水厂股东杨某之妻陶某的陪同下,乘机抵达北京某售楼处,选中了一套价值400余万元的房产。对陈某的用意陶某心知肚明,她当即决定出钱将该套房产买下。后来,经张常明同意,这套房产被挂在了当时尚在上学的女儿名下。

既然杨某投之以桃,张常明自然报之以李。接下来,张常明便利用自己职务上的便利,积极推动收购水厂相关事宜。最终,收购一事以法院调解书的方式满足了杨某的收购条件。就是这笔交易,给国家财产造成了高达6700余万元的巨额损失。

所谓吃人家的嘴软,拿人家的手短,张常明对此有深刻的体验。他在供述中称:"2011年以后,因为水厂收购的事情、土地办证的事情,还有些遗留问题,杨某又多次找到我,但是他的态度明显不一样了,以前他是求我办事,后来他好像是在指令我,态度比较强硬,讲话底气也足了,有时甚至还在我面前质问政府某些部门为什么办事不力。"

事发后,张常明为掩盖自己收受贿赂的事实,又要求陈某与陶某串供,伪造了一份陶某借其女儿张某身份证买房的协议,意图对抗调查。但后来,在他多次亲笔书写的认罪、悔过材料中,详细描述了自己纵容妻子陈某收受该套房产的详细经过以及心路历程。

然而,庭审现场,张常明又改口辩称,自己对妻子陈某收受该套房产的事完全不知情,之前的供述是不想影响到女儿。"她当时刚结婚,可能还有身孕,我心里有压力。"说出这番话时,张常明声音哽咽,神情悲戚,拳拳爱女之心尽显。

可早知今日,又何必当初呢?如果张常明当年能拒心中一时之贪念,严明家风,管好家人,又岂会将妻女莫名拖进违法犯罪的漩涡之中,乃至惶惶不可终日?

很显然,直到站在被告人席上,张常明都还没想明白,并不是杨某变了,底气更足了,而是他自己变了,一旦收了他人钱财,自己就被人抓住了把柄,自然底气不足,甚至可以说,再也没有了底气。

2.婚外养情人,帮助疏通关系谋利益

2007年底,张常明在开会时碰到了在某小学担任教师的梁某,当天两人就发生了不正当关系。

2008年,张常明利用自己身为县长的权力之便,将梁某调到祁阳县商务局。2010年,张常明成为县委书记后,还将梁某提拔为商务局外商投资中心主任。2011年,梁某离婚后,两人的交往更是一发不可收拾。

张常明有家室,但对于梁某,他比对自己的妻子和其他家人还大方,逢年过节,都给她打红包、送礼物。梁某买房买车,张常明也全力资助。短短几年间,梁某在广西桂林、湖南永州和长沙三次买房,还投资稀土公司、参股商业银行,房子越买越大,车子越开越贵,银行存款越来越多,这些钱从何而来?

据办案人员介绍,除了张常明供述中承认的由其直接"资助"的128万元外,其余的钱都是梁某靠山吃山、靠水吃水,靠上了张常明后,用他手中的权力换来的。

2013年,梁某要在祁阳买房,张常明应梁某之请,亲自给房地产老总郑某打电话。最终,梁某看中的一套市价70余万元的房子,被"优惠"了14万元之多。

不仅如此,张常明还纵容梁某打着自己的旗号招摇于市。2012年至2016年案发前,张常明利用其担任祁阳县委书记、永州市副市长的职务之便,为梁某的朋友李某在承揽工程、增加工程造价等方面打招呼、谋取利益,而梁某则5次收取李某"好处费"合计61万元。因为有了和张常明的特殊关系,梁某得以大肆敛财。最终,梁某也因涉嫌受贿罪被立案调查。

梁某在亲笔书写的交代材料中写道:"我或者我的家人确实没有投资、入股过李某所做的项目,具体的事,李某没让我做过什么,他也知道我做不了什么,实际上就是他送给我们的钱。不过我和李某是朋友,帮李某在张常明面前讲讲好话,我觉得自己好像也参与了,分一点红是正常的,而且李某做的这些事情都是通过张常明关照的,张常明也知道是李某在做生意,李某给得很自然,我也没意识到这是违法的。而且我一开始跟张常明说我收了李某的钱,张常明知道后也没说什么,以后的钱,我也就都收了。我不是一个视钱如命的人,一开始我不懂法,要是知道这个后果,我肯定不会要他的分红。"

对于梁某交代的这些情况,李某也表达出了自己的意思。他在供述中坦诚:"我没给张常明送过钱,因为他是领导。如果我直接把钱送给张常明,他收或不收,以后和他见面都会比较尴尬。我2010年就知道梁某是张常明的情人,我给梁某送钱其实也就等于感谢了张常明,感谢他对我的关照。"

在李某看来,因为知道梁某和张常明关系"亲密",她究竟是不是真的帮自己在张常明那里说了好话,李某不想确定也不需要确定,只要张常明帮忙了,只要自己的事做成了,他就给梁某"分红",他认为,这很自然。梁某收钱,也收得很坦然。梁某认为,张常明确实给李某帮忙了,而她和李某是朋友,她和张常明又"有感情",说说好话事情办成,收些感谢费也是理所当然的事。

梁某说自己不懂法,认为收钱很自然。那么,对于身为领导干部的张常明来说,收钱的事是不是一样很自然?令人意外的是,答案竟然是肯定的。庭审中,张常明辩解道,自己并没有违法违规,并没有给李某的工程项目谋取不正当利益,只是在正常履职而已,李某和梁某是朋友,有些经济往来,很自然。至于自己和梁某的"感情",本来就是"很自然"的事情,这和受贿没关系。

3.利用手中权,为亲戚承揽工程提供方便

1998年,张常明与其远房表妹文某有过一夕露水情缘。后来,文某恋爱结婚,两人来往遂断。2014年,张常明任永州市副市长后,在永州做生意的文某以亲戚串门之名,经常到张家聊天、打牌、帮忙做家务,两人由此旧情复燃。每到逢年过节,或张常明稍有病痛,文某便登门拜访、看望探视,表现得十分殷勤。

接受文某的"热情照顾"也不是白接受的,张常明知道文某最需要什么。于是,张常明利用自己担任副市长的职务便利,为文某夫妇在承揽亮化工程,路灯安装、改造工程方面打招呼,提供种种便利,为文某夫妇带去了不少物质利益。文某夫妇在生意上得了好处,自然要有所回报。2014年底,文某夫妻俩给张常明送去5万元;2016年9月,夫妻二人又送给张常明的妻子陈某15万元。对于这些"感谢",张常明夫妇心领神会,全部予以笑纳。

中央三令五申,领导干部不得收受红包礼金,可张常明却在任职期间,台上一套台下一套,表面一套背后一套。会上,他正气凛然地对下属提出廉洁方面的要求;私下,他却先后12次收受某银行行长王某送来的红包,金额合计12万余元,两次收受祁阳一家鞋材公司老板程某送来的10万元红包,并利用职务之便,分别为王某和程某谋取利益。

该案将择日宣判。

检察官说案

勤于自省拒绝诱惑,才能用好手中权走好人生路

湖南省长沙市检察院员额检察官余杰

张常明1982年大学毕业后在湖南省东安县政府工作,1984年即担任共青团东安县委副书记。历任团县委书记、副县长、县长、县委书记,直至副市长,可谓风光无限。而今站在被告人席上,不禁让人掩卷长叹。

张常明自改革开放以来就长期担任领导职务。在这样的岗位上,他本可以为官一任、造福一方,为国家用好权,为人民谋好利,但张常明却将自己的职权当作收受贿赂的筹码,纵容妻子、情人大肆敛财,为行贿人谋取利益,其行为严重败坏了党和政府的形象,破坏了国家机关正常的管理秩序,不仅其本人将受到法律的严惩,其家人、朋友及相关人员也都因他的关系触犯法网,教训惨痛。

张常明之所以从领导干部沦为金钱和权力的奴隶,最根本的原因是官当大了,怠于修身、懈于齐家、恣情纵欲,理想信念动摇,放松了对自己的要求,忘记了自己当年入党时的誓言,丢掉了自己的初心。

纵观全案,张常明自己出面直接收受的财物数额并不多,但无论是默许妻子陈某收受北京的房产,还是纵容情人梁某打着自己的旗号收受钱物,行贿人的目标,实际上都是冲着张常明手中的权力去的,都是希望通过他的权力庇护,达到获取更大物质利益的目的,是典型的权钱交易。

张常明受贿案再次警示我们,权大责更大。作为一名领导干部,面对各种诱惑,时时刻刻都要惴惴然如临深渊、如履薄冰,时刻都应奉公守法、以身作则,牢记入党时的誓言,不忘全心全意为人民服务的宗旨,更要在担任重要职务之后,更加注重自身的道德修养党性修养,注重家风建设,严格管好身边人。要谨记权力不是满足个人欲望的工具,手中有权,唯有心存敬畏、慎独慎微、勤于自省、拒绝诱惑,才能用好手中权走好人生路。

来源:检察日报



    上一篇: 约会铁律:如果男人临时想约你,最好说"不"



原文转载:http://lady.shaoqun.com/a/302864.html

跨境电商:https://www.ikjzd.com/

kkr:https://www.ikjzd.com/w/1340

DMM:https://www.ikjzd.com/w/2026


作为一名领导干部,张常明本应不忘初心,牢记全心全意为人民服务的宗旨,但他却化公权为己用,身居高位后放任妻子、情人"狐假虎威"、以权谋利;秉承"一人得道鸡犬升天"之念,与熟人、朋友大搞权钱交易。他怠于修身,昧于事理,严于律人,宽以待己,最终害人、害己,令人唏嘘。从一名农家子弟,一步步成长为一名副厅级领导干部。但随着职务升迁、权力增大,他在利益诱惑面前失去初心、逾越底线,甚至化公权为己用,身居高位后替
菜鸟网络:https://www.ikjzd.com/w/1547
泛亚班拿:https://www.ikjzd.com/w/1262
欧舒丹:https://www.ikjzd.com/w/1756
谜底揭晓:是什么让阿里和考拉"谈崩"了?:https://www.ikjzd.com/home/105948
声网Agora:https://www.ikjzd.com/w/2176
雷人90后女友 要我拍她堕胎全纪录:http://lady.shaoqun.com/m/a/273340.html

.NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

本文首发于《.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程》

前言

在.NET Core/.NET 5的应用程序开发,与其经常搭配的数据库可能是SQL Server。而将.NET Core/.NET 5应用程序与SQL Server数据库的ORM组件有微软官方提供的EF Core(Entity Framework Core),也有像SqlSugar这样的第三方ORM组件。EF Core连接SQL Server数据库微软官方就有比较详细的使用教程和文档。

本文将为大家分享的是在.NET Core/.NET 5应用程序中使用EF Core 5连接MySQL数据库的方法和示例。

本示例源码托管地址请至《.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程》查看。

创建示例项目

使用Visual Studio 2019(当然,如果你喜欢使用VS Code也是没有问题的,笔者还是更喜欢在Visual Studio编辑器中编写.NET代码)创建一个基于.NET 5的Web API示例项目,这里取名为MySQLSample:

项目创建好后,删除其中自动生成的多余的文件,最终的结构如下:

安装依赖包

打开程序包管理工具,安装如下关于EF Core的依赖包:

  • Microsoft.EntityFrameworkCore
  • Pomelo.EntityFrameworkCore.MySql (5.0.0-alpha.2)
  • Microsoft.Bcl.AsyncInterfaces

请注意Pomelo.EntityFrameworkCore.MySql包的版本,安装包时请开启包含预览,如:

创建实体和数据库上下文

创建实体

创建一个实体Person.cs,并定义一些用于测试的属性,如下:

using System;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace MySQLSample.Models{ [Table("people")] public class Person {  [Key]  public int Id { get; set; }  public string FirstName { get; set; }  public string LastName { get; set; }  public DateTime CreatedAt { get; set; } }}

创建数据库上下文

创建一个数据库上下文MyDbContext.cs,如下:

using Microsoft.EntityFrameworkCore;using MySQLSample.Models;namespace MySQLSample{ public class MyDbContext : DbContext {  public DbSet<Person> People { get; set; }  public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)  {  } }}

数据表脚本

CREATE TABLE `people` ( `Id` int NOT NULL AUTO_INCREMENT, `FirstName` varchar(50) NULL, `LastName` varchar(50) NULL, `CreatedAt` datetime NULL, PRIMARY KEY (`Id`));

创建好的空数据表people如图:

配置appsettings.json

将MySQL数据连接字符串配置到appsettings.json配置文件中,如下:

{ "Logging": {  "LogLevel": {   "Default": "Information",   "Microsoft": "Warning",   "Microsoft.Hosting.Lifetime": "Information"  } }, "AllowedHosts": "*", "ConnectionStrings": {  "MySQL": "server=192.168.1.22;userid=root;password=xxxxxx;database=test;" }}

Startup.cs注册

在Startup.cs注册MySQL数据库上下文服务,如下:

using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;namespace MySQLSample{ public class Startup {  public Startup(IConfiguration configuration)  {   Configuration = configuration;  }  public IConfiguration Configuration { get; }  public void ConfigureServices(IServiceCollection services)  {   services.AddDbContext<MyDbContext>(options => options.UseMySql(Configuration.GetConnectionString("MySQL"), MySqlServerVersion.LatestSupportedServerVersion));   services.AddControllers();  }  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)  {   if (env.IsDevelopment())   {    app.UseDeveloperExceptionPage();   }   app.UseRouting();   app.UseAuthorization();   app.UseEndpoints(endpoints =>   {    endpoints.MapControllers();   });  } }}

创建一个名为PeopleController的控制器,写入如下代码:

using Microsoft.AspNetCore.Mvc;using MySQLSample.Models;using System;using System.Linq;namespace MySQLSample.Controllers{ [ApiController] [Route("api/[controller]/[action]")] public class PeopleController : ControllerBase {  private readonly MyDbContext _dbContext;  public PeopleController(MyDbContext dbContext)  {   _dbContext = dbContext;  }  /// <summary>  /// 创建  /// </summary>  /// <returns></returns>  [HttpGet]  public IActionResult Create()  {   var message = "";   using (_dbContext)   {    var person = new Person    {     FirstName = "Rector",     LastName = "Liu",     CreatedAt = DateTime.Now    };    _dbContext.People.Add(person);    var i = _dbContext.SaveChanges();    message = i > 0 ? "数据写入成功" : "数据写入失败";   }   return Ok(message);  }  /// <summary>  /// 读取指定Id的数据  /// </summary>  /// <returns></returns>  [HttpGet]  public IActionResult GetById(int id)  {   using (_dbContext)   {    var list = _dbContext.People.Find(id);    return Ok(list);   }  }  /// <summary>  /// 读取所有  /// </summary>  /// <returns></returns>  [HttpGet]  public IActionResult GetAll()  {   using (_dbContext)   {    var list = _dbContext.People.ToList();    return Ok(list);   }  } }}

访问地址:

查看MySQL数据库people表的结果:

说明使用EF Core 5成功连接到MySQL数据并写入了期望的数据。

再访问地址:

到此,.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据的示例就大功告成了。

谢谢你的阅读,希望本文的.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据的示例对你有所帮助。

我是码友网的创建者-Rector。









原文转载:http://www.shaoqun.com/a/712737.html

跨境电商:https://www.ikjzd.com/

landing:https://www.ikjzd.com/w/2368

淘粉8:https://www.ikjzd.com/w/1725


本文首发于《.NET5/.NETCore使用EFCore5(EntityFrameworkCore)连接MySQL数据库写入/读取数据示例教程》前言在.NETCore/.NET5的应用程序开发,与其经常搭配的数据库可能是SQLServer。而将.NETCore/.NET5应用程序与SQLServer数据库的ORM组件有微软官方提供的EFCore(EntityFrameworkCore),也有像Sq
paipaiwang:https://www.ikjzd.com/w/2205
rfq:https://www.ikjzd.com/w/251
focalprice:https://www.ikjzd.com/w/1094.html
WHO:确定新冠研究重点 已将试剂盒运送全球实验室:https://www.ikjzd.com/home/115743
封店狂潮!亚马逊上热卖的Babyshark鲨鱼玩具有封店危险!:https://www.ikjzd.com/home/106275
(精品分析)亚马逊英国站男士T恤类目市场调查数据报告:https://www.ikjzd.com/home/107841

React Hook用法详解(6个常见hook)

1、useState:让函数式组件拥有状态

用法示例:

// 计数器import { useState } from 'react'const Test = () => { const [count, setCount] = useState(0); return (  <>   <h1>点击了{count}次</h1>   <button onClick={() => setCount(count + 1)}>+1</button>  </> );}export default Test

PS:class组件中this.setState更新是state是合并, useState中setState是替换。例如:

// 错误示例import { useState } from 'react'const Test = () => { const [counts, setCounts] = useState({  num1: 0,  num2: 0 }); return (  <>   <h1>num1:{counts.num1}</h1>   <h1>num2:{counts.num2}</h1>   <button onClick={() => setCounts({ num1: counts.num1 + 1})}>num1+1</button>   <button onClick={() => setCounts({ num2: counts.num2 + 1})}>num2+1</button>  </> );}export default Test


可以看到useState中setState是替换,不会合并,正确更新:

import { useState } from 'react'const Test = () => { const [counts, setCounts] = useState({  num1: 0,  num2: 0 }); return (  <>   <h1>num1:{counts.num1}</h1>   <h1>num2:{counts.num2}</h1>   <button onClick={() => setCounts({ ...counts, num1: counts.num1 + 1})}>num1+1</button>   <button onClick={() => setCounts({ ...counts, num2: counts.num2 + 1})}>num2+1</button>  </> );}export default Test

2、useEffect:副作用,取代生命周期

用法示例,在class组件中如果需要在组件挂载后和数据更新后做同一件事,我们会这样做:

componentDidMount() { // 做一些事}componentDidUpdate() { // 做一些事}

可以看出来,如果逻辑复杂后,代码看起来不优雅,且容易造成逻辑混乱,而使用useEffect:

useEffect(() => { // 做一些事});

此刻已经看到了useEffect的基本用法,除此之外,他还可以绑定触发更新的依赖状态,默认是状态中任何数据发生变化副作用都会执行,如:

import { useState, useEffect } from 'react'const Test = () => { const [count1, setCount1] = useState(0); const [count2, setCount2] = useState(0); useEffect(() => {  console.log('useEffect触发了') }); return (  <>   <h1>count1:{count1}</h1>   <h1>count2:{count2}</h1>   <button onClick={() => setCount1(count1 + 1)}>count1+1</button>   <button onClick={() => setCount2(count2 + 1)}>count2+1</button>  </> );}export default Test


将上述代码useEffect第二个参数传入需要绑定的状态,可绑定多个:

// 语法:useEffect(回调函数,[依赖值])useEffect(() => { console.log('useEffect触发了')}, [count1]);


可以看到,只有绑定的count1发生变化才会触发,如果传空数组则任何状态发生变化都不会触发,此时useEffect的作用就类似class组件中的componentDidMount,所以发送请求通常也会在此执行。

清理副作用
在上面的操作中都不用清理的副作用,然而,有些副作用是需要去清理的,不清理会造成异常甚至内存泄漏,比如开启定时器,如果不清理,则会多次开启,从上面可以看到useEffect的第一个参数是一个回调函数,可以在回调函数中再返回一个函数,该函数可以在状态更新后第一个回调函数执行之前调用,具体实现:

useEffect(() => { // 设置副作用 return () => {  // 清理副作用 }});

3、useContext:跨组件共享数据

React.createContext();创建一个TestContext对象
TestContext.Provider包裹子组件
数据放在<TestContext.Provider value={value}>的value中
子组件中通过useContext(TestContext)获取值

import React, { useContext, useState } from 'react';const TestContext = React.createContext();const Parent = () => { const [value, setValue] = useState(0); return (  <div>   {(() => console.log("Parent-render"))()}   <button onClick={() => setValue(value + 1)}>value + 1</button>   <TestContext.Provider value={value}>    <Child1 />    <Child2 />   </TestContext.Provider>  </div> );}const Child1 = () => { const value = useContext(TestContext); return (  <div>   {(() => console.log('Child1-render'))()}   <h3>Child1-value: {value}</h3>  </div> );}const Child2 = () => { return (  <div>   {(() => console.log('Child2-render'))()}   <h3>Child2</h3>  </div> );}export default Parent


至此数据实现共享了,但是可以看到在TestContext中的共享数据只要发生变化,子组件都会重新渲染,Child2并没有绑定数据,不希望他做无意义的渲染,可以使用React.memo解决,实现:

const Child2 = React.memo(() => { return (  <div>   {(() => console.log('Child2-render'))()}   <h3>Child2</h3>  </div> );});

4、useCallback:性能优化

语法:

// useCallback(回调函数,[依赖值])const handleClick = useCallback(()=> { // 做一些事}, [value]);

useCallback返回的是一个 memoized(缓存)函数,在依赖不变的情况下,多次定义的时候,返回的值是相同的,他的实现原理是当使用一组参数初次调用函数时,会缓存参数和计算结果,当再次使用相同的参数调用该函数时,会直接返回相应的缓存结果。

优化性能例子:

import React, { useState, useCallback, memo } from 'react';const Parent = () => { const [value1, setValue1] = useState(0); const [value2, setValue2] = useState(0); const handleClick1 = useCallback(()=> {  setValue1(value1 + 1); }, [value1]); const handleClick2 = useCallback(()=> {  setValue2(value2 + 1); }, [value2]); return (  <>   {(() => console.log("Parent-render"))()}   <h3>{value1}</h3>   <h3>{value2}</h3>   <Child1 handleClick1={handleClick1} />   <Child2 handleClick2={handleClick2} />  </> );}const Child1 = memo(props => { return (  <div>   {(() => console.log("Child1-render"))()}   <button onClick={() => props.handleClick1()}>value1 + 1</button>  </div> );});const Child2 = memo(props => { return (  <div>   {(() => console.log("Child2-render"))()}   <button onClick={() => props.handleClick2()}>value2 + 1</button>  </div> );});export default Parent

useCallback返回的是一个memoized回调函数,仅在其中绑定的一个依赖项变化后才更改可防止不必要的渲染,在跨组件共享数据中举例的事件是在父组件中点击触发,而现在是使用状态提升,在父组件中传递方法供子组件调用,每次render时函数也会变化,导致子组件重新渲染,上面例子useCallback将函数进行包裹,依赖值未发生变化时会返回缓存的函数,配合React.memo即可优化无意义的渲染。

5、useMemo:性能优化

语法:

// useMemo(回调函数,[依赖值])useMemo(() => { // 做一些事情},[value]);

先看一个例子:

import React, { useState } from 'react'const Test = ()=> { const [value, setValue] = useState(0); const [count, setCount] = useState(1); const getDoubleCount = () => {  console.log('getDoubleCount进行计算了');  return count * 2; }; return (  <div>   <h2>value: {value}</h2>   <h2>doubleCount: {getDoubleCount()}</h2>   <button onClick={() => setValue(value + 1)}>value+1</button>  </div> )}export default Test

可以看到getDoubleCount依赖的是count,但value发生变化它也重新进行了计算渲染,现在只需要将getDoubleCount使用useMemo进行包裹,如下:

import React, { useState, useMemo } from 'react'const Test = ()=> { const [value, setValue] = useState(0); const [count, setCount] = useState(1); const getDoubleCount = useMemo(() => {  console.log('getDoubleCount进行计算了');  return count * 2; },[count]); return (  <div>   <h2>value: {value}</h2>   <h2>doubleCount: {getDoubleCount}</h2>   <button onClick={() => setValue(value + 1)}>value+1</button>  </div> )}export default Test


现在getDoubleCount只有依赖的count发生变化时才会重新计算渲染。

useMemo和useCallback的共同点:

  • 接收的参数都是一样的,第一个是回调函数,第二个是依赖的数据
  • 它们都是当依赖的数据发生变化时才会重新计算结果,起到了缓存作用

useMemo和useCallback的区别:

  • useMemo计算结果是return回来的值,通常用于缓存计算结果的值
  • useCallback计算结果是一个函数,通常用于缓存函数

6、useRef

用法:例如要实现点击button按钮使input输入框获得焦点:
import React, { useRef } from 'react';const Test = () => { const inputEl = useRef(); return (  <>   <input ref={inputEl} />   <button onClick={() => inputEl.current.focus()}>focus</button>  </> );}export default Test

这样看起来非常像React.createRef(),将上面代码中的useRef()改成React.createRef()也能实现同样的效果,那为什么要设计一个新的hook?难道只是会了加上use,统一hook规范?
事实上,它们确实不一样。

官网的说明如下:

useRef returns a mutable ref object whose .current property is initialized to the passedargument (initialValue). The returned object will persist for the full lifetime of the component.

翻译:

简单来说,useRef就像一个储物箱,你可以随意存放任何东西,再次渲染时它会去储物箱找,createRef每次渲染都会返回一个新的引用,而useRef每次都会返回相同的引用。









原文转载:http://www.shaoqun.com/a/712736.html

跨境电商:https://www.ikjzd.com/

hts:https://www.ikjzd.com/w/525

gtc:https://www.ikjzd.com/w/974


1、useState:让函数式组件拥有状态用法示例://计数器import{useState}from'react'constTest=()=>{const[count,setCount]=useState(0);return(<><h1>点击了{count}次</h1><buttononClick={()=>setCount(
自贸区跨境通网站:https://www.ikjzd.com/w/1329
hunter:https://www.ikjzd.com/w/992
promotion:https://www.ikjzd.com/w/127
又一跨境电商平台垮了!去年刚融资3000万:https://www.ikjzd.com/home/129157
eBay发布2018年第二季度财报,净营收未达预期!:https://www.ikjzd.com/home/3224
跨境电商亚马逊无货源模式能不能做?:https://www.ikjzd.com/home/99089