From cbacfff54b1f7d3ddac22907378b29625a8980d4 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Thu, 13 Aug 2020 11:19:08 +0200 Subject: [PATCH] Regular update --- content/book/ewins00_modal.md | 124 +++++++-------- ...leming14_desig_model_contr_nanop_system.md | 145 ++++++++++++++---- content/zettels/active_isolation_platforms.md | 15 ++ content/zettels/granite.md | 12 ++ content/zettels/inertial_sensors.md | 48 +++--- content/zettels/matlab.md | 37 +++-- content/zettels/piezoelectric_actuators.md | 75 ++++----- content/zettels/shaker.md | 10 +- content/zettels/signal_to_noise_ratio.md | 12 +- content/zettels/voltage_amplifier.md | 54 ++++--- ...s_48b060fe05b0a273d182ef83c0605941.content | 2 +- ...scss_48b060fe05b0a273d182ef83c0605941.json | 2 +- static/ox-hugo/fleming14_amplifier_model.png | Bin 0 -> 14508 bytes 13 files changed, 349 insertions(+), 187 deletions(-) create mode 100644 content/zettels/active_isolation_platforms.md create mode 100644 content/zettels/granite.md create mode 100644 static/ox-hugo/fleming14_amplifier_model.png diff --git a/content/book/ewins00_modal.md b/content/book/ewins00_modal.md index 9b4e136..4537d37 100644 --- a/content/book/ewins00_modal.md +++ b/content/book/ewins00_modal.md @@ -8,7 +8,7 @@ Tags : [System Identification]({{< relref "system_identification" >}}), [Reference Books]({{< relref "reference_books" >}}) Reference -: (Ewins, 2000) +: ([Ewins 2000](#org84d73f8)) Author(s) : Ewins, D. @@ -141,7 +141,7 @@ The main measurement technique studied are those which will permit to make **dir The type of test best suited to FRF measurement is shown in figure [fig:modal_analysis_schematic](#fig:modal_analysis_schematic). - + {{< figure src="/ox-hugo/ewins00_modal_analysis_schematic.png" caption="Figure 1: Basic components of FRF measurement system" >}} @@ -215,7 +215,7 @@ This assumption allows us to use the circular nature of a modulus/phase polar pl This process can be **repeated** for each resonance individually until the whole curve has been analyzed. At this stage, a theoretical regeneration of the FRF is possible using the set of coefficients extracted. - + {{< figure src="/ox-hugo/ewins00_sdof_modulus_phase.png" caption="Figure 2: Curve fit to resonant FRF data" >}} @@ -253,7 +253,7 @@ Theoretical foundations of modal testing are of paramount importance to its succ The three phases through a typical theoretical vibration analysis progresses are shown on figure [fig:vibration_analysis_procedure](#fig:vibration_analysis_procedure). Generally, we start with a description of the structure's physical characteristics (mass, stiffness and damping properties), this is referred to as the **Spatial model**. - + {{< figure src="/ox-hugo/ewins00_vibration_analysis_procedure.png" caption="Figure 3: Theoretical route to vibration analysis" >}} @@ -298,7 +298,7 @@ Three classes of system model will be described: The basic model for the SDOF system is shown in figure [fig:sdof_model](#fig:sdof_model) where \\(f(t)\\) and \\(x(t)\\) are general time-varying force and displacement response quantities. The spatial model consists of a **mass** \\(m\\), a **spring** \\(k\\) and (when damped) either a **viscous dashpot** \\(c\\) or **hysteretic damper** \\(d\\). - + {{< figure src="/ox-hugo/ewins00_sdof_model.png" caption="Figure 4: Single degree-of-freedom system" >}} @@ -374,7 +374,7 @@ which is a single mode of vibration with a complex natural frequency having two The physical significance of these two parts is illustrated in the typical free response plot shown in figure [fig:sdof_response](#fig:sdof_response) - + {{< figure src="/ox-hugo/ewins00_sdof_response.png" caption="Figure 5: Oscillatory and decay part" >}} @@ -418,7 +418,7 @@ The damping effect of such a component can conveniently be defined by the ratio | ![](/ox-hugo/ewins00_material_histeresis.png) | ![](/ox-hugo/ewins00_dry_friction.png) | ![](/ox-hugo/ewins00_viscous_damper.png) | |-----------------------------------------------|----------------------------------------|------------------------------------------| -| Material hysteresis | Dry friction | Viscous damper | +| Material hysteresis | Dry friction | Viscous damper | | height=2cm | height=2cm | height=2cm | Another common source of energy dissipation in practical structures, is the **friction** which exist in joints between components of the structure. @@ -537,7 +537,7 @@ Bode plot are usually displayed using logarithmic scales as shown on figure [fig | ![](/ox-hugo/ewins00_bode_receptance.png) | ![](/ox-hugo/ewins00_bode_mobility.png) | ![](/ox-hugo/ewins00_bode_accelerance.png) | |-------------------------------------------|-----------------------------------------|--------------------------------------------| -| Receptance FRF | Mobility FRF | Accelerance FRF | +| Receptance FRF | Mobility FRF | Accelerance FRF | | width=\linewidth | width=\linewidth | width=\linewidth | Each plot can be divided into three regimes: @@ -560,7 +560,7 @@ This type of display is not widely used as we cannot use logarithmic axes (as we | ![](/ox-hugo/ewins00_plot_receptance_real.png) | ![](/ox-hugo/ewins00_plot_receptance_imag.png) | |------------------------------------------------|------------------------------------------------| -| Real part | Imaginary part | +| Real part | Imaginary part | | width=\linewidth | width=\linewidth | @@ -578,7 +578,7 @@ Figure [fig:inverse_frf_mixed](#fig:inverse_frf_mixed) shows an example of a plo | ![](/ox-hugo/ewins00_inverse_frf_mixed.png) | ![](/ox-hugo/ewins00_inverse_frf_viscous.png) | |---------------------------------------------|-----------------------------------------------| -| Mixed | Viscous | +| Mixed | Viscous | | width=\linewidth | width=\linewidth | @@ -595,7 +595,7 @@ The missing information (in this case, the frequency) must be added by identifyi | ![](/ox-hugo/ewins00_nyquist_receptance_viscous.png) | ![](/ox-hugo/ewins00_nyquist_receptance_structural.png) | |------------------------------------------------------|---------------------------------------------------------| -| Viscous damping | Structural damping | +| Viscous damping | Structural damping | | width=\linewidth | width=\linewidth | The Nyquist plot has the particularity of distorting the plot so as to focus on the resonance area. @@ -1103,7 +1103,7 @@ Equally, in a real mode, all parts of the structure pass through their **zero de While the real mode has the appearance of a **standing wave**, the complex mode is better described as exhibiting **traveling waves** (illustrated on figure [fig:real_complex_modes](#fig:real_complex_modes)). - + {{< figure src="/ox-hugo/ewins00_real_complex_modes.png" caption="Figure 6: Real and complex mode shapes displays" >}} @@ -1118,7 +1118,7 @@ Note that the almost-real mode shape does not necessarily have vector elements w | ![](/ox-hugo/ewins00_argand_diagram_a.png) | ![](/ox-hugo/ewins00_argand_diagram_b.png) | ![](/ox-hugo/ewins00_argand_diagram_c.png) | |--------------------------------------------|--------------------------------------------|-----------------------------------------------| -| Almost-real mode | Complex Mode | Measure of complexity | +| Almost-real mode | Complex Mode | Measure of complexity | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -1235,7 +1235,7 @@ On a logarithmic plot, this produces the antiresonance characteristic which refl | ![](/ox-hugo/ewins00_mobility_frf_mdof_point.png) | ![](/ox-hugo/ewins00_mobility_frf_mdof_transfer.png) | |---------------------------------------------------|------------------------------------------------------| -| Point FRF | Transfer FRF | +| Point FRF | Transfer FRF | | width=\linewidth | width=\linewidth | For the plot in figure [fig:mobility_frf_mdof_transfer](#fig:mobility_frf_mdof_transfer), between the two resonances, the two components have the same sign and they add up, no antiresonance is present. @@ -1260,7 +1260,7 @@ Most mobility plots have this general form as long as the modes are relatively w This condition is satisfied unless the separation between adjacent natural frequencies is of the same order as, or less than, the modal damping factors, in which case it becomes difficult to distinguish the individual modes. - + {{< figure src="/ox-hugo/ewins00_frf_damped_system.png" caption="Figure 7: Mobility plot of a damped system" >}} @@ -1281,7 +1281,7 @@ The plot for the transfer receptance \\(\alpha\_{21}\\) is presented in figure [ | ![](/ox-hugo/ewins00_nyquist_point.png) | ![](/ox-hugo/ewins00_nyquist_transfer.png) | |------------------------------------------|---------------------------------------------| -| Point receptance | Transfer receptance | +| Point receptance | Transfer receptance | | width=\linewidth | width=\linewidth | In the two figures [fig:nyquist_nonpropdamp_point](#fig:nyquist_nonpropdamp_point) and [fig:nyquist_nonpropdamp_transfer](#fig:nyquist_nonpropdamp_transfer), we show corresponding data for **non-proportional** damping. @@ -1296,7 +1296,7 @@ Now we find that the individual modal circles are no longer "upright" but are ** | ![](/ox-hugo/ewins00_nyquist_nonpropdamp_point.png) | ![](/ox-hugo/ewins00_nyquist_nonpropdamp_transfer.png) | |-----------------------------------------------------|--------------------------------------------------------| -| Point receptance | Transfer receptance | +| Point receptance | Transfer receptance | | width=\linewidth | width=\linewidth | @@ -1450,7 +1450,7 @@ Examples of random signals, autocorrelation function and power spectral density | ![](/ox-hugo/ewins00_random_time.png) | ![](/ox-hugo/ewins00_random_autocorrelation.png) | ![](/ox-hugo/ewins00_random_psd.png) | |---------------------------------------|--------------------------------------------------|------------------------------------------------| -| Time history | Autocorrelation Function | Power Spectral Density | +| Time history | Autocorrelation Function | Power Spectral Density | | width=\linewidth | width=\linewidth | width=\linewidth | A similar concept can be applied to a pair of functions such as \\(f(t)\\) and \\(x(t)\\) to produce **cross correlation** and **cross spectral density** functions. @@ -1547,7 +1547,7 @@ Then in [fig:frf_feedback_model](#fig:frf_feedback_model) is given a more detail | ![](/ox-hugo/ewins00_frf_siso_model.png) | ![](/ox-hugo/ewins00_frf_feedback_model.png) | |------------------------------------------|--------------------------------------------------| -| Basic SISO model | SISO model with feedback | +| Basic SISO model | SISO model with feedback | | width=\linewidth | width=\linewidth | In this configuration, it can be seen that there are two feedback mechanisms which apply. @@ -1580,7 +1580,7 @@ We obtain two alternative formulas: In practical application of both of these formulae, care must be taken to ensure the non-singularity of the spectral density matrix which is to be inverted, and it is in this respect that the former version may be found to be more reliable. - + {{< figure src="/ox-hugo/ewins00_frf_mimo.png" caption="Figure 8: System for FRF determination via MIMO model" >}} @@ -1852,7 +1852,7 @@ The experimental setup used for mobility measurement contains three major items: A typical layout for the measurement system is shown on figure [fig:general_frf_measurement_setup](#fig:general_frf_measurement_setup). - + {{< figure src="/ox-hugo/ewins00_general_frf_measurement_setup.png" caption="Figure 9: General layout of FRF measurement system" >}} @@ -1909,7 +1909,7 @@ This can modify the response of the system in those directions. In order to avoid that, a drive rod which is stiff in one direction and flexible in the other five directions is attached between the shaker and the structure as shown on figure [fig:shaker_rod](#fig:shaker_rod). Typical size for the rod are \\(5\\) to \\(\SI{10}{mm}\\) long and \\(\SI{1}{mm}\\) in diameter, if the rod is longer, it may introduce the effect of its own resonances. - + {{< figure src="/ox-hugo/ewins00_shaker_rod.png" caption="Figure 10: Exciter attachment and drive rod assembly" >}} @@ -1930,7 +1930,7 @@ Figure [fig:shaker_mount_3](#fig:shaker_mount_3) shows an unsatisfactory setup. | ![](/ox-hugo/ewins00_shaker_mount_1.png) | ![](/ox-hugo/ewins00_shaker_mount_2.png) | ![](/ox-hugo/ewins00_shaker_mount_3.png) | |---------------------------------------------|-------------------------------------------------|------------------------------------------| -| Ideal Configuration | Suspended Configuration | Unsatisfactory | +| Ideal Configuration | Suspended Configuration | Unsatisfactory | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -1948,7 +1948,7 @@ The frequency range which is effectively excited is controlled by the stiffness When the hammer tip impacts the test structure, this will experience a force pulse as shown on figure [fig:hammer_impulse](#fig:hammer_impulse). A pulse of this type (half-sine shape) has a frequency content of the form illustrated on figure [fig:hammer_impulse](#fig:hammer_impulse). - + {{< figure src="/ox-hugo/ewins00_hammer_impulse.png" caption="Figure 11: Typical impact force pulse and spectrum" >}} @@ -1979,7 +1979,7 @@ By suitable design, such a material may be incorporated into a device which **in The force transducer is the simplest type of piezoelectric transducer. The transmitter force \\(F\\) is applied directly across the crystal, which thus generates a corresponding charge \\(q\\), proportional to \\(F\\) (figure [fig:piezo_force_transducer](#fig:piezo_force_transducer)). - + {{< figure src="/ox-hugo/ewins00_piezo_force_transducer.png" caption="Figure 12: Force transducer" >}} @@ -1992,7 +1992,7 @@ In an accelerometer, transduction is indirect and is achieved using a seismic ma In this configuration, the force exerted on the crystals is the inertia force of the seismic mass (\\(m\ddot{z}\\)). Thus, so long as the body and the seismic mass move together, the output of the transducer will be proportional to the acceleration of its body \\(x\\). - + {{< figure src="/ox-hugo/ewins00_piezo_accelerometer.png" caption="Figure 13: Compression-type of piezoelectric accelerometer" >}} @@ -2040,7 +2040,7 @@ Shown on figure [fig:transducer_mounting_response](#fig:transducer_mounting_resp | ![](/ox-hugo/ewins00_transducer_mounting_types.png) | ![](/ox-hugo/ewins00_transducer_mounting_response.png) | |-----------------------------------------------------|------------------------------------------------------------| -| Attachment methods | Frequency response characteristics | +| Attachment methods | Frequency response characteristics | | width=\linewidth | width=\linewidth | @@ -2127,7 +2127,7 @@ Aliasing originates from the discretisation of the originally continuous time hi With this discretisation process, the **existence of very high frequencies in the original signal may well be misinterpreted if the sampling rate is too slow**. These high frequencies will be **indistinguishable** from genuine low frequency components as shown on figure [fig:aliasing](#fig:aliasing). - + {{< figure src="/ox-hugo/ewins00_aliasing.png" caption="Figure 14: The phenomenon of aliasing. On top: Low-frequency signal, On the bottom: High frequency signal" >}} @@ -2144,7 +2144,7 @@ This is illustrated on figure [fig:effect_aliasing](#fig:effect_aliasing). | ![](/ox-hugo/ewins00_aliasing_no_distortion.png) | ![](/ox-hugo/ewins00_aliasing_distortion.png) | |--------------------------------------------------|-----------------------------------------------------| -| True spectrum of signal | Indicated spectrum from DFT | +| True spectrum of signal | Indicated spectrum from DFT | | width=\linewidth | width=\linewidth | The solution of the problem is to use an **anti-aliasing filter** which subjects the original time signal to a low-pass, sharp cut-off filter. @@ -2165,7 +2165,7 @@ Leakage is a problem which is a direct **consequence of the need to take only a | ![](/ox-hugo/ewins00_leakage_ok.png) | ![](/ox-hugo/ewins00_leakage_nok.png) | |--------------------------------------|----------------------------------------| -| Ideal signal | Awkward signal | +| Ideal signal | Awkward signal | | width=\linewidth | width=\linewidth | The problem is illustrated on figure [fig:leakage](#fig:leakage). @@ -2190,7 +2190,7 @@ Windowing involves the imposition of a prescribed profile on the time signal pri The profiles, or "windows" are generally depicted as a time function \\(w(t)\\) as shown in figure [fig:windowing_examples](#fig:windowing_examples). - + {{< figure src="/ox-hugo/ewins00_windowing_examples.png" caption="Figure 15: Different types of window. (a) Boxcar, (b) Hanning, (c) Cosine-taper, (d) Exponential" >}} @@ -2211,7 +2211,7 @@ Common filters are: low-pass, high-pass, band-limited, narrow-band, notch. #### Improving Resolution {#improving-resolution} - + ##### Increasing transform size {#increasing-transform-size} @@ -2247,10 +2247,10 @@ If we apply a band-pass filter to the signal, as shown on figure [fig:zoom_bandp | ![](/ox-hugo/ewins00_zoom_range.png) | ![](/ox-hugo/ewins00_zoom_bandpass.png) | |------------------------------------------------|------------------------------------------| -| Spectrum of the signal | Band-pass filter | +| Spectrum of the signal | Band-pass filter | | width=\linewidth | width=\linewidth | - + {{< figure src="/ox-hugo/ewins00_zoom_result.png" caption="Figure 16: Effective frequency translation for zoom" >}} @@ -2322,7 +2322,7 @@ This is the traditional method of FRF measurement and involves the use of a swee It is necessary to check that progress through the frequency range is sufficiently slow to check that steady-state response conditions are attained. If excessive sweep rate is used, then distortions of the FRF plot are introduced as shown on figure [fig:sweep_distortions](#fig:sweep_distortions). - + {{< figure src="/ox-hugo/ewins00_sweep_distortions.png" caption="Figure 17: FRF measurements by sine sweep test" >}} @@ -2440,7 +2440,7 @@ It is known that a low coherence can arise in a measurement where the frequency This is known as a **bias** error and leakage is often the most likely source of low coherence on lightly-damped structures as shown on figure [fig:coherence_resonance](#fig:coherence_resonance). - + {{< figure src="/ox-hugo/ewins00_coherence_resonance.png" caption="Figure 18: Coherence \\(\gamma^2\\) and FRF estimate \\(H\_1(\omega)\\) for a lightly damped structure" >}} @@ -2483,7 +2483,7 @@ For the chirp and impulse excitations, each individual sample is collected and p Burst excitation signals consist of short sections of an underlying continuous signal (which may be a sine wave, a sine sweep or a random signal), followed by a period of zero output, resulting in a response which shows a transient build-up followed by a decay (see figure [fig:burst_excitation](#fig:burst_excitation)). - + {{< figure src="/ox-hugo/ewins00_burst_excitation.png" caption="Figure 19: Example of burst excitation and response signals" >}} @@ -2502,7 +2502,7 @@ The chirp consist of a short duration signal which has the form shown in figure The frequency content of the chirp can be precisely chosen by the starting and finishing frequencies of the sweep. - + {{< figure src="/ox-hugo/ewins00_chirp_excitation.png" caption="Figure 20: Example of chirp excitation and response signals" >}} @@ -2513,7 +2513,7 @@ The hammer blow produces an input and response as shown in the figure [fig:impul This and the chirp excitation are very similar in the analysis point of view, the main difference is that the chirp offers the possibility of greater control of both amplitude and frequency content of the input and also permits the input of a greater amount of vibration energy. - + {{< figure src="/ox-hugo/ewins00_impulsive_excitation.png" caption="Figure 21: Example of impulsive excitation and response signals" >}} @@ -2523,7 +2523,7 @@ However, it should be recorded that in the region below the first cut-off freque On some structures, the movement of the structure in response to the hammer blow can be such that it returns and **rebounds** on the hammer tip before the user has had time to move that out of the way. In such cases, the spectrum of the excitation is seen to have "holes" in it at certain frequencies (figure [fig:double_hits](#fig:double_hits)). - + {{< figure src="/ox-hugo/ewins00_double_hits.png" caption="Figure 22: Double hits time domain and frequency content" >}} @@ -2598,7 +2598,7 @@ Suppose the response parameter is acceleration, then the FRF obtained is inertan Figure [fig:calibration_setup](#fig:calibration_setup) shows a typical calibration setup. - + {{< figure src="/ox-hugo/ewins00_calibration_setup.png" caption="Figure 23: Mass calibration procedure, measurement setup" >}} @@ -2613,7 +2613,7 @@ This is because near resonance, the actual applied force becomes very small and This same argument applies on a lesser scale as we examine the detail around the attachment to the structure, as shown in figure [fig:mass_cancellation](#fig:mass_cancellation). - + {{< figure src="/ox-hugo/ewins00_mass_cancellation.png" caption="Figure 24: Added mass to be cancelled (crossed area)" >}} @@ -2657,7 +2657,7 @@ It should be noted that the transducer's inertia is also effective not only in t #### Significance of rotational FRF data {#significance-of-rotational-frf-data} \\(\SI{50}{\%}\\) of all DOFs are rotations (as opposed to translations) and \\(\SI{75}{\%}\\) of all frequency response functions involve rotation DOFs. -However, it is relatively rate the find reference to methods for measurements of rotational DOFs. +However, it is relatively rare the find reference to methods for measurements of rotational DOFs. This situation arises from a considerable difficulty which is encountered when trying to measure either rotational responses or excitations and also when trying to apply rotational excitation. @@ -2670,7 +2670,7 @@ There are two problems to be tackled: The first of these is less difficult and techniques usually use a pair a matched conventional accelerometers placed at a short distance apart on the structure to be measured as shown on figure [fig:rotational_measurement](#fig:rotational_measurement). - + {{< figure src="/ox-hugo/ewins00_rotational_measurement.png" caption="Figure 25: Measurement of rotational response" >}} @@ -2691,7 +2691,7 @@ First, a single applied excitation force \\(F\_1\\) corresponds to a simultaneou Then, the same excitation force is applied at the second position that gives a force \\(F\_0 = F\_2\\) and moment \\(M\_0 = F\_2 l\_2\\). By adding and subtracting the responses produced by these two separate excitations conditions, we can deduce the translational and rotational responses to the translational force and the rotational moment separately, thus enabling the measurement of all four types of FRF: \\(X/F\\), \\(\Theta/F\\), \\(X/M\\) and \\(\Theta/M\\). - + {{< figure src="/ox-hugo/ewins00_rotational_excitation.png" caption="Figure 26: Application of moment excitation" >}} @@ -3031,7 +3031,7 @@ The two groups are usually separated by a clear gap (depending of the noise pres | ![](/ox-hugo/ewins00_PRF_numerical_FRF.png) | ![](/ox-hugo/ewins00_PRF_numerical_svd.png) | ![](/ox-hugo/ewins00_PRF_numerical_PRF.png) | |---------------------------------------------|---------------------------------------------|---------------------------------------------| -| FRF | Singular Values | PRF | +| FRF | Singular Values | PRF | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -3042,7 +3042,7 @@ The two groups are usually separated by a clear gap (depending of the noise pres | ![](/ox-hugo/ewins00_PRF_measured_FRF.png) | ![](/ox-hugo/ewins00_PRF_measured_svd.png) | ![](/ox-hugo/ewins00_PRF_measured_PRF.png) | |--------------------------------------------|--------------------------------------------|--------------------------------------------| -| FRF | Singular Values | PRF | +| FRF | Singular Values | PRF | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -3084,7 +3084,7 @@ Associated with the CMIF values at each natural frequency \\(\omega\_r\\) are tw - the left singular vector \\(\\{U(\omega\_r)\\}\_1\\) which approximates the **mode shape** of that mode - the right singular vector \\(\\{V(\omega\_r)\\}\_1\\) which represents the approximate **force pattern necessary to generate a response on that mode only** - + {{< figure src="/ox-hugo/ewins00_mifs.png" caption="Figure 27: Complex Mode Indicator Function (CMIF)" >}} @@ -3179,7 +3179,7 @@ The peak-picking method is applied as follows (illustrated on figure [fig:peak_a It must be noted that the estimates of both damping and modal constant depend heavily on the accuracy of the maximum FRF level \\(|\hat{H}|\\) which is difficult to measure with great accuracy, especially for lightly damped systems. Only real modal constants and thus real modes can be deduced by this method. - + {{< figure src="/ox-hugo/ewins00_peak_amplitude.png" caption="Figure 28: Peak Amplitude method of modal analysis" >}} @@ -3214,7 +3214,7 @@ A plot of the quantity \\(\alpha(\omega)\\) is given in figure [fig:modal_circle | ![](/ox-hugo/ewins00_modal_circle.png) | ![](/ox-hugo/ewins00_modal_circle_bis.png) | |----------------------------------------|--------------------------------------------------------------------| -| Properties | \\(\omega\_b\\) and \\(\omega\_a\\) points | +| Properties | \\(\omega\_b\\) and \\(\omega\_a\\) points | | width=\linewidth | width=\linewidth | For any frequency \\(\omega\\), we have the following relationship: @@ -3328,7 +3328,7 @@ The sequence is: 5. **Determine modal constant modulus and argument**. The magnitude and argument of the modal constant is determined from the diameter of the circle and from its orientation relative to the Real and Imaginary axis. - + {{< figure src="/ox-hugo/ewins00_circle_fit_natural_frequency.png" caption="Figure 29: Location of natural frequency for a Circle-fit modal analysis" >}} @@ -3453,7 +3453,7 @@ However, by the inclusion of two simple extra terms (the "**residuals**"), the m | ![](/ox-hugo/ewins00_residual_without.png) | ![](/ox-hugo/ewins00_residual_with.png) | |--------------------------------------------|-----------------------------------------| -| without residual | with residuals | +| without residual | with residuals | | width=\linewidth | width=\linewidth | If we regenerate an FRF curve from the modal parameters we have extracted from the measured data, we shall use a formula of the type @@ -3484,7 +3484,7 @@ The three terms corresponds to: These three terms are illustrated on figure [fig:low_medium_high_modes](#fig:low_medium_high_modes). - + {{< figure src="/ox-hugo/ewins00_low_medium_high_modes.png" caption="Figure 30: Numerical simulation of contribution of low, medium and high frequency modes" >}} @@ -3785,7 +3785,7 @@ As an example, a set of mobilities measured are shown individually in figure [fi | ![](/ox-hugo/ewins00_composite_raw.png) | ![](/ox-hugo/ewins00_composite_sum.png) | |-------------------------------------------|-----------------------------------------| -| Individual curves | Composite curve | +| Individual curves | Composite curve | | width=\linewidth | width=\linewidth | The global analysis methods have the disadvantages first, that the computation power required is high and second that there may be valid reasons why the various FRF curves exhibit slight differences in their characteristics and it may not always be appropriate to average them. @@ -4332,7 +4332,7 @@ Measured coordinates of the test structure are first linked as shown on figure [ Then, the grid of measured coordinate points is redrawn on the same plot but this time displaced by an amount proportional to the corresponding element in the mode shape vector as shown on figure [fig:static_display](#fig:static_display) (b). The elements in the vector are scaled according the normalization process used (usually mass-normalized), and their absolute magnitudes have no particular significance. - + {{< figure src="/ox-hugo/ewins00_static_display.png" caption="Figure 31: Static display of modes shapes. (a) basic grid (b) single-frame deflection pattern (c) multiple-frame deflection pattern (d) complex mode (e) Argand diagram - quasi-real mode (f) Argand diagram - complex mode" >}} @@ -4377,7 +4377,7 @@ If we consider the first six modes of the beam, whose mode shapes are sketched i All the higher modes will be indistinguishable from these first few. This is a well known problem of **spatial aliasing**. - + {{< figure src="/ox-hugo/ewins00_beam_modes.png" caption="Figure 32: Misinterpretation of mode shapes by spatial aliasing" >}} @@ -4440,7 +4440,7 @@ The inclusion of these two additional terms (obtained here only after measuring | ![](/ox-hugo/ewins00_H22_without_residual.png) | ![](/ox-hugo/ewins00_H22_with_residual.png) | |--------------------------------------------------------|-----------------------------------------------------------| -| Using measured modal data only | After inclusion of residual terms | +| Using measured modal data only | After inclusion of residual terms | | width=\linewidth | width=\linewidth | The appropriate expression for a "correct" response model, derived via a set of modal properties is thus @@ -4495,7 +4495,7 @@ If the transmissibility is measured during a modal test which has a single excit In general, the transmissibility **depends significantly on the excitation point** (\\({}\_iT\_{jk}(\omega) \neq {}\_qT\_{jk}(\omega)\\) where \\(q\\) is a different DOF than \\(i\\)) and it is shown on figure [fig:transmissibility_plots](#fig:transmissibility_plots). This may explain why transmissibilities are not widely used in modal analysis. - + {{< figure src="/ox-hugo/ewins00_transmissibility_plots.png" caption="Figure 33: Transmissibility plots" >}} @@ -4516,7 +4516,7 @@ The fact that the excitation force is not measured is responsible for the lack o | ![](/ox-hugo/ewins00_conventional_modal_test_setup.png) | ![](/ox-hugo/ewins00_base_excitation_modal_setup.png) | |---------------------------------------------------------|-------------------------------------------------------| -| Conventional modal test setup | Base excitation setup | +| Conventional modal test setup | Base excitation setup | | height=4cm | height=4cm | @@ -4556,5 +4556,7 @@ This is accomplished using the above equation in the form: Because the rank of each pseudo matrix is less than its order, it cannot be inverted and so we are unable to construct stiffness or mass matrix from this approach. -# Bibliography -Ewins, D., *Modal testing: theory, practice and application* (2000), Baldock, Hertfordshire, England Philadelphia, PA: Wiley-Blackwell. [↩](#12ff508e9095d666cf081e3c5a6a4cce) + +## Bibliography {#bibliography} + +Ewins, DJ. 2000. _Modal Testing: Theory, Practice and Application_. _Research Studies Pre, 2nd Ed., ISBN-13_. Baldock, Hertfordshire, England Philadelphia, PA: Wiley-Blackwell. diff --git a/content/book/fleming14_desig_model_contr_nanop_system.md b/content/book/fleming14_desig_model_contr_nanop_system.md index a63857d..13549fd 100644 --- a/content/book/fleming14_desig_model_contr_nanop_system.md +++ b/content/book/fleming14_desig_model_contr_nanop_system.md @@ -9,7 +9,7 @@ Tags Reference -: ([Fleming and Leang 2014](#org2385d08)) +: ([Fleming and Leang 2014](#org611ad6b)) Author(s) : Fleming, A. J., & Leang, K. K. @@ -816,46 +816,131 @@ Year ### References {#references} -## 14 Electrical Considerations {#14-electrical-considerations} +## Electrical Considerations {#electrical-considerations} -### 14.1 Introduction {#14-dot-1-introduction} +### Amplifier and Piezo electrical models {#amplifier-and-piezo-electrical-models} + + + +{{< figure src="/ox-hugo/fleming14_amplifier_model.png" caption="Figure 1: A voltage source \\(V\_s\\) driving a piezoelectric load. The actuator is modeled by a capacitance \\(C\_p\\) and strain-dependent voltage source \\(V\_p\\). The resistance \\(R\_s\\) is the output impedance and \\(L\\) the cable inductance." >}} + +Consider the electrical circuit shown in Figure [1](#org393f35b) where a voltage source is connected to a piezoelectric actuator. +The actuator is modeled as a capacitance \\(C\_p\\) in series with a strain-dependent voltage source \\(V\_p\\). +The resistance \\(R\_s\\) and inductance \\(L\\) are the source impedance and the cable inductance respectively. + +
+
+ +Typical inductance of standard RG-58 coaxial cable is \\(250 nH/m\\). +Typical value of \\(R\_s\\) is between \\(10\\) and \\(100 \Omega\\). + +
+ +When considering the effects of both output impedance and cable inductance, the transfer function from source voltage \\(V\_s\\) to load voltage \\(V\_L\\) is second-order low pass filter: + +\begin{equation} + \frac{V\_L(s)}{V\_s(s)} = \frac{1}{\frac{s^2}{\omega\_r^2} + 2 \xi \frac{s}{\omega\_r} + 1} +\end{equation} + +with: + +- \\(\omega\_r = \frac{1}{\sqrt{L C\_p}}\\) +- \\(\xi = \frac{R\_s \sqrt{L C\_p}}{2 L}\\) -### 14.2 Bandwidth Limitations {#14-dot-2-bandwidth-limitations} +### Amplifier small-signal Bandwidth {#amplifier-small-signal-bandwidth} + +The most obvious bandwidth limitation is the small-signal bandwidth of the amplifier. + +If the inductance \\(L\\) is neglected, the transfer function from source voltage \\(V\_s\\) to load voltage \\(V\_L\\) forms a first order filter with a cut-off frequency + +\begin{equation} + \omega\_c = \frac{1}{R\_s C\_p} +\end{equation} + +This is thus highly dependent of the load. + +The high capacitive impedance nature of piezoelectric loads introduces phase-lag into the feedback path. +A rule of thumb is that closed-loop bandwidth cannot exceed one-tenth the cut-off frequency of the pole formed by the amplifier output impedance \\(R\_s\\) and load capacitance \\(C\_p\\) (see Table [1](#table--tab:piezo-limitation-Rs) for values). + + +
+ Table 1: + Bandwidth limitation due to \(R_s\) +
+ +| | Cp = 100 nF | Cp = 1 uF | Cp = 10 uF | +|--------------|-------------|-----------|------------| +| Rs = 1 Ohm | 1.6 MHz | 160 kHz | 16 kHz | +| Rs = 10 Ohm | 160 kHz | 16 kHz | 1.6 kHz | +| Rs = 100 Ohm | 16 kHz | 1.6 kHz | 160 Hz | + +The inductance \\(L\\) does also play a role in the amplifier bandwidth as it changes the resonance frequency. +Ideally, low inductance cables should be used. +It is however usually quite high compare to \\(\omega\_c\\) as shown in Table [2](#table--tab:piezo-limitation-L). + + +
+ Table 2: + Bandwidth limitation due to \(R_s\) +
+ +| | Cp = 100 nF | Cp = 1 uF | Cp = 10 uF | +|-------------|-------------|-----------|------------| +| L = 25 nH | 3.2 MHz | 1 MHz | 320 kHz | +| L = 250 nH | 1 MHz | 320 kHz | 100 kHz | +| L = 2500 nH | 320 kHz | 100 kHz | 32 kHz | -#### 14.2.1 Passive Bandwidth Limitations {#14-dot-2-dot-1-passive-bandwidth-limitations} +### Amplifier maximum slew rate {#amplifier-maximum-slew-rate} + +Further bandwidth restrictions are imposed by the maximum **slew rate** of the amplifier. +This is the maximum rate at which the output voltage can change and is usually expressed in \\(V/\mu s\\). + +For sinusoidal signals, the amplifiers slew rate must exceed: +\\[ SR\_{\text{sin}} > V\_{p-p} \pi f \\] +where \\(V\_{p-p}\\) is the peak to peak voltage and \\(f\\) is the frequency. + +
+
+ +If a 300kHz sine wave is to be reproduced with an amplitude of 10V, the required slew rate is \\(\approx 20 V/\mu s\\). + +
+ +When dealing with capacitive loads, **the current limit is usually exceed well before the slew rate limit**. -#### 14.2.2 Amplifier Bandwidth {#14-dot-2-dot-2-amplifier-bandwidth} +### Current and Power Limitations {#current-and-power-limitations} + +When driving the actuator off-resonance, the current delivered to a piezoelectric actuator is approximately: +\\[ I\_L(s) = V\_L(s) C\_p s \\] + +For sinusoidal signals, the maximum positive and negative current is equal to: +\\[ I\_L^\text{max} = V\_{p-p} \pi f C\_p \\] + + +
+ Table 3: + Minimum current requirements for a 10V sinusoid +
+ +| | Cp = 100 nF | Cp = 1 uF | Cp = 10 uF | +|-------------|-------------|-----------|------------| +| f = 30 Hz | 0.19 mA | 1.9 mA | 19 mA | +| f = 3 kHz | 19 mA | 190 mA | 1.9 A | +| f = 300 kHz | 1.9 A | 19 A | 190 A | -#### 14.2.3 Current and Power Limitations {#14-dot-2-dot-3-current-and-power-limitations} +### Chapter Summary {#chapter-summary} +The bandwidth limitations of standard piezoelectric drives were identified as: -### 14.3 Dual-Amplifier {#14-dot-3-dual-amplifier} - - -#### 14.3.1 Circuit Operation {#14-dot-3-dot-1-circuit-operation} - - -#### 14.3.2 Range Considerations {#14-dot-3-dot-2-range-considerations} - - -### 14.4 Electrical Design {#14-dot-4-electrical-design} - - -#### 14.4.1 High-Voltage Stage {#14-dot-4-dot-1-high-voltage-stage} - - -#### 14.4.2 Low-Voltage Stage {#14-dot-4-dot-2-low-voltage-stage} - - -#### 14.4.3 Cabling and Interconnects {#14-dot-4-dot-3-cabling-and-interconnects} - - -### 14.5 Chapter Summary {#14-dot-5-chapter-summary} +- High output impedance +- The presence of a ple in the voltage-feedback loop due to output impedance and load capacitance +- Insufficient current capacity due to power dissipation +- High cable and connector inductance ### References {#references} @@ -863,4 +948,4 @@ Year ## Bibliography {#bibliography} -Fleming, Andrew J., and Kam K. Leang. 2014. _Design, Modeling and Control of Nanopositioning Systems_. Advances in Industrial Control. Springer International Publishing. . +Fleming, Andrew J., and Kam K. Leang. 2014. _Design, Modeling and Control of Nanopositioning Systems_. Advances in Industrial Control. Springer International Publishing. . diff --git a/content/zettels/active_isolation_platforms.md b/content/zettels/active_isolation_platforms.md new file mode 100644 index 0000000..f33da01 --- /dev/null +++ b/content/zettels/active_isolation_platforms.md @@ -0,0 +1,15 @@ ++++ +title = "Active Isolation Platforms" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Vibration Isolation]({{< relref "vibration_isolation" >}}) + +| Manufacturers | Links | Country | +|---------------|------------------------------------------------------------------------|---------| +| TMC | [link](https://www.techmfg.com/) | USA | +| Newport | [link](https://www.newport.com/c/optical-tables-%26-isolation-systems) | USA | + +<./biblio/references.bib> diff --git a/content/zettels/granite.md b/content/zettels/granite.md new file mode 100644 index 0000000..cfcf10c --- /dev/null +++ b/content/zettels/granite.md @@ -0,0 +1,12 @@ ++++ +title = "Granite" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + + +<./biblio/references.bib> diff --git a/content/zettels/inertial_sensors.md b/content/zettels/inertial_sensors.md index d08f1c5..985e118 100644 --- a/content/zettels/inertial_sensors.md +++ b/content/zettels/inertial_sensors.md @@ -10,52 +10,60 @@ Tags ## Review of Absolute (inertial) Position Sensors {#review-of-absolute--inertial--position-sensors} -- Collette, C. et al., Review: inertial sensors for low-frequency seismic vibration measurement (Collette {\it et al.}, 2012) -- Collette, C. et al., Comparison of new absolute displacement sensors (Collette {\it et al.}, 2012) +- Collette, C. et al., Review: inertial sensors for low-frequency seismic vibration measurement ([Collette, Janssens, Fernandez-Carmona, et al. 2012](#org3cd922d)) +- Collette, C. et al., Comparison of new absolute displacement sensors ([Collette, Janssens, Mokrani, et al. 2012](#org8b5d5a2)) - + {{< figure src="/ox-hugo/collette12_absolute_disp_sensors.png" caption="Figure 1: Dynamic range of several types of inertial sensors; Price versus resolution for several types of inertial sensors" >}} ## Accelerometers {#accelerometers} -| Manufacturers | Links | -|--------------------|---------------------------------------------------------------| -| Micromega Dynamics | [link](https://micromega-dynamics.com/products/) | -| MMF | [link](https://www.mmf.de/seismic%5Faccelerometers.htm) | -| PCB | [link](https://www.pcb.com/products/productfinder.aspx?tx=14) | +| Manufacturers | Links | Country | +|--------------------|---------------------------------------------------------------------------------------------|---------| +| Micromega Dynamics | [link](https://micromega-dynamics.com/products/) | Belgium | +| MMF | [link](https://www.mmf.de/seismic%5Faccelerometers.htm) | Germany | +| PCB | [link](https://www.pcb.com/products/productfinder.aspx?tx=14) | USA | +| Guralp | [link](https://www.guralp.com/products/surface) | UK | +| Nanometric | [link](https://www.nanometrics.ca/products/accelerometers) | Canada | +| Kistler | [link](https://www.kistler.com/fr/produits/composants/accelerometres/?pfv%5Fmetrics=metric) | Swiss | Wireless Accelerometers - - + {{< figure src="/ox-hugo/inertial_sensors_characteristics_accelerometers.png" caption="Figure 2: Characteristics of commercially available accelerometers (Collette {\it et al.}, 2011)" >}} -## Geophones {#geophones} +## Geophones and Seismometers {#geophones-and-seismometers} -| Manufacturers | Links | -|---------------|----------------------------------------------------------------| -| Sercel | [link](http://www.sercel.com/products/Pages/seismometers.aspx) | -| Wilcoxon | [link](https://wilcoxon.com/) | +| Manufacturers | Links | Country | +|-----------------------|---------------------------------------------------------------------------------------------|---------| +| Sercel | [link](http://www.sercel.com/products/Pages/seismometers.aspx) | France | +| Wilcoxon | [link](https://wilcoxon.com/) | USA | +| Geospace technologies | [link](https://www.geospace.com/sensors/#) | USA | +| Ion | [link](https://www.iongeo.com/technologies/hardware/seismic-equipment/precision-geophones/) | USA | +| Streckeisen | [link](https://streckeisen.swiss/en/products/overview/) | Swiss | +| Guralp | [link](https://www.guralp.com/products/surface) | UK | +| Nanometric | [link](https://www.nanometrics.ca/products/seismometers) | Canada | - + {{< figure src="/ox-hugo/inertial_sensors_characteristics_geophone.png" caption="Figure 3: Characteristics of commercially available geophones (Collette {\it et al.}, 2011)" >}} -# Bibliography -Collette, C., Janssens, S., Fernandez-Carmona, P., Artoos, K., Guinchard, M., Hauviller, C., & Preumont, A., *Review: inertial sensors for low-frequency seismic vibration measurement*, Bulletin of the Seismological Society of America, *102(4)*, 1289–1300 (2012). http://dx.doi.org/10.1785/0120110223 [↩](#dd5109075933cf543c7eba0979c0ba50) -Collette, C., Janssens, S., Mokrani, B., Fueyo-Roza, L., Artoos, K., Esposito, M., Fernandez-Carmona, P., …, *Comparison of new absolute displacement sensors*, In , International Conference on Noise and Vibration Engineering (ISMA) (pp. ) (2012). : . [↩](#0b0b67de6dddc4d28031ab2d3b28cd3d) +## Bibliography {#bibliography} -Collette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., & Hauviller, C., *Review of sensors for low frequency seismic vibration measurement* (2011). [↩](#642a18d86de4e062c6afb0f5f20501c4) +Collette, C., S. Janssens, P. Fernandez-Carmona, K. Artoos, M. Guinchard, C. Hauviller, and A. Preumont. 2012. “Review: Inertial Sensors for Low-Frequency Seismic Vibration Measurement.” _Bulletin of the Seismological Society of America_ 102 (4):1289–1300. . + +Collette, C, S Janssens, B Mokrani, L Fueyo-Roza, K Artoos, M Esposito, P Fernandez-Carmona, M Guinchard, and R Leuxe. 2012. “Comparison of New Absolute Displacement Sensors.” In _International Conference on Noise and Vibration Engineering (ISMA)_. ## Backlinks {#backlinks} +- [Sensors]({{< relref "sensors" >}}) - [Collocated Control]({{< relref "collocated_control" >}}) - [Position Sensors]({{< relref "position_sensors" >}}) diff --git a/content/zettels/matlab.md b/content/zettels/matlab.md index a7beadd..04bce0b 100644 --- a/content/zettels/matlab.md +++ b/content/zettels/matlab.md @@ -12,11 +12,11 @@ Tags Books: -- (Higham, 2017) -- (Attaway, 2018) -- (Stack OverFlow, 2018) -- (Johnson, 2010) -- (Hahn \& Valentine, 2016) +- ([Higham 2017](#org80aac16)) +- ([Attaway 2018](#org689a4e6)) +- ([OverFlow 2018](#org6480d2d)) +- ([Johnson 2010](#org657d51a)) +- ([Hahn and Valentine 2016](#org23bf05a)) ## Useful Commands {#useful-commands} @@ -54,13 +54,28 @@ hold off; legend('Location', 'northeast'); ``` -# Bibliography -Higham, D., *Matlab guide* (2017), Philadelphia: Society for Industrial and Applied Mathematics. [↩](#88712982e0649b89da706b6abbcbc6c2) -Attaway, S., *Matlab : a practical introduction to programming and problem solving* (2018), Amsterdam: Butterworth-Heinemann. [↩](#15f4380b6ce8a647387d3ccea25711f1) +## Installation {#installation} -OverFlow, S., *Matlab notes for professionals* (2018), : GoalKicker.com. [↩](#e770e23b0d222a65eb74f036227b13b2) +If a single user is using the Matlab installation on the machine: -Johnson, R. K., *The elements of matlab style* (2010), : Cambridge University Press. [↩](#87b279fa5b4ec9b1a73abed2d00b313f) +```bash +sudo chown -R $LOGNAME: /usr/local/MATLAB/R2017b +``` -Hahn, B., & Valentine, D. T., *Essential matlab for engineers and scientists* (2016), : Academic Press. [↩](#1b4159c36c5367ee0c92139fb403e7e1) +Then, Toolboxes can be installed by the user without any problem. + +To install Toolboxes, the best is to Download the Matlab installer from mathworks and just select the wanted toolboxes. + + +## Bibliography {#bibliography} + +Attaway, Stormy. 2018. _MATLAB : a Practical Introduction to Programming and Problem Solving_. Amsterdam: Butterworth-Heinemann. + +Hahn, Brian, and Daniel T Valentine. 2016. _Essential MATLAB for Engineers and Scientists_. Academic Press. + +Higham, Desmond. 2017. _MATLAB Guide_. Philadelphia: Society for Industrial and Applied Mathematics. + +Johnson, Richard K. 2010. _The Elements of MATLAB Style_. Cambridge University Press. + +OverFlow, Stack. 2018. _MATLAB Notes for Professionals_. GoalKicker.com. diff --git a/content/zettels/piezoelectric_actuators.md b/content/zettels/piezoelectric_actuators.md index 139d9d4..e046229 100644 --- a/content/zettels/piezoelectric_actuators.md +++ b/content/zettels/piezoelectric_actuators.md @@ -13,23 +13,24 @@ Tags ### Manufacturers {#manufacturers} -| Manufacturers | Links | -|---------------------|----------------------------------------------------------------------------------------------------------------| -| Cedrat | [link](http://www.cedrat-technologies.com/) | -| PI | [link](https://www.physikinstrumente.com/en/) | -| Piezo System | [link](https://www.piezosystem.com/products/piezo%5Factuators/stacktypeactuators/) | -| Noliac | [link](http://www.noliac.com/) | -| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=8700) | -| PiezoDrive | [link](https://www.piezodrive.com/actuators/) | -| Mechano Transformer | [link](http://www.mechano-transformer.com/en/products/10.html) | -| CoreMorrow | [link](http://www.coremorrow.com/en/pro-9-1.html) | -| PiezoData | [link](https://www.piezodata.com/piezo-stack-actuator-2/) | -| Queensgate | [link](https://www.nanopositioning.com/product-category/nanopositioning/nanopositioning-actuators-translators) | +| Manufacturers | Links | Country | +|---------------------|----------------------------------------------------------------------------------------------------------------|-----------| +| Cedrat | [link](http://www.cedrat-technologies.com/) | France | +| PI | [link](https://www.physikinstrumente.com/en/) | USA | +| Piezo System | [link](https://www.piezosystem.com/products/piezo%5Factuators/stacktypeactuators/) | Germany | +| Noliac | [link](http://www.noliac.com/) | Denmark | +| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=8700) | USA | +| PiezoDrive | [link](https://www.piezodrive.com/actuators/) | Australia | +| Mechano Transformer | [link](http://www.mechano-transformer.com/en/products/10.html) | Japan | +| CoreMorrow | [link](http://www.coremorrow.com/en/pro-9-1.html) | China | +| PiezoData | [link](https://www.piezodata.com/piezo-stack-actuator-2/) | China | +| Queensgate | [link](https://www.nanopositioning.com/product-category/nanopositioning/nanopositioning-actuators-translators) | UK | +| Matsusada Precision | [link](https://www.matsusada.com/product/pz/) | Japan | ### Model {#model} -A model of a multi-layer monolithic piezoelectric stack actuator is described in ([Fleming 2010](#org7ef2e50)) ([Notes]({{< relref "fleming10_nanop_system_with_force_feedb" >}})). +A model of a multi-layer monolithic piezoelectric stack actuator is described in ([Fleming 2010](#org1025f36)) ([Notes]({{< relref "fleming10_nanop_system_with_force_feedb" >}})). Basically, it can be represented by a spring \\(k\_a\\) with the force source \\(F\_a\\) in parallel. @@ -44,27 +45,27 @@ with: ## Mechanically Amplified Piezoelectric actuators {#mechanically-amplified-piezoelectric-actuators} -The Amplified Piezo Actuators principle is presented in ([Claeyssen et al. 2007](#orgc110fa4)): +The Amplified Piezo Actuators principle is presented in ([Claeyssen et al. 2007](#org4de69d6)): > The displacement amplification effect is related in a first approximation to the ratio of the shell long axis length to the short axis height. > The flatter is the actuator, the higher is the amplification. -A model of an amplified piezoelectric actuator is described in ([Lucinskis and Mangeot 2016](#orge1d2714)). +A model of an amplified piezoelectric actuator is described in ([Lucinskis and Mangeot 2016](#org2278a86)). - + {{< figure src="/ox-hugo/ling16_topology_piezo_mechanism_types.png" caption="Figure 1: Topology of several types of compliant mechanisms (Mingxiang Ling {\it et al.}, 2016)" >}} -| Manufacturers | Links | -|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Cedrat | [link](https://www.cedrat-technologies.com/en/products/actuators/amplified-piezo-actuators.html) | -| PiezoDrive | [link](https://www.piezodrive.com/actuators/ap-series-amplified-piezoelectric-actuators/) | -| Dynamic-Structures | [link](https://www.dynamic-structures.com/category/piezo-actuators-stages) | -| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=8700) | -| Noliac | [link](http://www.noliac.com/products/actuators/amplified-actuators/) | -| Mechano Transformer | [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5F5.html), [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5F3.html), [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5Fmtkk.html) | -| CoreMorrow | [link](http://www.coremorrow.com/en/pro-13-1.html) | -| PiezoData | [link](https://www.piezodata.com/piezoelectric-actuator-amplifier/) | +| **Manufacturers** | **Links** | **Country** | +|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------| +| Cedrat | [link](https://www.cedrat-technologies.com/en/products/actuators/amplified-piezo-actuators.html) | France | +| PiezoDrive | [link](https://www.piezodrive.com/actuators/ap-series-amplified-piezoelectric-actuators/) | Australia | +| Dynamic-Structures | [link](https://www.dynamic-structures.com/category/piezo-actuators-stages) | USA | +| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=8700) | USA | +| Noliac | [link](http://www.noliac.com/products/actuators/amplified-actuators/) | Denmark | +| Mechano Transformer | [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5F5.html), [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5F3.html), [link](http://www.mechano-transformer.com/en/products/01a%5Factuator%5Fmtkk.html) | Japan | +| CoreMorrow | [link](http://www.coremorrow.com/en/pro-13-1.html) | China | +| PiezoData | [link](https://www.piezodata.com/piezoelectric-actuator-amplifier/) | China | ## Specifications {#specifications} @@ -143,54 +144,54 @@ For a piezoelectric stack with a displacement of \\(100\,[\mu m]\\), the resolut ### Electrical Capacitance {#electrical-capacitance} -The electrical capacitance may limit the maximum voltage that can be used to drive the piezoelectric actuator as a function of frequency (Figure [2](#orgebd19c2)). +The electrical capacitance may limit the maximum voltage that can be used to drive the piezoelectric actuator as a function of frequency (Figure [2](#org4b5f8bd)). This is due to the fact that voltage amplifier has a limitation on the deliverable current. [Voltage Amplifier]({{< relref "voltage_amplifier" >}}) with high maximum output current should be used if either high bandwidth is wanted or piezoelectric stacks with high capacitance are to be used. - + {{< figure src="/ox-hugo/piezoelectric_capacitance_voltage_max.png" caption="Figure 2: Maximum sin-wave amplitude as a function of frequency for several piezoelectric capacitance" >}} ## Piezoelectric actuator experiencing a mass load {#piezoelectric-actuator-experiencing-a-mass-load} -When the piezoelectric actuator is supporting a payload, it will experience a static deflection due to its finite stiffness \\(\Delta l\_n = \frac{mg}{k\_p}\\), but its stroke will remain unchanged (Figure [3](#orgb64bc37)). +When the piezoelectric actuator is supporting a payload, it will experience a static deflection due to its finite stiffness \\(\Delta l\_n = \frac{mg}{k\_p}\\), but its stroke will remain unchanged (Figure [3](#org6e4c8b2)). - + {{< figure src="/ox-hugo/piezoelectric_mass_load.png" caption="Figure 3: Motion of a piezoelectric stack actuator under external constant force" >}} ## Piezoelectric actuator in contact with a spring load {#piezoelectric-actuator-in-contact-with-a-spring-load} -Then the piezoelectric actuator is in contact with a spring load \\(k\_e\\), its maximum stroke \\(\Delta L\\) is less than its free stroke \\(\Delta L\_f\\) (Figure [4](#org944d760)): +Then the piezoelectric actuator is in contact with a spring load \\(k\_e\\), its maximum stroke \\(\Delta L\\) is less than its free stroke \\(\Delta L\_f\\) (Figure [4](#orgadae726)): \begin{equation} \Delta L = \Delta L\_f \frac{k\_p}{k\_p + k\_e} \end{equation} - + {{< figure src="/ox-hugo/piezoelectric_spring_load.png" caption="Figure 4: Motion of a piezoelectric stack actuator in contact with a stiff environment" >}} -For piezo actuators, force and displacement are inversely related (Figure [5](#org0a60bcb)). +For piezo actuators, force and displacement are inversely related (Figure [5](#org51f52cb)). Maximum, or blocked, force (\\(F\_b\\)) occurs when there is no displacement. Likewise, at maximum displacement, or free stroke, (\\(\Delta L\_f\\)) no force is generated. When an external load is applied, the stiffness of the load (\\(k\_e\\)) determines the displacement (\\(\Delta L\_A\\)) and force (\\(\Delta F\_A\\)) that can be produced. - + {{< figure src="/ox-hugo/piezoelectric_force_displ_relation.png" caption="Figure 5: Relation between the maximum force and displacement" >}} ## Bibliography {#bibliography} -Claeyssen, Frank, R. Le Letty, F. Barillot, and O. Sosnicki. 2007. “Amplified Piezoelectric Actuators: Static & Dynamic Applications.” _Ferroelectrics_ 351 (1):3–14. . +Claeyssen, Frank, R. Le Letty, F. Barillot, and O. Sosnicki. 2007. “Amplified Piezoelectric Actuators: Static & Dynamic Applications.” _Ferroelectrics_ 351 (1):3–14. . -Fleming, A.J. 2010. “Nanopositioning System with Force Feedback for High-Performance Tracking and Vibration Control.” _IEEE/ASME Transactions on Mechatronics_ 15 (3):433–47. . +Fleming, A.J. 2010. “Nanopositioning System with Force Feedback for High-Performance Tracking and Vibration Control.” _IEEE/ASME Transactions on Mechatronics_ 15 (3):433–47. . -Lucinskis, R., and C. Mangeot. 2016. “Dynamic Characterization of an Amplified Piezoelectric Actuator.” +Lucinskis, R., and C. Mangeot. 2016. “Dynamic Characterization of an Amplified Piezoelectric Actuator.” ## Backlinks {#backlinks} diff --git a/content/zettels/shaker.md b/content/zettels/shaker.md index e0d3916..3ca6838 100644 --- a/content/zettels/shaker.md +++ b/content/zettels/shaker.md @@ -10,8 +10,12 @@ Tags ## Manufacturers {#manufacturers} -| Manufacturers | Links | -|---------------|-------------------------------------------------------------------| -| Labsen | [link](http://labsentec.com.au/category/products/vibrationshock/) | +| Manufacturers | Links | +|-----------------|----------------------------------------------------------------------------------| +| Labsen | [link](http://labsentec.com.au/category/products/vibrationshock/) | +| The Modal Shop | [link](http://www.modalshop.com/excitation/Electrodynamic-Exciter-Family?ID=243) | +| Deweshop | [link](https://dewesoft.com/fr/products/interfaces-and-sensors/shakers) | +| Bruel and Kjaer | [link](https://www.bksv.com/en/products/shakers-and-exciters/LDS-shaker-systems) | +| YMC | [link](http://www.chinaymc.com/product/showproduct.php?id=78&lang=en) | <./biblio/references.bib> diff --git a/content/zettels/signal_to_noise_ratio.md b/content/zettels/signal_to_noise_ratio.md index a358fc8..847a42a 100644 --- a/content/zettels/signal_to_noise_ratio.md +++ b/content/zettels/signal_to_noise_ratio.md @@ -10,7 +10,7 @@ Tags ## SNR to Noise PSD {#snr-to-noise-psd} -From ([Jabben 2007](#orgd8e3764)) (Section 3.3.2): +From ([Jabben 2007](#org05d266b)) (Section 3.3.2): > Electronic equipment does most often not come with detailed electric schemes, in which case the PSD should be determined from measurements. > In the design phase however, one has to rely on information provided by specification sheets from the manufacturer. @@ -77,13 +77,13 @@ Let's say the wanted noise is \\(1 mV, \text{rms}\\) for a full range of \\(20 V ## Noise Density to RMS noise {#noise-density-to-rms-noise} -From ([Fleming 2010](#org68e05a9)): +From ([Fleming 2010](#org8235840)): \\[ \text{RMS noise} = \sqrt{2 \times \text{bandwidth}} \times \text{noise density} \\] If the noise is normally distributed, the RMS value is also the standard deviation \\(\sigma\\). The peak to peak amplitude is then approximatively \\(6 \sigma\\). -
+
- noise density = \\(20 pm/\sqrt{Hz}\\) @@ -97,13 +97,15 @@ The peak-to-peak noise will be approximately \\(6 \sigma = 1.7 nm\\) ## Bibliography {#bibliography} -Fleming, A.J. 2010. “Nanopositioning System with Force Feedback for High-Performance Tracking and Vibration Control.” _IEEE/ASME Transactions on Mechatronics_ 15 (3):433–47. . +Fleming, A.J. 2010. “Nanopositioning System with Force Feedback for High-Performance Tracking and Vibration Control.” _IEEE/ASME Transactions on Mechatronics_ 15 (3):433–47. . -Jabben, Leon. 2007. “Mechatronic Design of a Magnetically Suspended Rotating Platform.” Delft University. +Jabben, Leon. 2007. “Mechatronic Design of a Magnetically Suspended Rotating Platform.” Delft University. ## Backlinks {#backlinks} - [Piezoelectric Actuators]({{< relref "piezoelectric_actuators" >}}) +- [Power Spectral Density]({{< relref "power_spectral_density" >}}) +- [Position Sensors]({{< relref "position_sensors" >}}) - [Voltage Amplifier]({{< relref "voltage_amplifier" >}}) - [Voltage Amplifier]({{< relref "voltage_amplifier" >}}) diff --git a/content/zettels/voltage_amplifier.md b/content/zettels/voltage_amplifier.md index af29ac1..d70eadf 100644 --- a/content/zettels/voltage_amplifier.md +++ b/content/zettels/voltage_amplifier.md @@ -15,9 +15,9 @@ Tags The piezoelectric stack can be represented as a capacitance. -Let's take a capacitance driven by a voltage amplifier (Figure [1](#org0d9f468)). +Let's take a capacitance driven by a voltage amplifier (Figure [1](#orgcab6e6f)). - + {{< figure src="/ox-hugo/voltage_amplifier_capacitance.png" caption="Figure 1: Piezoelectric actuator model with a voltage source" >}} @@ -37,7 +37,7 @@ Thus, for a specified maximum current \\(I\_\text{max}\\), the "power bandwidth" - Above \\(\omega\_{0, \text{max}}\\), the maximum current \\(I\_\text{max}\\) is reached and the maximum voltage that can be applied decreases with frequency: \\[ U\_\text{max} = \frac{I\_\text{max}}{\omega C} \\] -The maximum voltage as a function of frequency is shown in Figure [2](#org8625e7c). +The maximum voltage as a function of frequency is shown in Figure [2](#org1475933). ```matlab Vpkp = 170; % [V] @@ -51,7 +51,7 @@ C = 1e-6; % [F] 56.172 ``` - + {{< figure src="/ox-hugo/voltage_amplifier_max_V_piezo.png" caption="Figure 2: Maximum voltage as a function of the frequency for \\(C = 1 \mu F\\), \\(I\_\text{max} = 30mA\\) and \\(V\_{pkp} = 170 V\\)" >}} @@ -63,6 +63,19 @@ If driven at \\(\Delta U = 100V\\), \\(C = 1 \mu F\\) and \\(I\_\text{max} = 1 A \\[ t\_c = \frac{100 \cdot 10^{-6}}{1} = 0.1 ms \\] +### Bandwidth limitation (small signals) {#bandwidth-limitation--small-signals} + +This is takken from Chapter 14 of ([Fleming and Leang 2014](#org01aad4a)). + +```matlab +L = 250e-9; % Cable inductance [H] +Cp = 10e-6; % Driving capacitance [F] +Rs = 10; % Source impedance [Ohm] + +G = 1/(L*Cp)/(s^2 + Rs/L*s + 1/(L*Cp)); +``` + + ### Amplifiers for Low Voltage PZT {#amplifiers-for-low-voltage-pzt} Piezoelectric Stack Actuators are behaving like capacitor for the Amplifiers. @@ -75,21 +88,26 @@ Specifications are usually: The bandwidth can be estimated from the Maximum Current and the Capacitance of the Piezoelectric Actuator. -| Manufacturers | Links | -|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| Piezo Drive | [link](https://www.piezodrive.com/drivers/) | -| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=13630) | -| PI | [link](https://www.pi-usa.us/en/products/controllers-drivers-motion-control-software/piezo-drivers-controllers-power-supplies-high-voltage-amplifiers/) | -| Micromega Dynamics | | -| Lab Systems | [link](https://www.lab-systems.com/products/amplifier/amplifier.html) | -| Falco System | [link](https://www.falco-systems.com/products.html) | -| Piezomechanics | [link](https://www.piezomechanik.com/products/) | -| Cedrat Technologies | [link](https://www.cedrat-technologies.com/en/products/piezo-controllers/electronic-amplifier-boards.html) | -| acal | [link](https://www.acalbfi.com/nl/Electronic-test-and-measurement/High-voltage-amplifiers/c/CAT-06-03) | -| Trek | [link](https://www.trekinc.com/products/HV%5FAmp.asp) | -| Madcitylabs | [link](http://www.madcitylabs.com/piezoactuators.html) | +| Manufacturers | Links | Country | +|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|-------------| +| Piezo Drive | [link](https://www.piezodrive.com/drivers/) | Australia | +| Thorlabs | [link](https://www.thorlabs.com/navigation.cfm?guide%5FID=2085) | USA | +| PI | [link](https://www.pi-usa.us/en/products/controllers-drivers-motion-control-software/piezo-drivers-controllers-power-supplies-high-voltage-amplifiers/) | USA | +| Micromega Dynamics | | Belgium | +| Lab Systems | [link](https://www.lab-systems.com/products/amplifier/amplifier.html) | Isreal | +| Falco System | [link](https://www.falco-systems.com/products.html) | Netherlands | +| Piezomechanics | [link](https://www.piezomechanik.com/products/) | Germany | +| Cedrat Technologies | [link](https://www.cedrat-technologies.com/en/products/piezo-controllers/electronic-amplifier-boards.html) | France | +| Trek | [link](https://www.trekinc.com/products/HV%5FAmp.asp) | USA | +| Madcitylabs | [link](http://www.madcitylabs.com/piezoactuators.html) | USA | +| Piezosystem | [link](https://www.piezosystem.com/products/controller/) | Germany | +| Matsusada Precision | [link](https://www.matsusada.com/product/pz/) | Japan | +| Mechano Transformer | [link](http://www.mechano-transformer.com/en/products/08.html) | Japan | -<./biblio/references.bib> + +## Bibliography {#bibliography} + +Fleming, Andrew J., and Kam K. Leang. 2014. _Design, Modeling and Control of Nanopositioning Systems_. Advances in Industrial Control. Springer International Publishing. . ## Backlinks {#backlinks} diff --git a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content index 672aec2..0babb2b 100644 --- a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content +++ b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:chancery;src:url(../fonts/chancery/apple-chancery-webfont.eot);src:local("Apple Chancery"),url(../fonts/chancery/apple-chancery-webfont.eot?#iefix)format("embedded-opentype"),url(../fonts/chancery/apple-chancery-webfont.woff2)format("woff2"),url(../fonts/chancery/apple-chancery-webfont.woff)format("woff"),url(../fonts/chancery/apple-chancery-webfont.ttf)format("truetype"),url(../fonts/chancery/apple-chancery-webfont.svg#apple-chancery)format("svg");font-weight:lighter;font-style:normal}.post .post-content a.reference-link{font-weight:700;font-style:italic;font-color:#34495e;color:#34495e}.post .post-content a.reference-link:hover{border-bottom-color:#c05b4d #f8f5ec}.post .post-content a.bibtex-entry:target{background-color:#ffa}/*!normalize.css v3.0.2 | MIT License | git.io/normalize*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;box-sizing:border-box}body{padding:0;margin:0;font-family:source sans pro,helvetica neue,Arial,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:#34495e;background:#fefefe;scroll-behavior:smooth;border-top:3px solid #c05b4d}@media screen and (max-width:800px){body{border-top:0}}::selection{background:#c05b4d;color:#fff}img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}a{color:#34495e;text-decoration:none}h1{font-size:26px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h2{font-size:24px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h3{font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h4{font-size:16px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h5{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h6{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.container{margin:0 auto;width:800px}@media screen and (max-width:800px){.container{width:100%;box-shadow:-1px -5px 5px #cacaca}}.content-wrapper{padding:0 20px}.video-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:iconfont;src:url(../fonts/iconfont/iconfont.eot);src:url(../fonts/iconfont/iconfont.eot#iefix)format("embedded-opentype"),url(../fonts/iconfont/iconfont.woff)format("woff"),url(../fonts/iconfont/iconfont.ttf)format("truetype"),url(../fonts/iconfont/iconfont.svg#iconfont)format("svg")}.iconfont{font-family:iconfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-text-stroke-width:.2px;cursor:pointer;letter-spacing:0;font-feature-settings:"liga";font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bilibili:before{content:"\e900";font-size:.9em;position:relative;top:-4px}.icon-instagram:before{font-size:.95em;content:"\e611";position:relative;top:1px}.icon-douban:before{content:"\e610";position:relative;top:2px}.icon-tumblr:before{content:"\e69f";font-size:.85em;position:relative;top:-2px}.icon-linkedin:before{content:"\e60d";position:relative;top:-2px}.icon-twitter:before{content:"\e600"}.icon-weibo:before{content:"\e602";position:relative;top:2px}.icon-stack-overflow:before{content:"\e902";font-size:.85em;position:relative;top:-4px}.icon-email:before{content:"\e605";position:relative;top:-2px}.icon-facebook:before{content:"\e601";font-size:.95em;position:relative;top:-2px}.icon-gitlab:before{content:"\e901";font-size:.9em;position:relative;top:-4px}.icon-github:before{content:"\e606";position:relative;top:-1px}.icon-rss:before{content:"\e604"}.icon-google:before{content:"\e609";position:relative;top:2px}.icon-zhihu:before{content:"\e607";font-size:.9em}.icon-pocket:before{content:"\e856";position:relative;top:2px}.icon-heart:before{content:"\e608"}.icon-right:before{content:"\e60a"}.icon-left:before{content:"\e60b"}.icon-up:before{content:"\e60c"}.icon-close:before{content:"\e60f"}.icon-link:before{content:"\e909"}.header{padding:20px}.header:before,.header:after{content:" ";display:table}.header:after{clear:both}.header .logo-wrapper{float:left}.header .logo-wrapper .logo{font-size:48px;font-family:chancery,cursive,LiSu,sans-serif}@media screen and (max-width:800px){.header .logo-wrapper{display:none}}.header .site-navbar{float:right}.header .site-navbar .menu{display:inline-block;position:relative;padding-left:0;padding-right:25px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.header .site-navbar .menu .menu-item{display:inline-block;display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.header .site-navbar .menu .menu-item+.menu-item{margin-left:10px}.header .site-navbar .menu .menu-item:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.header .site-navbar .menu .menu-item.active:before,.header .site-navbar .menu .menu-item:active:before,.header .site-navbar .menu .menu-item:focus:before,.header .site-navbar .menu .menu-item:hover:before{right:0;left:0}.header .site-navbar .menu .menu-item-link{font-size:18px}@media screen and (max-width:800px){.header .site-navbar{display:none}}@media screen and (max-width:800px){.header{padding:50px 0 0;text-align:center}}.posts{margin-bottom:20px;border-bottom:1px solid #e6e6e6}.post{padding:1.5em 0}.post+.post{border-top:1px solid #e6e6e6}.post .post-header{margin-bottom:20px}.post .post-header .post-title{margin:0;font-size:27px;font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-header .post-link{display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.post .post-header .post-link:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.post .post-header .post-link.active:before,.post .post-header .post-link:active:before,.post .post-header .post-link:focus:before,.post .post-header .post-link:hover:before{right:0;left:0}.post .post-header .post-meta{font-size:14px;color:#8a8a8a}.post .post-header .post-meta .post-time{font-size:15px}.post .post-header .post-meta .post-category{display:inline}.post .post-header .post-meta .post-category a{color:inherit}.post .post-header .post-meta .post-category a::before{content:'·'}.post .post-header .post-meta .post-category a:hover{color:#c05b4d}.post .post-header .post-meta .more-meta::before{content:'·'}.post .post-toc{position:absolute;width:200px;margin-left:785px;padding:10px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;border-radius:5px;background:rgba(248,245,236,.6);box-shadow:1px 1px 2px rgba(0,0,0,.125);word-wrap:break-word;box-sizing:border-box}.post .post-toc .post-toc-title{margin:0 10px;font-size:20px;font-weight:400;text-transform:uppercase}.post .post-toc .post-toc-content{font-size:15px}.post .post-toc .post-toc-content.always-active ul{display:block}.post .post-toc .post-toc-content>nav>ul{margin:10px 0}.post .post-toc .post-toc-content ul{padding-left:20px;list-style:square}.post .post-toc .post-toc-content ul ul{padding-left:15px;display:none}.post .post-toc .post-toc-content ul .has-active>ul{display:block}.post .post-toc .post-toc-content .toc-link.active{color:#c05b4d}@media screen and (max-width:1185px){.post .post-toc{display:none}}.post .post-content{word-wrap:break-word}.post .post-content h1{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h1 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h1 .anchor:hover{border-bottom:initial}.post .post-content h1 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h1 .anchor .icon-link:before{vertical-align:middle}.post .post-content h1:hover .icon-link{visibility:visible}.post .post-content h2{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h2 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h2 .anchor:hover{border-bottom:initial}.post .post-content h2 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h2 .anchor .icon-link:before{vertical-align:middle}.post .post-content h2:hover .icon-link{visibility:visible}.post .post-content h3{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h3 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h3 .anchor:hover{border-bottom:initial}.post .post-content h3 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h3 .anchor .icon-link:before{vertical-align:middle}.post .post-content h3:hover .icon-link{visibility:visible}.post .post-content h4{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h4 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h4 .anchor:hover{border-bottom:initial}.post .post-content h4 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h4 .anchor .icon-link:before{vertical-align:middle}.post .post-content h4:hover .icon-link{visibility:visible}.post .post-content h5{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h5 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h5 .anchor:hover{border-bottom:initial}.post .post-content h5 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h5 .anchor .icon-link:before{vertical-align:middle}.post .post-content h5:hover .icon-link{visibility:visible}.post .post-content h6{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h6 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h6 .anchor:hover{border-bottom:initial}.post .post-content h6 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h6 .anchor .icon-link:before{vertical-align:middle}.post .post-content h6:hover .icon-link{visibility:visible}.post .post-content a{color:#c05b4d;word-break:break-all}.post .post-content a:hover{border-bottom:1px solid #c05b4d}.post .post-content blockquote{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(192,91,77,.05);border-left:3px solid rgba(192,91,77,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .post-content blockquote p{margin:0}.post .post-content figure{justify-content:center;align-items:center}.post .post-content figure img{display:block;margin-right:auto;margin-left:auto}.post .post-content img{display:inline-block;max-width:100%}.post .post-content .table-wrapper{overflow-x:auto}.post .post-content .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:2px 2px 3px rgba(0,0,0,.125)}.post .post-content .table-wrapper>table thead{background:#f8f5ec}.post .post-content .table-wrapper>table th,.post .post-content .table-wrapper>table td{padding:5px 15px;border:1px double #f4efe1}.post .post-content .table-wrapper>table tr:hover{background-color:#f8f5ec}.post .post-content code,.post .post-content pre{padding:7px;font-size:.9em;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,monospace;background:#f8f5ec}.post .post-content code{padding:3px 5px;border-radius:4px;color:#c7254e}.post .post-content figure.highlight{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative}.post .post-content figure.highlight table{position:relative}.post .post-content figure.highlight table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content figure.highlight.language-bash>table::after{content:"Bash"}.post .post-content figure.highlight.language-c>table::after{content:"C"}.post .post-content figure.highlight.language-cs>table::after{content:"C#"}.post .post-content figure.highlight.language-cpp>table::after{content:"C++"}.post .post-content figure.highlight.language-css>table::after{content:"CSS"}.post .post-content figure.highlight.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content figure.highlight.language-html>table::after{content:"HTML"}.post .post-content figure.highlight.language-xml>table::after{content:"XML"}.post .post-content figure.highlight.language-http>table::after{content:"HTTP"}.post .post-content figure.highlight.language-json>table::after{content:"JSON"}.post .post-content figure.highlight.language-java>table::after{content:"Java"}.post .post-content figure.highlight.language-js>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-javascript>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-makefile>table::after{content:"Makefile"}.post .post-content figure.highlight.language-markdown>table::after{content:"Markdown"}.post .post-content figure.highlight.language-objectivec>table::after{content:"Objective-C"}.post .post-content figure.highlight.language-php>table::after{content:"PHP"}.post .post-content figure.highlight.language-perl>table::after{content:"Perl"}.post .post-content figure.highlight.language-python>table::after{content:"Python"}.post .post-content figure.highlight.language-ruby>table::after{content:"Ruby"}.post .post-content figure.highlight.language-sql>table::after{content:"SQL"}.post .post-content figure.highlight.language-shell>table::after{content:"Shell"}.post .post-content figure.highlight.language-erlang>table::after{content:"Erlang"}.post .post-content figure.highlight.language-go>table::after{content:"Go"}.post .post-content figure.highlight.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content figure.highlight.language-groovy>table::after{content:"Groovy"}.post .post-content figure.highlight.language-haskell>table::after{content:"Haskell"}.post .post-content figure.highlight.language-kotlin>table::after{content:"Kotlin"}.post .post-content figure.highlight.language-clojure>table::after{content:"Clojure"}.post .post-content figure.highlight.language-less>table::after{content:"Less"}.post .post-content figure.highlight.language-lisp>table::after{content:"Lisp"}.post .post-content figure.highlight.language-lua>table::after{content:"Lua"}.post .post-content figure.highlight.language-matlab>table::after{content:"Matlab"}.post .post-content figure.highlight.language-rust>table::after{content:"Rust"}.post .post-content figure.highlight.language-scss>table::after{content:"Scss"}.post .post-content figure.highlight.language-scala>table::after{content:"Scala"}.post .post-content figure.highlight.language-swift>table::after{content:"Swift"}.post .post-content figure.highlight.language-typescript>table::after{content:"TypeScript"}.post .post-content figure.highlight.language-yml>table::after{content:"YAML"}.post .post-content figure.highlight.language-yaml>table::after{content:"YAML"}.post .post-content figure.highlight.language-toml>table::after{content:"TOML"}.post .post-content figure.highlight.language-diff>table::after{content:"Diff"}.post .post-content figure.highlight .code pre{margin:0;padding:30px 10px 10px}.post .post-content figure.highlight .gutter{width:10px;color:#cacaca}.post .post-content figure.highlight .gutter pre{margin:0;padding:30px 7px 10px}.post .post-content figure.highlight .line{height:1em}.post .post-content figure.highlight table,.post .post-content figure.highlight tr,.post .post-content figure.highlight td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content figure.highlight .code .hljs-comment,.post .post-content figure.highlight .code .hljs-quote{color:#93a1a1}.post .post-content figure.highlight .code .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-tag,.post .post-content figure.highlight .code .hljs-addition{color:#859900}.post .post-content figure.highlight .code .hljs-number,.post .post-content figure.highlight .code .hljs-string,.post .post-content figure.highlight .code .hljs-meta .hljs-meta-string,.post .post-content figure.highlight .code .hljs-literal,.post .post-content figure.highlight .code .hljs-doctag,.post .post-content figure.highlight .code .hljs-regexp{color:#2aa198}.post .post-content figure.highlight .code .hljs-title,.post .post-content figure.highlight .code .hljs-section,.post .post-content figure.highlight .code .hljs-name,.post .post-content figure.highlight .code .hljs-selector-id,.post .post-content figure.highlight .code .hljs-selector-class{color:#268bd2}.post .post-content figure.highlight .code .hljs-attribute,.post .post-content figure.highlight .code .hljs-attr,.post .post-content figure.highlight .code .hljs-variable,.post .post-content figure.highlight .code .hljs-template-variable,.post .post-content figure.highlight .code .hljs-class .hljs-title,.post .post-content figure.highlight .code .hljs-type{color:#b58900}.post .post-content figure.highlight .code .hljs-symbol,.post .post-content figure.highlight .code .hljs-bullet,.post .post-content figure.highlight .code .hljs-subst,.post .post-content figure.highlight .code .hljs-meta,.post .post-content figure.highlight .code .hljs-meta .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-attr,.post .post-content figure.highlight .code .hljs-selector-pseudo,.post .post-content figure.highlight .code .hljs-link{color:#cb4b16}.post .post-content figure.highlight .code .hljs-built_in,.post .post-content figure.highlight .code .hljs-deletion{color:#dc322f}.post .post-content figure.highlight .code .hljs-formula{background:#eee8d5}.post .post-content figure.highlight .code .hljs-emphasis{font-style:italic}.post .post-content figure.highlight .code .hljs-strong{font-weight:700}.post .post-content .highlight>.chroma{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative;background:#f8f5ec}.post .post-content .highlight>.chroma code{padding:0}.post .post-content .highlight>.chroma table{position:relative}.post .post-content .highlight>.chroma table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content .highlight>.chroma.language-bash>table::after{content:"Bash"}.post .post-content .highlight>.chroma.language-c>table::after{content:"C"}.post .post-content .highlight>.chroma.language-cs>table::after{content:"C#"}.post .post-content .highlight>.chroma.language-cpp>table::after{content:"C++"}.post .post-content .highlight>.chroma.language-css>table::after{content:"CSS"}.post .post-content .highlight>.chroma.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content .highlight>.chroma.language-html>table::after{content:"HTML"}.post .post-content .highlight>.chroma.language-xml>table::after{content:"XML"}.post .post-content .highlight>.chroma.language-http>table::after{content:"HTTP"}.post .post-content .highlight>.chroma.language-json>table::after{content:"JSON"}.post .post-content .highlight>.chroma.language-java>table::after{content:"Java"}.post .post-content .highlight>.chroma.language-js>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-javascript>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-makefile>table::after{content:"Makefile"}.post .post-content .highlight>.chroma.language-markdown>table::after{content:"Markdown"}.post .post-content .highlight>.chroma.language-objectivec>table::after{content:"Objective-C"}.post .post-content .highlight>.chroma.language-php>table::after{content:"PHP"}.post .post-content .highlight>.chroma.language-perl>table::after{content:"Perl"}.post .post-content .highlight>.chroma.language-python>table::after{content:"Python"}.post .post-content .highlight>.chroma.language-ruby>table::after{content:"Ruby"}.post .post-content .highlight>.chroma.language-sql>table::after{content:"SQL"}.post .post-content .highlight>.chroma.language-shell>table::after{content:"Shell"}.post .post-content .highlight>.chroma.language-erlang>table::after{content:"Erlang"}.post .post-content .highlight>.chroma.language-go>table::after{content:"Go"}.post .post-content .highlight>.chroma.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content .highlight>.chroma.language-groovy>table::after{content:"Groovy"}.post .post-content .highlight>.chroma.language-haskell>table::after{content:"Haskell"}.post .post-content .highlight>.chroma.language-kotlin>table::after{content:"Kotlin"}.post .post-content .highlight>.chroma.language-clojure>table::after{content:"Clojure"}.post .post-content .highlight>.chroma.language-less>table::after{content:"Less"}.post .post-content .highlight>.chroma.language-lisp>table::after{content:"Lisp"}.post .post-content .highlight>.chroma.language-lua>table::after{content:"Lua"}.post .post-content .highlight>.chroma.language-matlab>table::after{content:"Matlab"}.post .post-content .highlight>.chroma.language-rust>table::after{content:"Rust"}.post .post-content .highlight>.chroma.language-scss>table::after{content:"Scss"}.post .post-content .highlight>.chroma.language-scala>table::after{content:"Scala"}.post .post-content .highlight>.chroma.language-swift>table::after{content:"Swift"}.post .post-content .highlight>.chroma.language-typescript>table::after{content:"TypeScript"}.post .post-content .highlight>.chroma.language-yml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-yaml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-toml>table::after{content:"TOML"}.post .post-content .highlight>.chroma.language-diff>table::after{content:"Diff"}.post .post-content .highlight>.chroma .lntd{line-height:1em}.post .post-content .highlight>.chroma .lntd:first-child{width:10px}.post .post-content .highlight>.chroma .lntd:first-child pre{margin:0;padding:30px 7px 10px}.post .post-content .highlight>.chroma .lntd:last-child{vertical-align:top}.post .post-content .highlight>.chroma .lntd:last-child pre{margin:0;padding:30px 10px 10px}.post .post-content .highlight>.chroma table,.post .post-content .highlight>.chroma tr,.post .post-content .highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content .highlight>.chroma .lnt{color:#cacaca}.post .post-content .highlight>.chroma .hl{display:block;width:100%;background-color:#ffc}.post .post-content .highlight>.chroma .k{color:#859900}.post .post-content .highlight>.chroma .kc{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .kd{color:#859900}.post .post-content .highlight>.chroma .kn{color:#dc322f;font-weight:700}.post .post-content .highlight>.chroma .kp{color:#859900}.post .post-content .highlight>.chroma .kr{color:#859900}.post .post-content .highlight>.chroma .kt{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .n{color:#268bd2}.post .post-content .highlight>.chroma .na{color:#268bd2}.post .post-content .highlight>.chroma .nb{color:#cb4b16}.post .post-content .highlight>.chroma .bp{color:#268bd2}.post .post-content .highlight>.chroma .nc{color:#cb4b16}.post .post-content .highlight>.chroma .no{color:#268bd2}.post .post-content .highlight>.chroma .nd{color:#268bd2}.post .post-content .highlight>.chroma .ni{color:#268bd2}.post .post-content .highlight>.chroma .ne{color:#268bd2}.post .post-content .highlight>.chroma .nf{color:#268bd2}.post .post-content .highlight>.chroma .fm{color:#268bd2}.post .post-content .highlight>.chroma .nl{color:#268bd2}.post .post-content .highlight>.chroma .nn{color:#268bd2}.post .post-content .highlight>.chroma .nx{color:#268bd2}.post .post-content .highlight>.chroma .py{color:#268bd2}.post .post-content .highlight>.chroma .nt{color:#268bd2;font-weight:700}.post .post-content .highlight>.chroma .nv{color:#268bd2}.post .post-content .highlight>.chroma .vc{color:#268bd2}.post .post-content .highlight>.chroma .vg{color:#268bd2}.post .post-content .highlight>.chroma .vi{color:#268bd2}.post .post-content .highlight>.chroma .vm{color:#268bd2}.post .post-content .highlight>.chroma .l{color:#2aa198}.post .post-content .highlight>.chroma .ld{color:#2aa198}.post .post-content .highlight>.chroma .s{color:#2aa198}.post .post-content .highlight>.chroma .sa{color:#2aa198}.post .post-content .highlight>.chroma .sb{color:#2aa198}.post .post-content .highlight>.chroma .sc{color:#2aa198}.post .post-content .highlight>.chroma .dl{color:#2aa198}.post .post-content .highlight>.chroma .sd{color:#2aa198}.post .post-content .highlight>.chroma .s2{color:#2aa198}.post .post-content .highlight>.chroma .se{color:#2aa198}.post .post-content .highlight>.chroma .sh{color:#2aa198}.post .post-content .highlight>.chroma .si{color:#2aa198}.post .post-content .highlight>.chroma .sx{color:#2aa198}.post .post-content .highlight>.chroma .sr{color:#2aa198}.post .post-content .highlight>.chroma .s1{color:#2aa198}.post .post-content .highlight>.chroma .ss{color:#2aa198}.post .post-content .highlight>.chroma .m{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mb{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mf{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mh{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mi{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .il{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mo{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .ow{color:#859900}.post .post-content .highlight>.chroma .c{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .ch{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cm{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .c1{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cs{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cp{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cpf{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .g{color:#d33682}.post .post-content .highlight>.chroma .gd{color:#b58900}.post .post-content .highlight>.chroma .ge{color:#d33682}.post .post-content .highlight>.chroma .gr{color:#d33682}.post .post-content .highlight>.chroma .gh{color:#d33682}.post .post-content .highlight>.chroma .gi{color:#859900}.post .post-content .highlight>.chroma .go{color:#d33682}.post .post-content .highlight>.chroma .gp{color:#d33682}.post .post-content .highlight>.chroma .gs{color:#d33682}.post .post-content .highlight>.chroma .gu{color:#d33682}.post .post-content .highlight>.chroma .gt{color:#d33682}.post .post-content .post-summary{margin-bottom:1em}.post .post-content .read-more .read-more-link{color:#c05b4d;font-size:1.1em;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content .read-more .read-more-link:hover{border-bottom:1px solid #c05b4d}.post .post-content kbd{display:inline-block;padding:.25em;background-color:#fafafa;border:1px solid #dbdbdb;border-bottom-color:#b5b5b5;border-radius:3px;box-shadow:inset 0 -1px 0 #b5b5b5;font-size:.8em;line-height:1.25;font-family:sfmono-regular,liberation mono,roboto mono,Menlo,Monaco,Consolas,courier new,Courier,monospace;color:#4a4a4a}.post .post-content dl dt::after{content:':'}.post .post-content figure.center{text-align:center}.post .post-content figure.right{text-align:right}.post .post-content figure.left{text-align:left}.post .post-content figure figcaption h4{color:#b5b5b5;font-size:.9rem}.post .post-content hr{margin:1rem 0;position:relative;border-top:2px dashed #c05b4d;border-bottom:none}.post .post-content .footnote-ref>a{font-weight:700;margin-left:3px}.post .post-content .footnote-ref>a:before{content:"["}.post .post-content .footnote-ref>a:after{content:"]"}.post .post-content .task-list{list-style:none;padding-left:1.5rem}.post .post-content .align-center{text-align:center}.post .post-content .align-right{text-align:right}.post .post-content .align-left{text-align:left}.post .post-content .MJXc-display{overflow-x:auto;overflow-y:hidden;padding-right:1px}.post .important{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(220,50,47,.05);border-left:3px solid rgba(220,50,47,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .important p{margin:0}.post .post-copyright{margin-top:20px;padding-top:10px;border-top:1px dashed #e6e6e6}.post .post-copyright .copyright-item{margin:5px 0}.post .post-copyright .copyright-item a{color:#c05b4d;word-wrap:break-word}.post .post-copyright .copyright-item a:hover{border-bottom:1px solid #c05b4d}.post .post-copyright .copyright-item .item-title{display:inline-block;min-width:5rem;margin-right:.5rem;text-align:right}.post .post-copyright .copyright-item .item-title:after{content:" :"}.post .post-footer{margin-top:20px;border-top:1px solid #e6e6e6;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-footer .post-tags{padding:15px 0}.post .post-footer .post-tags a{margin-right:5px;color:#c05b4d;word-break:break-all}.post .post-footer .post-tags a::before{content:'#'}.post .post-footer .post-nav{margin:1em 0}.post .post-footer .post-nav:before,.post .post-footer .post-nav:after{content:" ";display:table}.post .post-footer .post-nav:after{clear:both}.post .post-footer .post-nav .prev,.post .post-footer .post-nav .next{font-weight:600;font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.post .post-footer .post-nav .prev{float:left}.post .post-footer .post-nav .prev:hover{color:#c05b4d;transform:translateX(-4px)}.post .post-footer .post-nav .next{float:right}.post .post-footer .post-nav .next:hover{color:#c05b4d;transform:translateX(4px)}.post .post-footer .post-nav .nav-mobile{display:none}@media screen and (max-width:800px){.post .post-footer .post-nav .nav-default{display:none}.post .post-footer .post-nav .nav-mobile{display:inline}}.pagination{margin:2em 0}.pagination:before,.pagination:after{content:" ";display:table}.pagination:after{clear:both}.pagination .prev,.pagination .next{font-weight:600;font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.pagination .prev{float:left}.pagination .prev:hover{color:#c05b4d;transform:translateX(-4px)}.pagination .next{float:right}.pagination .next:hover{color:#c05b4d;transform:translateX(4px)}.footer{margin-top:2em}.footer .social-links{text-align:center}.footer .social-links .iconfont{font-size:30px}.footer .social-links .iconfont+.iconfont{margin-left:10px}.footer .social-links .iconfont:hover{color:#c05b4d}.footer .copyright{margin:10px 0;color:#8a8a8a;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.footer .copyright .hexo-link,.footer .copyright .theme-link{color:#c05b4d}.footer .copyright .copyright-year{display:block}.footer .copyright .copyright-year .heart{font-size:14px}.archive{margin:2em 0;max-width:550px}.archive .archive-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .archive-title.tag,.archive .archive-title.category{margin:15px 0}.archive .archive-title .archive-name{margin:0;display:inline-block;font-weight:400;font-size:30px;line-height:32px}.archive .archive-title .archive-post-counter{color:#8a8a8a}.archive .collection-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .collection-title .archive-year{margin:15px 0;font-weight:400;font-size:28px;line-height:30px}.archive .archive-post{padding:3px 20px;border-left:1px solid #cacaca}.archive .archive-post .archive-post-time{margin-right:10px;color:#8a8a8a}.archive .archive-post .archive-post-title .archive-post-link{color:#c05b4d}.archive .archive-post::first-child{margin-top:10px}.archive .archive-post:hover{border-left:3px solid #c05b4d;transition:.2s ease-out;transform:translateX(4px)}.archive .archive-post:hover .archive-post-time{color:#717171}.archive .archive-post:hover .archive-post-title .archive-post-link{color:#a14639}@media screen and (max-width:800px){.archive{margin-left:auto;margin-right:auto}.archive .archive-title .archive-name{font-size:26px}.archive .collection-title .archive-year{margin:10px 0;font-size:24px}.archive .archive-post{padding:5px 10px}.archive .archive-post .archive-post-time{font-size:13px;display:block}}.terms{margin:2em 0 3em;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.terms .terms-title{display:inline-block;font-size:18px;color:#c05b4d;border-bottom:2px solid #c05b4d}.terms .terms-tags{margin:10px 0}.terms .terms-tags .terms-link{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;transition-duration:.2s;transition-property:transform;transition-timing-function:ease-out}.terms .terms-tags .terms-link .terms-count{display:inline-block;position:relative;top:-8px;right:-2px;color:#c05b4d;font-size:12px}.terms .terms-tags .terms-link:active,.terms .terms-tags .terms-link:focus,.terms .terms-tags .terms-link:hover{color:#c05b4d;transform:scale(1.1)}.slideout-menu{position:fixed;top:0;left:0;bottom:0;width:180px;min-height:100vh;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:0;display:none}.slideout-panel{position:relative;z-index:1;background-color:#fefefe;min-height:100vh}.slideout-open,.slideout-open body,.slideout-open .slideout-panel{overflow:hidden}.slideout-open .slideout-menu{display:block}.mobile-navbar{display:none;position:fixed;top:0;left:0;width:100%;height:50px;background:#fefefe;box-shadow:0 2px 2px #cacaca;text-align:center;transition:transform 300ms ease;z-index:99}.mobile-navbar.fixed-open{transform:translate3d(180px,0px,0px)}.mobile-navbar .mobile-header-logo{display:inline-block;margin-right:50px}.mobile-navbar .mobile-header-logo .logo{font-size:22px;line-height:50px;font-family:chancery,cursive,LiSu,sans-serif}.mobile-navbar .mobile-navbar-icon{color:#c05b4d;height:50px;width:50px;font-size:24px;text-align:center;float:left;position:relative;transition:background .5s}@keyframes clickfirst{0%{transform:translateY(6px)rotate(0deg)}100%{transform:translateY(0)rotate(45deg)}}@keyframes clickmid{0%{opacity:1}100%{opacity:0}}@keyframes clicklast{0%{transform:translateY(-6px)rotate(0deg)}100%{transform:translateY(0)rotate(-45deg)}}@keyframes outfirst{0%{transform:translateY(0)rotate(-45deg)}100%{transform:translateY(-6px)rotate(0deg)}}@keyframes outmid{0%{opacity:0}100%{opacity:1}}@keyframes outlast{0%{transform:translateY(0)rotate(45deg)}100%{transform:translateY(6px)rotate(0deg)}}.mobile-navbar .mobile-navbar-icon span{position:absolute;left:15px;top:25px;left:calc((100% - 20px)/2);top:calc((100% - 1px)/2);width:20px;height:1px;background-color:#c05b4d}.mobile-navbar .mobile-navbar-icon span:nth-child(1){transform:translateY(6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon span:nth-child(3){transform:translateY(-6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:clickfirst}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:clickmid}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:clicklast}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:outfirst}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:outmid}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:outlast}.mobile-menu{background-color:rgba(248,245,236,.5)}.mobile-menu .mobile-menu-list{position:relative;list-style:none;margin-top:50px;padding:0;border-top:1px solid #f8f5ec}.mobile-menu .mobile-menu-list .mobile-menu-item{padding:10px 30px;border-bottom:1px solid #f8f5ec}.mobile-menu .mobile-menu-list a{font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.mobile-menu .mobile-menu-list a:hover{color:#c05b4d}@media screen and (max-width:800px){.mobile-navbar{display:block}}.back-to-top{display:none;position:fixed;right:20px;bottom:20px;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s;z-index:10}.back-to-top:hover{transform:translateY(-5px)}@media screen and (max-width:800px){.back-to-top{display:none!important}}#search-results mark{background-color:#c05b4d}.not-found{text-align:center}.not-found .error-emoji{color:#363636;font-size:3rem}.not-found .error-text{color:#797979;font-size:1.25rem}.not-found .error-link{margin-top:2rem}.not-found .error-link a{color:#c05b4d} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:chancery;src:url(../fonts/chancery/apple-chancery-webfont.eot);src:local("Apple Chancery"),url(../fonts/chancery/apple-chancery-webfont.eot?#iefix)format("embedded-opentype"),url(../fonts/chancery/apple-chancery-webfont.woff2)format("woff2"),url(../fonts/chancery/apple-chancery-webfont.woff)format("woff"),url(../fonts/chancery/apple-chancery-webfont.ttf)format("truetype"),url(../fonts/chancery/apple-chancery-webfont.svg#apple-chancery)format("svg");font-weight:lighter;font-style:normal}.post .post-content a.reference-link{font-weight:700;font-style:italic;font-color:#34495e;color:#34495e}.post .post-content a.reference-link:hover{border-bottom-color:#c05b4d #f8f5ec}.post .post-content a.bibtex-entry:target{background-color:#ffa}/*!normalize.css v3.0.2 | MIT License | git.io/normalize*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;box-sizing:border-box}body{padding:0;margin:0;font-family:source sans pro,helvetica neue,Arial,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:#34495e;background:#fefefe;scroll-behavior:smooth;border-top:3px solid #c05b4d}@media screen and (max-width:800px){body{border-top:0}}::selection{background:#c05b4d;color:#fff}img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}a{color:#34495e;text-decoration:none}h1{font-size:26px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h2{font-size:24px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h3{font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h4{font-size:16px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h5{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h6{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.container{margin:0 auto;width:800px}@media screen and (max-width:800px){.container{width:100%;box-shadow:-1px -5px 5px #cacaca}}.content-wrapper{padding:0 20px}.video-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:iconfont;src:url(../fonts/iconfont/iconfont.eot);src:url(../fonts/iconfont/iconfont.eot#iefix)format("embedded-opentype"),url(../fonts/iconfont/iconfont.woff)format("woff"),url(../fonts/iconfont/iconfont.ttf)format("truetype"),url(../fonts/iconfont/iconfont.svg#iconfont)format("svg")}.iconfont{font-family:iconfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-text-stroke-width:.2px;cursor:pointer;letter-spacing:0;font-feature-settings:"liga";font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bilibili:before{content:"\e900";font-size:.9em;position:relative;top:-4px}.icon-instagram:before{font-size:.95em;content:"\e611";position:relative;top:1px}.icon-douban:before{content:"\e610";position:relative;top:2px}.icon-tumblr:before{content:"\e69f";font-size:.85em;position:relative;top:-2px}.icon-linkedin:before{content:"\e60d";position:relative;top:-2px}.icon-twitter:before{content:"\e600"}.icon-weibo:before{content:"\e602";position:relative;top:2px}.icon-stack-overflow:before{content:"\e902";font-size:.85em;position:relative;top:-4px}.icon-email:before{content:"\e605";position:relative;top:-2px}.icon-facebook:before{content:"\e601";font-size:.95em;position:relative;top:-2px}.icon-gitlab:before{content:"\e901";font-size:.9em;position:relative;top:-4px}.icon-github:before{content:"\e606";position:relative;top:-1px}.icon-rss:before{content:"\e604"}.icon-google:before{content:"\e609";position:relative;top:2px}.icon-zhihu:before{content:"\e607";font-size:.9em}.icon-pocket:before{content:"\e856";position:relative;top:2px}.icon-heart:before{content:"\e608"}.icon-right:before{content:"\e60a"}.icon-left:before{content:"\e60b"}.icon-up:before{content:"\e60c"}.icon-close:before{content:"\e60f"}.icon-link:before{content:"\e909"}.header{padding:20px}.header:before,.header:after{content:" ";display:table}.header:after{clear:both}.header .logo-wrapper{float:left}.header .logo-wrapper .logo{font-size:48px;font-family:chancery,cursive,LiSu,sans-serif}@media screen and (max-width:800px){.header .logo-wrapper{display:none}}.header .site-navbar{float:right}.header .site-navbar .menu{display:inline-block;position:relative;padding-left:0;padding-right:25px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.header .site-navbar .menu .menu-item{display:inline-block;display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.header .site-navbar .menu .menu-item+.menu-item{margin-left:10px}.header .site-navbar .menu .menu-item:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.header .site-navbar .menu .menu-item.active:before,.header .site-navbar .menu .menu-item:active:before,.header .site-navbar .menu .menu-item:focus:before,.header .site-navbar .menu .menu-item:hover:before{right:0;left:0}.header .site-navbar .menu .menu-item-link{font-size:18px}@media screen and (max-width:800px){.header .site-navbar{display:none}}@media screen and (max-width:800px){.header{padding:50px 0 0;text-align:center}}.posts{margin-bottom:20px;border-bottom:1px solid #e6e6e6}.post{padding:1.5em 0}.post+.post{border-top:1px solid #e6e6e6}.post .post-header{margin-bottom:20px}.post .post-header .post-title{margin:0;font-size:27px;font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-header .post-link{display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.post .post-header .post-link:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.post .post-header .post-link.active:before,.post .post-header .post-link:active:before,.post .post-header .post-link:focus:before,.post .post-header .post-link:hover:before{right:0;left:0}.post .post-header .post-meta{font-size:14px;color:#8a8a8a}.post .post-header .post-meta .post-time{font-size:15px}.post .post-header .post-meta .post-category{display:inline}.post .post-header .post-meta .post-category a{color:inherit}.post .post-header .post-meta .post-category a::before{content:'·'}.post .post-header .post-meta .post-category a:hover{color:#c05b4d}.post .post-header .post-meta .more-meta::before{content:'·'}.post .post-toc{position:absolute;width:200px;margin-left:785px;padding:10px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;border-radius:5px;background:rgba(248,245,236,.6);box-shadow:1px 1px 2px rgba(0,0,0,.125);word-wrap:break-word;box-sizing:border-box}.post .post-toc .post-toc-title{margin:0 10px;font-size:20px;font-weight:400;text-transform:uppercase}.post .post-toc .post-toc-content{font-size:15px}.post .post-toc .post-toc-content.always-active ul{display:block}.post .post-toc .post-toc-content>nav>ul{margin:10px 0}.post .post-toc .post-toc-content ul{padding-left:20px;list-style:square}.post .post-toc .post-toc-content ul ul{padding-left:15px;display:none}.post .post-toc .post-toc-content ul .has-active>ul{display:block}.post .post-toc .post-toc-content .toc-link.active{color:#c05b4d}@media screen and (max-width:1185px){.post .post-toc{display:none}}.post .post-content{word-wrap:break-word}.post .post-content h1{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h1 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h1 .anchor:hover{border-bottom:initial}.post .post-content h1 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h1 .anchor .icon-link:before{vertical-align:middle}.post .post-content h1:hover .icon-link{visibility:visible}.post .post-content h2{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h2 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h2 .anchor:hover{border-bottom:initial}.post .post-content h2 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h2 .anchor .icon-link:before{vertical-align:middle}.post .post-content h2:hover .icon-link{visibility:visible}.post .post-content h3{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h3 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h3 .anchor:hover{border-bottom:initial}.post .post-content h3 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h3 .anchor .icon-link:before{vertical-align:middle}.post .post-content h3:hover .icon-link{visibility:visible}.post .post-content h4{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h4 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h4 .anchor:hover{border-bottom:initial}.post .post-content h4 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h4 .anchor .icon-link:before{vertical-align:middle}.post .post-content h4:hover .icon-link{visibility:visible}.post .post-content h5{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h5 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h5 .anchor:hover{border-bottom:initial}.post .post-content h5 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h5 .anchor .icon-link:before{vertical-align:middle}.post .post-content h5:hover .icon-link{visibility:visible}.post .post-content h6{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h6 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h6 .anchor:hover{border-bottom:initial}.post .post-content h6 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h6 .anchor .icon-link:before{vertical-align:middle}.post .post-content h6:hover .icon-link{visibility:visible}.post .post-content a{color:#c05b4d;word-break:break-all}.post .post-content a:hover{border-bottom:1px solid #c05b4d}.post .post-content blockquote{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(192,91,77,.05);border-left:3px solid rgba(192,91,77,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .post-content blockquote p{margin:0}.post .post-content figure{justify-content:center;align-items:center}.post .post-content figure img{display:block;margin-right:auto;margin-left:auto}.post .post-content img{display:inline-block;max-width:100%}.post .post-content .table-wrapper{overflow-x:auto}.post .post-content .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:2px 2px 3px rgba(0,0,0,.125)}.post .post-content .table-wrapper>table thead{background:#f8f5ec}.post .post-content .table-wrapper>table th,.post .post-content .table-wrapper>table td{padding:5px 15px;border:1px double #f4efe1}.post .post-content .table-wrapper>table tr:hover{background-color:#f8f5ec}.post .post-content code,.post .post-content pre{padding:7px;font-size:.9em;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,monospace;background:#f8f5ec}.post .post-content code{padding:3px 5px;border-radius:4px;color:#c7254e}.post .post-content figure.highlight{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative}.post .post-content figure.highlight table{position:relative}.post .post-content figure.highlight table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content figure.highlight.language-bash>table::after{content:"Bash"}.post .post-content figure.highlight.language-c>table::after{content:"C"}.post .post-content figure.highlight.language-cs>table::after{content:"C#"}.post .post-content figure.highlight.language-cpp>table::after{content:"C++"}.post .post-content figure.highlight.language-css>table::after{content:"CSS"}.post .post-content figure.highlight.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content figure.highlight.language-html>table::after{content:"HTML"}.post .post-content figure.highlight.language-xml>table::after{content:"XML"}.post .post-content figure.highlight.language-http>table::after{content:"HTTP"}.post .post-content figure.highlight.language-json>table::after{content:"JSON"}.post .post-content figure.highlight.language-java>table::after{content:"Java"}.post .post-content figure.highlight.language-js>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-javascript>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-makefile>table::after{content:"Makefile"}.post .post-content figure.highlight.language-markdown>table::after{content:"Markdown"}.post .post-content figure.highlight.language-objectivec>table::after{content:"Objective-C"}.post .post-content figure.highlight.language-php>table::after{content:"PHP"}.post .post-content figure.highlight.language-perl>table::after{content:"Perl"}.post .post-content figure.highlight.language-python>table::after{content:"Python"}.post .post-content figure.highlight.language-ruby>table::after{content:"Ruby"}.post .post-content figure.highlight.language-sql>table::after{content:"SQL"}.post .post-content figure.highlight.language-shell>table::after{content:"Shell"}.post .post-content figure.highlight.language-erlang>table::after{content:"Erlang"}.post .post-content figure.highlight.language-go>table::after{content:"Go"}.post .post-content figure.highlight.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content figure.highlight.language-groovy>table::after{content:"Groovy"}.post .post-content figure.highlight.language-haskell>table::after{content:"Haskell"}.post .post-content figure.highlight.language-kotlin>table::after{content:"Kotlin"}.post .post-content figure.highlight.language-clojure>table::after{content:"Clojure"}.post .post-content figure.highlight.language-less>table::after{content:"Less"}.post .post-content figure.highlight.language-lisp>table::after{content:"Lisp"}.post .post-content figure.highlight.language-lua>table::after{content:"Lua"}.post .post-content figure.highlight.language-matlab>table::after{content:"Matlab"}.post .post-content figure.highlight.language-rust>table::after{content:"Rust"}.post .post-content figure.highlight.language-scss>table::after{content:"Scss"}.post .post-content figure.highlight.language-scala>table::after{content:"Scala"}.post .post-content figure.highlight.language-swift>table::after{content:"Swift"}.post .post-content figure.highlight.language-typescript>table::after{content:"TypeScript"}.post .post-content figure.highlight.language-yml>table::after{content:"YAML"}.post .post-content figure.highlight.language-yaml>table::after{content:"YAML"}.post .post-content figure.highlight.language-toml>table::after{content:"TOML"}.post .post-content figure.highlight.language-diff>table::after{content:"Diff"}.post .post-content figure.highlight .code pre{margin:0;padding:30px 10px 10px}.post .post-content figure.highlight .gutter{width:10px;color:#cacaca}.post .post-content figure.highlight .gutter pre{margin:0;padding:30px 7px 10px}.post .post-content figure.highlight .line{height:1em}.post .post-content figure.highlight table,.post .post-content figure.highlight tr,.post .post-content figure.highlight td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content figure.highlight .code .hljs-comment,.post .post-content figure.highlight .code .hljs-quote{color:#93a1a1}.post .post-content figure.highlight .code .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-tag,.post .post-content figure.highlight .code .hljs-addition{color:#859900}.post .post-content figure.highlight .code .hljs-number,.post .post-content figure.highlight .code .hljs-string,.post .post-content figure.highlight .code .hljs-meta .hljs-meta-string,.post .post-content figure.highlight .code .hljs-literal,.post .post-content figure.highlight .code .hljs-doctag,.post .post-content figure.highlight .code .hljs-regexp{color:#2aa198}.post .post-content figure.highlight .code .hljs-title,.post .post-content figure.highlight .code .hljs-section,.post .post-content figure.highlight .code .hljs-name,.post .post-content figure.highlight .code .hljs-selector-id,.post .post-content figure.highlight .code .hljs-selector-class{color:#268bd2}.post .post-content figure.highlight .code .hljs-attribute,.post .post-content figure.highlight .code .hljs-attr,.post .post-content figure.highlight .code .hljs-variable,.post .post-content figure.highlight .code .hljs-template-variable,.post .post-content figure.highlight .code .hljs-class .hljs-title,.post .post-content figure.highlight .code .hljs-type{color:#b58900}.post .post-content figure.highlight .code .hljs-symbol,.post .post-content figure.highlight .code .hljs-bullet,.post .post-content figure.highlight .code .hljs-subst,.post .post-content figure.highlight .code .hljs-meta,.post .post-content figure.highlight .code .hljs-meta .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-attr,.post .post-content figure.highlight .code .hljs-selector-pseudo,.post .post-content figure.highlight .code .hljs-link{color:#cb4b16}.post .post-content figure.highlight .code .hljs-built_in,.post .post-content figure.highlight .code .hljs-deletion{color:#dc322f}.post .post-content figure.highlight .code .hljs-formula{background:#eee8d5}.post .post-content figure.highlight .code .hljs-emphasis{font-style:italic}.post .post-content figure.highlight .code .hljs-strong{font-weight:700}.post .post-content .highlight>.chroma{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative;background:#f8f5ec}.post .post-content .highlight>.chroma code{padding:0}.post .post-content .highlight>.chroma table{position:relative}.post .post-content .highlight>.chroma table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content .highlight>.chroma.language-bash>table::after{content:"Bash"}.post .post-content .highlight>.chroma.language-c>table::after{content:"C"}.post .post-content .highlight>.chroma.language-cs>table::after{content:"C#"}.post .post-content .highlight>.chroma.language-cpp>table::after{content:"C++"}.post .post-content .highlight>.chroma.language-css>table::after{content:"CSS"}.post .post-content .highlight>.chroma.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content .highlight>.chroma.language-html>table::after{content:"HTML"}.post .post-content .highlight>.chroma.language-xml>table::after{content:"XML"}.post .post-content .highlight>.chroma.language-http>table::after{content:"HTTP"}.post .post-content .highlight>.chroma.language-json>table::after{content:"JSON"}.post .post-content .highlight>.chroma.language-java>table::after{content:"Java"}.post .post-content .highlight>.chroma.language-js>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-javascript>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-makefile>table::after{content:"Makefile"}.post .post-content .highlight>.chroma.language-markdown>table::after{content:"Markdown"}.post .post-content .highlight>.chroma.language-objectivec>table::after{content:"Objective-C"}.post .post-content .highlight>.chroma.language-php>table::after{content:"PHP"}.post .post-content .highlight>.chroma.language-perl>table::after{content:"Perl"}.post .post-content .highlight>.chroma.language-python>table::after{content:"Python"}.post .post-content .highlight>.chroma.language-ruby>table::after{content:"Ruby"}.post .post-content .highlight>.chroma.language-sql>table::after{content:"SQL"}.post .post-content .highlight>.chroma.language-shell>table::after{content:"Shell"}.post .post-content .highlight>.chroma.language-erlang>table::after{content:"Erlang"}.post .post-content .highlight>.chroma.language-go>table::after{content:"Go"}.post .post-content .highlight>.chroma.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content .highlight>.chroma.language-groovy>table::after{content:"Groovy"}.post .post-content .highlight>.chroma.language-haskell>table::after{content:"Haskell"}.post .post-content .highlight>.chroma.language-kotlin>table::after{content:"Kotlin"}.post .post-content .highlight>.chroma.language-clojure>table::after{content:"Clojure"}.post .post-content .highlight>.chroma.language-less>table::after{content:"Less"}.post .post-content .highlight>.chroma.language-lisp>table::after{content:"Lisp"}.post .post-content .highlight>.chroma.language-lua>table::after{content:"Lua"}.post .post-content .highlight>.chroma.language-matlab>table::after{content:"Matlab"}.post .post-content .highlight>.chroma.language-rust>table::after{content:"Rust"}.post .post-content .highlight>.chroma.language-scss>table::after{content:"Scss"}.post .post-content .highlight>.chroma.language-scala>table::after{content:"Scala"}.post .post-content .highlight>.chroma.language-swift>table::after{content:"Swift"}.post .post-content .highlight>.chroma.language-typescript>table::after{content:"TypeScript"}.post .post-content .highlight>.chroma.language-yml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-yaml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-toml>table::after{content:"TOML"}.post .post-content .highlight>.chroma.language-diff>table::after{content:"Diff"}.post .post-content .highlight>.chroma .lntd{line-height:1em}.post .post-content .highlight>.chroma .lntd:first-child{width:10px}.post .post-content .highlight>.chroma .lntd:first-child pre{margin:0;padding:30px 7px 10px}.post .post-content .highlight>.chroma .lntd:last-child{vertical-align:top}.post .post-content .highlight>.chroma .lntd:last-child pre{margin:0;padding:30px 10px 10px}.post .post-content .highlight>.chroma table,.post .post-content .highlight>.chroma tr,.post .post-content .highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content .highlight>.chroma .lnt{color:#cacaca}.post .post-content .highlight>.chroma .hl{display:block;width:100%;background-color:#ffc}.post .post-content .highlight>.chroma .k{color:#859900}.post .post-content .highlight>.chroma .kc{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .kd{color:#859900}.post .post-content .highlight>.chroma .kn{color:#dc322f;font-weight:700}.post .post-content .highlight>.chroma .kp{color:#859900}.post .post-content .highlight>.chroma .kr{color:#859900}.post .post-content .highlight>.chroma .kt{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .n{color:#268bd2}.post .post-content .highlight>.chroma .na{color:#268bd2}.post .post-content .highlight>.chroma .nb{color:#cb4b16}.post .post-content .highlight>.chroma .bp{color:#268bd2}.post .post-content .highlight>.chroma .nc{color:#cb4b16}.post .post-content .highlight>.chroma .no{color:#268bd2}.post .post-content .highlight>.chroma .nd{color:#268bd2}.post .post-content .highlight>.chroma .ni{color:#268bd2}.post .post-content .highlight>.chroma .ne{color:#268bd2}.post .post-content .highlight>.chroma .nf{color:#268bd2}.post .post-content .highlight>.chroma .fm{color:#268bd2}.post .post-content .highlight>.chroma .nl{color:#268bd2}.post .post-content .highlight>.chroma .nn{color:#268bd2}.post .post-content .highlight>.chroma .nx{color:#268bd2}.post .post-content .highlight>.chroma .py{color:#268bd2}.post .post-content .highlight>.chroma .nt{color:#268bd2;font-weight:700}.post .post-content .highlight>.chroma .nv{color:#268bd2}.post .post-content .highlight>.chroma .vc{color:#268bd2}.post .post-content .highlight>.chroma .vg{color:#268bd2}.post .post-content .highlight>.chroma .vi{color:#268bd2}.post .post-content .highlight>.chroma .vm{color:#268bd2}.post .post-content .highlight>.chroma .l{color:#2aa198}.post .post-content .highlight>.chroma .ld{color:#2aa198}.post .post-content .highlight>.chroma .s{color:#2aa198}.post .post-content .highlight>.chroma .sa{color:#2aa198}.post .post-content .highlight>.chroma .sb{color:#2aa198}.post .post-content .highlight>.chroma .sc{color:#2aa198}.post .post-content .highlight>.chroma .dl{color:#2aa198}.post .post-content .highlight>.chroma .sd{color:#2aa198}.post .post-content .highlight>.chroma .s2{color:#2aa198}.post .post-content .highlight>.chroma .se{color:#2aa198}.post .post-content .highlight>.chroma .sh{color:#2aa198}.post .post-content .highlight>.chroma .si{color:#2aa198}.post .post-content .highlight>.chroma .sx{color:#2aa198}.post .post-content .highlight>.chroma .sr{color:#2aa198}.post .post-content .highlight>.chroma .s1{color:#2aa198}.post .post-content .highlight>.chroma .ss{color:#2aa198}.post .post-content .highlight>.chroma .m{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mb{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mf{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mh{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mi{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .il{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mo{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .ow{color:#859900}.post .post-content .highlight>.chroma .c{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .ch{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cm{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .c1{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cs{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cp{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cpf{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .g{color:#d33682}.post .post-content .highlight>.chroma .gd{color:#b58900}.post .post-content .highlight>.chroma .ge{color:#d33682}.post .post-content .highlight>.chroma .gr{color:#d33682}.post .post-content .highlight>.chroma .gh{color:#d33682}.post .post-content .highlight>.chroma .gi{color:#859900}.post .post-content .highlight>.chroma .go{color:#d33682}.post .post-content .highlight>.chroma .gp{color:#d33682}.post .post-content .highlight>.chroma .gs{color:#d33682}.post .post-content .highlight>.chroma .gu{color:#d33682}.post .post-content .highlight>.chroma .gt{color:#d33682}.post .post-content .post-summary{margin-bottom:1em}.post .post-content .read-more .read-more-link{color:#c05b4d;font-size:1.1em;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content .read-more .read-more-link:hover{border-bottom:1px solid #c05b4d}.post .post-content kbd{display:inline-block;padding:.25em;background-color:#fafafa;border:1px solid #dbdbdb;border-bottom-color:#b5b5b5;border-radius:3px;box-shadow:inset 0 -1px 0 #b5b5b5;font-size:.8em;line-height:1.25;font-family:sfmono-regular,liberation mono,roboto mono,Menlo,Monaco,Consolas,courier new,Courier,monospace;color:#4a4a4a}.post .post-content dl dt::after{content:':'}.post .post-content figure.center{text-align:center}.post .post-content figure.right{text-align:right}.post .post-content figure.left{text-align:left}.post .post-content figure figcaption h4{color:#b5b5b5;font-size:.9rem}.post .post-content hr{margin:1rem 0;position:relative;border-top:2px dashed #c05b4d;border-bottom:none}.post .post-content .footnote-ref>a{font-weight:700;margin-left:3px}.post .post-content .footnote-ref>a:before{content:"["}.post .post-content .footnote-ref>a:after{content:"]"}.post .post-content .task-list{list-style:none;padding-left:1.5rem}.post .post-content .align-center{text-align:center}.post .post-content .align-right{text-align:right}.post .post-content .align-left{text-align:left}.post .post-content .MJXc-display{overflow-x:auto;overflow-y:hidden;padding-right:1px}.post .important{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(220,50,47,.05);border-left:3px solid rgba(220,50,47,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .important p{margin:0}.post .examp{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(141,220,47,.05);border-left:3px solid rgba(141,220,47,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .examp p{margin:0}.post .post-copyright{margin-top:20px;padding-top:10px;border-top:1px dashed #e6e6e6}.post .post-copyright .copyright-item{margin:5px 0}.post .post-copyright .copyright-item a{color:#c05b4d;word-wrap:break-word}.post .post-copyright .copyright-item a:hover{border-bottom:1px solid #c05b4d}.post .post-copyright .copyright-item .item-title{display:inline-block;min-width:5rem;margin-right:.5rem;text-align:right}.post .post-copyright .copyright-item .item-title:after{content:" :"}.post .post-footer{margin-top:20px;border-top:1px solid #e6e6e6;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-footer .post-tags{padding:15px 0}.post .post-footer .post-tags a{margin-right:5px;color:#c05b4d;word-break:break-all}.post .post-footer .post-tags a::before{content:'#'}.post .post-footer .post-nav{margin:1em 0}.post .post-footer .post-nav:before,.post .post-footer .post-nav:after{content:" ";display:table}.post .post-footer .post-nav:after{clear:both}.post .post-footer .post-nav .prev,.post .post-footer .post-nav .next{font-weight:600;font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.post .post-footer .post-nav .prev{float:left}.post .post-footer .post-nav .prev:hover{color:#c05b4d;transform:translateX(-4px)}.post .post-footer .post-nav .next{float:right}.post .post-footer .post-nav .next:hover{color:#c05b4d;transform:translateX(4px)}.post .post-footer .post-nav .nav-mobile{display:none}@media screen and (max-width:800px){.post .post-footer .post-nav .nav-default{display:none}.post .post-footer .post-nav .nav-mobile{display:inline}}.pagination{margin:2em 0}.pagination:before,.pagination:after{content:" ";display:table}.pagination:after{clear:both}.pagination .prev,.pagination .next{font-weight:600;font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.pagination .prev{float:left}.pagination .prev:hover{color:#c05b4d;transform:translateX(-4px)}.pagination .next{float:right}.pagination .next:hover{color:#c05b4d;transform:translateX(4px)}.footer{margin-top:2em}.footer .social-links{text-align:center}.footer .social-links .iconfont{font-size:30px}.footer .social-links .iconfont+.iconfont{margin-left:10px}.footer .social-links .iconfont:hover{color:#c05b4d}.footer .copyright{margin:10px 0;color:#8a8a8a;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.footer .copyright .hexo-link,.footer .copyright .theme-link{color:#c05b4d}.footer .copyright .copyright-year{display:block}.footer .copyright .copyright-year .heart{font-size:14px}.archive{margin:2em 0;max-width:550px}.archive .archive-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .archive-title.tag,.archive .archive-title.category{margin:15px 0}.archive .archive-title .archive-name{margin:0;display:inline-block;font-weight:400;font-size:30px;line-height:32px}.archive .archive-title .archive-post-counter{color:#8a8a8a}.archive .collection-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .collection-title .archive-year{margin:15px 0;font-weight:400;font-size:28px;line-height:30px}.archive .archive-post{padding:3px 20px;border-left:1px solid #cacaca}.archive .archive-post .archive-post-time{margin-right:10px;color:#8a8a8a}.archive .archive-post .archive-post-title .archive-post-link{color:#c05b4d}.archive .archive-post::first-child{margin-top:10px}.archive .archive-post:hover{border-left:3px solid #c05b4d;transition:.2s ease-out;transform:translateX(4px)}.archive .archive-post:hover .archive-post-time{color:#717171}.archive .archive-post:hover .archive-post-title .archive-post-link{color:#a14639}@media screen and (max-width:800px){.archive{margin-left:auto;margin-right:auto}.archive .archive-title .archive-name{font-size:26px}.archive .collection-title .archive-year{margin:10px 0;font-size:24px}.archive .archive-post{padding:5px 10px}.archive .archive-post .archive-post-time{font-size:13px;display:block}}.terms{margin:2em 0 3em;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.terms .terms-title{display:inline-block;font-size:18px;color:#c05b4d;border-bottom:2px solid #c05b4d}.terms .terms-tags{margin:10px 0}.terms .terms-tags .terms-link{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;transition-duration:.2s;transition-property:transform;transition-timing-function:ease-out}.terms .terms-tags .terms-link .terms-count{display:inline-block;position:relative;top:-8px;right:-2px;color:#c05b4d;font-size:12px}.terms .terms-tags .terms-link:active,.terms .terms-tags .terms-link:focus,.terms .terms-tags .terms-link:hover{color:#c05b4d;transform:scale(1.1)}.slideout-menu{position:fixed;top:0;left:0;bottom:0;width:180px;min-height:100vh;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:0;display:none}.slideout-panel{position:relative;z-index:1;background-color:#fefefe;min-height:100vh}.slideout-open,.slideout-open body,.slideout-open .slideout-panel{overflow:hidden}.slideout-open .slideout-menu{display:block}.mobile-navbar{display:none;position:fixed;top:0;left:0;width:100%;height:50px;background:#fefefe;box-shadow:0 2px 2px #cacaca;text-align:center;transition:transform 300ms ease;z-index:99}.mobile-navbar.fixed-open{transform:translate3d(180px,0px,0px)}.mobile-navbar .mobile-header-logo{display:inline-block;margin-right:50px}.mobile-navbar .mobile-header-logo .logo{font-size:22px;line-height:50px;font-family:chancery,cursive,LiSu,sans-serif}.mobile-navbar .mobile-navbar-icon{color:#c05b4d;height:50px;width:50px;font-size:24px;text-align:center;float:left;position:relative;transition:background .5s}@keyframes clickfirst{0%{transform:translateY(6px)rotate(0deg)}100%{transform:translateY(0)rotate(45deg)}}@keyframes clickmid{0%{opacity:1}100%{opacity:0}}@keyframes clicklast{0%{transform:translateY(-6px)rotate(0deg)}100%{transform:translateY(0)rotate(-45deg)}}@keyframes outfirst{0%{transform:translateY(0)rotate(-45deg)}100%{transform:translateY(-6px)rotate(0deg)}}@keyframes outmid{0%{opacity:0}100%{opacity:1}}@keyframes outlast{0%{transform:translateY(0)rotate(45deg)}100%{transform:translateY(6px)rotate(0deg)}}.mobile-navbar .mobile-navbar-icon span{position:absolute;left:15px;top:25px;left:calc((100% - 20px)/2);top:calc((100% - 1px)/2);width:20px;height:1px;background-color:#c05b4d}.mobile-navbar .mobile-navbar-icon span:nth-child(1){transform:translateY(6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon span:nth-child(3){transform:translateY(-6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:clickfirst}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:clickmid}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:clicklast}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:outfirst}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:outmid}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:outlast}.mobile-menu{background-color:rgba(248,245,236,.5)}.mobile-menu .mobile-menu-list{position:relative;list-style:none;margin-top:50px;padding:0;border-top:1px solid #f8f5ec}.mobile-menu .mobile-menu-list .mobile-menu-item{padding:10px 30px;border-bottom:1px solid #f8f5ec}.mobile-menu .mobile-menu-list a{font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.mobile-menu .mobile-menu-list a:hover{color:#c05b4d}@media screen and (max-width:800px){.mobile-navbar{display:block}}.back-to-top{display:none;position:fixed;right:20px;bottom:20px;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s;z-index:10}.back-to-top:hover{transform:translateY(-5px)}@media screen and (max-width:800px){.back-to-top{display:none!important}}#search-results mark{background-color:#c05b4d}.not-found{text-align:center}.not-found .error-emoji{color:#363636;font-size:3rem}.not-found .error-text{color:#797979;font-size:1.25rem}.not-found .error-link{margin-top:2rem}.not-found .error-link a{color:#c05b4d} \ No newline at end of file diff --git a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json index 0fe2077..b6af1b4 100644 --- a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json +++ b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json @@ -1 +1 @@ -{"Target":"sass/main.min.912787ccd720e5bbb5bacce75e146512498339ab7b308a103cffaa70e0f04342.css","MediaType":"text/css","Data":{"Integrity":"sha256-kSeHzNcg5bu1usznXhRlEkmDOat7MIoQPP+qcODwQ0I="}} \ No newline at end of file +{"Target":"sass/main.min.232d7e429bb4016eaefb290726c41c3e57fd350e525aa0c4ac1226bece981b8e.css","MediaType":"text/css","Data":{"Integrity":"sha256-Iy1+Qpu0AW6u+ykHJsQcPlf9NQ5SWqDErBImvs6YG44="}} \ No newline at end of file diff --git a/static/ox-hugo/fleming14_amplifier_model.png b/static/ox-hugo/fleming14_amplifier_model.png new file mode 100644 index 0000000000000000000000000000000000000000..7d128f5b0c0984eb625af7b33aff0689058cc8dc GIT binary patch literal 14508 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