From f7cedf983d4a09aa490d1155e9fda7cfee7f775b Mon Sep 17 00:00:00 2001 From: Jinny Date: Sat, 27 Apr 2024 01:23:01 +0800 Subject: [PATCH] Site updated: 2024-04-27 01:22:56 --- 404.html | 2 +- about/index.html | 2 +- algorithms/index.html | 2 +- amsib-recap/index.html | 2 +- apple-interview/index.html | 4 ++-- archives/2022/04/index.html | 4 ++-- archives/2022/index.html | 4 ++-- archives/2023/12/index.html | 4 ++-- archives/2023/index.html | 4 ++-- archives/2024/03/index.html | 4 ++-- archives/2024/04/index.html | 4 ++-- archives/2024/index.html | 4 ++-- archives/index.html | 4 ++-- categories/Competitions/index.html | 4 ++-- categories/Notes/index.html | 4 ++-- categories/Others/index.html | 4 ++-- categories/Quant/index.html | 4 ++-- categories/Technical/index.html | 4 ++-- categories/Work/index.html | 4 ++-- categories/index.html | 2 +- computer-graphics/index.html | 4 ++-- css/font.css | 2 +- css/index.css | 2 +- css/var.css | 2 +- gen-ai/index.html | 4 ++-- hexo-blog/index.html | 2 +- index.html | 4 ++-- quant-skills/index.html | 2 +- randomized-algorithms/index.html | 4 ++-- sitemap.xml | 26 +++++++++++++------------- tags/Competitions/index.html | 4 ++-- tags/DSA/index.html | 4 ++-- tags/Interviews/index.html | 4 ++-- tags/Notes/index.html | 4 ++-- tags/Others/index.html | 4 ++-- tags/Quant/index.html | 4 ++-- tags/Technical/index.html | 4 ++-- tags/Work/index.html | 4 ++-- tags/index.html | 2 +- whatson-mypc/index.html | 2 +- 40 files changed, 79 insertions(+), 79 deletions(-) diff --git a/404.html b/404.html index 11cd21a..c826187 100644 --- a/404.html +++ b/404.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}

🖤 About Me

Hello! My name is Jinny Wong.

Education
I’m pursuing my bachelor’s degree in Computer Science at Fudan University.

Work
Currently, I’m an Information Systems & Technology Intern at Apple Inc.
I’m open to any software engineer / machine learning research intern opportunities for early 2025.
You can check out my resume and work here.

Hobbies
I play my electric guitar & do hypertrophy training in my spare time.
On rare occasions, I explore the city & catch sunrises with my Sony A6000 camera.

Contact info
📧 Feel free to send me an email at jinnywong2002@gmail.com .


About this site

I started this blog to record some of my work-related experiences, what I’ve learnt so far, and to share my reflections & accomplishments with my future self and others.

This blog is built with Hexo, and deployed on Vercel. The theme I’m currently using is Hexo Butterfly, and the background wallpaper is from Unsplash.


Employer Disclaimer

The content of this blog represents the personal views and works of Jinny Wong only. It does not represent the views, policies, opinions or works of any other company that I have worked for past, present or future.

\ No newline at end of file + })(window)

🖤 About Me

Hello! My name is Jinny Wong.

Education
I’m pursuing my bachelor’s degree in Computer Science at Fudan University.

Work
Currently, I’m an Information Systems & Technology Intern at Apple Inc.
I’m open to any software engineer / machine learning research intern opportunities for early 2025.
You can check out my resume and work here.

Hobbies
I play my electric guitar & do hypertrophy training in my spare time.
On rare occasions, I explore the city & catch sunrises with my Sony A6000 camera.

Contact info
📧 Feel free to send me an email at jinnywong2002@gmail.com .


About this site

I started this blog to record some of my work-related experiences, what I’ve learnt so far, and to share my reflections & accomplishments with my future self and others.

This blog is built with Hexo, and deployed on Vercel. The theme I’m currently using is Hexo Butterfly, and the background wallpaper is from Unsplash.


Employer Disclaimer

The content of this blog represents the personal views and works of Jinny Wong only. It does not represent the views, policies, opinions or works of any other company that I have worked for past, present or future.

\ No newline at end of file diff --git a/algorithms/index.html b/algorithms/index.html index af94734..41c85f5 100644 --- a/algorithms/index.html +++ b/algorithms/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)

Data Structures & Algorithms

This page contains my notes on learning Data Structures & Algorithms with C++.

Learning Materials


Data Structures is about how data can be stored in different structures. Algorithms is about how to solve different problems with a finite sequence of instructions. Together, they provide a powerful and systematic approach to tackle any complex computational problem.

Algorithms

Data Structures

\ No newline at end of file + })(window)

Data Structures & Algorithms

This page contains my notes on learning Data Structures & Algorithms with C++.

Learning Materials


Data Structures is about how data can be stored in different structures. Algorithms is about how to solve different problems with a finite sequence of instructions. Together, they provide a powerful and systematic approach to tackle any complex computational problem.

Algorithms

Data Structures

\ No newline at end of file diff --git a/amsib-recap/index.html b/amsib-recap/index.html index 5455763..2ec9dc2 100644 --- a/amsib-recap/index.html +++ b/amsib-recap/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)

AMSIB Challenge 2022 Recap

Introduction

AMSIB Challenge is a cross-country business case study competition open to Malaysian and Chinese university students. It is organized by the Association of Malaysian Students in Beijing (AMSIB) registered under the Education Malaysia-Beijing.

The theme of the AMSIB Challenge 2022 focused on topics like: “small and medium-sized enterprises (SME)”, “mobile-commerce” and “COVID-19 pandemic”. The task that was given to participants was to identify a SME that is established in China or Malaysia, which has been affected by the pandemic, and find a way to implement mobile-commerce in their business so that they can increase profitability or develop a new business model.

Competition Prep

The AMSIB Challenge has only been held twice before, with this year’s being the third annual competition. The second one in 2021 was held online, and I managed to find a replay of last year’s finals on Facebook, which gave me a good idea of what to prepare for, the key to winning the competition, and how to answer well in the judge Q&A session.

Our team consisted of 4 members whom are studying in Computer Science, Business Administration and Math majors.

Preliminary Round

For the preliminary round, we had nine days to complete a 20-page proposal consisting of the following:

  • Table of Contents
  • Executive Summary
  • Chosen SME / Company Introduction
  • Market Analysis
  • Mobile-commerce Business Concept
  • 3-Years Execution Plan
  • Financial Plans
  • References

Our idea was to build a mobile app named “Pocket Chicken” for an existing poultry farm in Melaka, Malaysia. This app would help the farm manage online orders for eggs and chicken, and be able to easily arrange deliveries to customers. This would be helpful for them in the era of pandemic, as customers couldn’t shop in-store as usual during lock-down.


Final Round

We were one of the 10 teams that were then selected into the final round. The organizers had also invited a few mentors to provide us with coaching before the final round starts.

The coaching was divided into two sessions, the first one was a group session where all the mentors were to give comments and guidance to the 10 final teams based on the previous proposal. For the second time, each final team got to pick a mentor for one-on-one coaching, and have the chance to make changes to the final proposal.

For the finals, we had to make a 20-page presentation deck to showcase our work to judges. The key to winning this round was to design beautiful presentation decks that could summarize the research and analysis we had done on Malaysia’s poultry market, our execution plans, and the estimated budget plans. We also had to be well prepared and quickly respond to any questions that the judges could possible throw in our way.

Impromptu Round

After the final round, the judges selected the final 6 teams to enter the impromptu round. In this session, we only had 90 minutes to read the new given materials, understand the new case task, do research and analysis, and finally organize our findings and solutions into a presentation deck.

Results

Our team ended up winning 2nd Runner-Up (3rd Place) in AMSIB Challenge 2022. It was an enriching experience for me as I learnt a lot on how to complete market analysis and writing financial plans.

I think the essential skills needed to win in this competition are:

  • The ability to come up with innovative ideas
  • The ability to quickly understand new concepts
  • The ability to articulate your thoughts and ideas accurately
Author: Jinny
Link: https://blog.jinny.work/amsib-recap/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file + })(window)

AMSIB Challenge 2022 Recap

Introduction

AMSIB Challenge is a cross-country business case study competition open to Malaysian and Chinese university students. It is organized by the Association of Malaysian Students in Beijing (AMSIB) registered under the Education Malaysia-Beijing.

The theme of the AMSIB Challenge 2022 focused on topics like: “small and medium-sized enterprises (SME)”, “mobile-commerce” and “COVID-19 pandemic”. The task that was given to participants was to identify a SME that is established in China or Malaysia, which has been affected by the pandemic, and find a way to implement mobile-commerce in their business so that they can increase profitability or develop a new business model.

Competition Prep

The AMSIB Challenge has only been held twice before, with this year’s being the third annual competition. The second one in 2021 was held online, and I managed to find a replay of last year’s finals on Facebook, which gave me a good idea of what to prepare for, the key to winning the competition, and how to answer well in the judge Q&A session.

Our team consisted of 4 members whom are studying in Computer Science, Business Administration and Math majors.

Preliminary Round

For the preliminary round, we had nine days to complete a 20-page proposal consisting of the following:

  • Table of Contents
  • Executive Summary
  • Chosen SME / Company Introduction
  • Market Analysis
  • Mobile-commerce Business Concept
  • 3-Years Execution Plan
  • Financial Plans
  • References

Our idea was to build a mobile app named “Pocket Chicken” for an existing poultry farm in Melaka, Malaysia. This app would help the farm manage online orders for eggs and chicken, and be able to easily arrange deliveries to customers. This would be helpful for them in the era of pandemic, as customers couldn’t shop in-store as usual during lock-down.


Final Round

We were one of the 10 teams that were then selected into the final round. The organizers had also invited a few mentors to provide us with coaching before the final round starts.

The coaching was divided into two sessions, the first one was a group session where all the mentors were to give comments and guidance to the 10 final teams based on the previous proposal. For the second time, each final team got to pick a mentor for one-on-one coaching, and have the chance to make changes to the final proposal.

For the finals, we had to make a 20-page presentation deck to showcase our work to judges. The key to winning this round was to design beautiful presentation decks that could summarize the research and analysis we had done on Malaysia’s poultry market, our execution plans, and the estimated budget plans. We also had to be well prepared and quickly respond to any questions that the judges could possible throw in our way.

Impromptu Round

After the final round, the judges selected the final 6 teams to enter the impromptu round. In this session, we only had 90 minutes to read the new given materials, understand the new case task, do research and analysis, and finally organize our findings and solutions into a presentation deck.

Results

Our team ended up winning 2nd Runner-Up (3rd Place) in AMSIB Challenge 2022. It was an enriching experience for me as I learnt a lot on how to complete market analysis and writing financial plans.

I think the essential skills needed to win in this competition are:

  • The ability to come up with innovative ideas
  • The ability to quickly understand new concepts
  • The ability to articulate your thoughts and ideas accurately
Author: Jinny
Link: https://blog.jinny.work/amsib-recap/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/apple-interview/index.html b/apple-interview/index.html index 57d0a29..273a027 100644 --- a/apple-interview/index.html +++ b/apple-interview/index.html @@ -1,4 +1,4 @@ -My Interview Experience At Apple Inc. | Jinny's Blog

My Interview Experience At Apple Inc.

DISCLAIMER: The views expressed in this post are solely my own and do not represent those of Apple Inc. This post is not endorsed by, affiliated with, or sponsored by Apple Inc. All opinions and statements expressed here are my own and should not be attributed to Apple Inc.


Timeline

From applying for a role, to interviewing, then to receiving my offer, this whole process took 4 months.

Application

I initially submitted my resume to an Apple recruiter at a campus on-site recruitment event, hoping she would contact me if there were any suitable roles for me. I then heard back from another recruiter 2 months later, who had got hold of my contact from the previous recruiter. She reached out via email to invite me for a phone call.

On the phone call, she screened my resume and asked my availability for internship. She then encouraged me to apply for the ‘Information Systems and Technology Internship Program’ at Apple Shanghai. I then submitted my application for the role online through Apple’s Job Application Portal.

Note: I will refer ‘Information Systems and Technology’ as ‘IS&T’ in this blog post

1st Interview

My 1st interview was a 45-minutes interview with the IS&T Team Manager. We both did an introduction about ourselves, the manager then introduced the team and what they did at Apple. The remaining time was the manager asking me questions about my background, the projects I did and my previous internship experience that I’ve written on my resume. She also asked some behavioral questions, for example: ‘How would you build trust in the team’, ‘How would you plan and execute given tasks’, and etc.

Take-home Assignment

After passing the 1st interview, my recruiter sent me the take-home assignment that I need to complete within 5 days. The task was to develop a tool (mini program / native mobile app / web app) that would satisfy a specific set of requirements. I went for the web app development approach as I’ve already had experience in frontend and backend web development. You can check out my web app here.

2nd Interview

My 2nd interview was a 60-minutes session with the IS&T Team Manager and one of the engineers on the team, in which I did a 15-minutes case presentation about the take-home assignment that I’ve completed, and also showed a live demo of the web app.

The remaining time was spent on the engineer asking a lot of questions on my Machine Learning skills and experience, ranging from ‘Explain the differences in Lasso and Ridge Regression’, ‘Explain under-fitting and over-fitting’, ‘List out some activation functions that can be used with the MultiLayer Perceptron model’ and etc.

3rd Interview

The 3rd interview was a 45-minutes session with the IS&T Team Greater China Site Lead. This session mainly focused on project-based behavioral questions, for example: ‘One of the hardest projects I did, and how did I plan and executed it’, ‘How would I self-learn the latest technologies for a project’, and etc.

4th Interview

The 4th and final interview was a 60-minutes session with the IS&T Team APAC Lead and the Head of IS&T. The questions included: ‘How would you prioritize tasks & work under tight deadlines’, ‘Describe a situation when you reached out to your network for help on a project’.

Internship Offer

The next day after the final interview, I got a call from the recruiter giving me a verbal offer. We also discussed starting dates, working hours, and estimated stipend.

It then took another three weeks of waiting to get my official offer letter from Apple, because they had to conduct a background check on me, and there was also Chinese New Year holidays in between this period.

Final Notes

Your recruiter stays with you the whole time
From beginning till end, the same recruiter will stay in touch with you via e-mail or phone to help arrange interviews and also answer your questions. Please ask them for help and clarifications if you’re facing any problems.

Interview questions and process may vary
I didn’t write too much in detail of the questions I got asked because of two reasons: 1. Apple’s strict privacy rules, 2. The interview questions and process largely depends on what offices, roles, teams you’re applying to & your interviewer. There’s no fixed questions and answers for the interviews, not even the amount of interview rounds you’ll have to go through will be the same.

Know your interviewer
This is just an extra tip from me. Based on the interview email you get each time, you can actually try to look up the interviewer’s profile on LinkedIn. Try to understand their role, what they do at Apple, and their experiences. This will help you get a better sense of what will be coming up in the interview (either more technical or more behavioral questions). You can also think of some questions in advance to ask the interviewer.

Dress code
You should dress business casual for your interviews. I wore shirts and pants for all my interviews.

Make sure the meeting app (Webex / FaceTime) runs fine on your device
Enter the meeting room 10 minutes earlier, set up and test your camera & microphone.

Helpful resources
Here are some resources that I’ve found helpful while preparing for my interviews:


Here I would like to express my gratitude to my recruiter for giving me quick feedback along every stage of the application process, and also to the interviewers who asked thought-provoking questions which I can then ponder and improve on after my interviews.

For those who are reading this and applying to Apple, I wish you good luck & all the best!

Author: Jinny
Link: https://blog.jinny.work/apple-interview/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file + })(window)

My Interview Experience At Apple Inc.

DISCLAIMER: The views expressed in this post are solely my own and do not represent those of Apple Inc. This post is not endorsed by, affiliated with, or sponsored by Apple Inc. All opinions and statements expressed here are my own and should not be attributed to Apple Inc.


Timeline

From applying for a role, to interviewing, then to receiving my offer, this whole process took 4 months.

Application

I initially submitted my resume to an Apple recruiter at a campus on-site recruitment event, hoping she would contact me if there were any suitable roles for me. I then heard back from another recruiter 2 months later, who had got hold of my contact from the previous recruiter. She reached out via email to invite me for a phone call.

On the phone call, she screened my resume and asked my availability for internship. She then encouraged me to apply for the ‘Information Systems and Technology Internship Program’ at Apple Shanghai. I then submitted my application for the role online through Apple’s Job Application Portal.

Note: I will refer ‘Information Systems and Technology’ as ‘IS&T’ in this blog post

1st Interview

My 1st interview was a 45-minutes interview with the IS&T Team Manager. We both did an introduction about ourselves, the manager then introduced the team and what they did at Apple. The remaining time was the manager asking me questions about my background, the projects I did and my previous internship experience that I’ve written on my resume. She also asked some behavioral questions, for example: ‘How would you build trust in the team’, ‘How would you plan and execute given tasks’, and etc.

Take-home Assignment

After passing the 1st interview, my recruiter sent me the take-home assignment that I need to complete within 5 days. The task was to develop a tool (mini program / native mobile app / web app) that would satisfy a specific set of requirements. I went for the web app development approach as I’ve already had experience in frontend and backend web development. You can check out my web app here.

2nd Interview

My 2nd interview was a 60-minutes session with the IS&T Team Manager and one of the engineers on the team, in which I did a 15-minutes case presentation about the take-home assignment that I’ve completed, and also showed a live demo of the web app.

The remaining time was spent on the engineer asking a lot of questions on my Machine Learning skills and experience, ranging from ‘Explain the differences in Lasso and Ridge Regression’, ‘Explain under-fitting and over-fitting’, ‘List out some activation functions that can be used with the MultiLayer Perceptron model’ and etc.

3rd Interview

The 3rd interview was a 45-minutes session with the IS&T Team Greater China Site Lead. This session mainly focused on project-based behavioral questions, for example: ‘One of the hardest projects I did, and how did I plan and executed it’, ‘How would I self-learn the latest technologies for a project’, and etc.

4th Interview

The 4th and final interview was a 60-minutes session with the IS&T Team APAC Lead and the Head of IS&T. The questions included: ‘How would you prioritize tasks & work under tight deadlines’, ‘Describe a situation when you reached out to your network for help on a project’.

Internship Offer

The next day after the final interview, I got a call from the recruiter giving me a verbal offer. We also discussed starting dates, working hours, and estimated stipend.

It then took another three weeks of waiting to get my official offer letter from Apple, because they had to conduct a background check on me, and there was also Chinese New Year holidays in between this period.

Final Notes

Your recruiter stays with you the whole time
From beginning till end, the same recruiter will stay in touch with you via e-mail or phone to help arrange interviews and also answer your questions. Please ask them for help and clarifications if you’re facing any problems.

Interview questions and process may vary
I didn’t write too much in detail of the questions I got asked because of two reasons: 1. Apple’s strict privacy rules, 2. The interview questions and process largely depends on what offices, roles, teams you’re applying to & your interviewer. There’s no fixed questions and answers for the interviews, not even the amount of interview rounds you’ll have to go through will be the same.

Know your interviewer
This is just an extra tip from me. Based on the interview email you get each time, you can actually try to look up the interviewer’s profile on LinkedIn. Try to understand their role, what they do at Apple, and their experiences. This will help you get a better sense of what will be coming up in the interview (either more technical or more behavioral questions). You can also think of some questions in advance to ask the interviewer.

Dress code
You should dress business casual for your interviews. I wore shirts and pants for all my interviews.

Make sure the meeting app (Webex / FaceTime) runs fine on your device
Enter the meeting room 10 minutes earlier, set up and test your camera & microphone.

Helpful resources
Here are some resources that I’ve found helpful while preparing for my interviews:


Here I would like to express my gratitude to my recruiter for giving me quick feedback along every stage of the application process, and also to the interviewers who asked thought-provoking questions which I can then ponder and improve on after my interviews.

For those who are reading this and applying to Apple, I wish you good luck & all the best!

Author: Jinny
Link: https://blog.jinny.work/apple-interview/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/archives/2022/04/index.html b/archives/2022/04/index.html index a4201ee..cedfd1c 100644 --- a/archives/2022/04/index.html +++ b/archives/2022/04/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2022
AMSIB Challenge 2022 Recap
What's On My Laptop
\ No newline at end of file + })(window)
Articles - 6
2022
AMSIB Challenge 2022 Recap
What's On My Laptop
\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html index 8ff0c6f..d585f76 100644 --- a/archives/2022/index.html +++ b/archives/2022/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2022
AMSIB Challenge 2022 Recap
What's On My Laptop
\ No newline at end of file + })(window)
Articles - 6
2022
AMSIB Challenge 2022 Recap
What's On My Laptop
\ No newline at end of file diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html index 43c0c64..e692db8 100644 --- a/archives/2023/12/index.html +++ b/archives/2023/12/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2023
Skills To Become A Quant
\ No newline at end of file + })(window)
Articles - 6
2023
Skills To Become A Quant
\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html index 369d3af..115e739 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2023
Skills To Become A Quant
\ No newline at end of file + })(window)
Articles - 6
2023
Skills To Become A Quant
\ No newline at end of file diff --git a/archives/2024/03/index.html b/archives/2024/03/index.html index 1ddabe2..e6602c3 100644 --- a/archives/2024/03/index.html +++ b/archives/2024/03/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2024
My Interview Experience At Apple Inc.
\ No newline at end of file + })(window)
Articles - 6
2024
My Interview Experience At Apple Inc.
\ No newline at end of file diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html index 1784cd2..2da4d72 100644 --- a/archives/2024/04/index.html +++ b/archives/2024/04/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Articles - 6
2024
Randomized Algorithms
How To Build A Blog With Hexo
\ No newline at end of file + })(window)
Articles - 6
2024
Randomized Algorithms
How To Build A Blog With Hexo
\ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html index 9b0ba1f..9d6d07d 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html index e2a780c..971e2e9 100644 --- a/archives/index.html +++ b/archives/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/categories/Competitions/index.html b/categories/Competitions/index.html index bd08f26..08cd3c0 100644 --- a/categories/Competitions/index.html +++ b/categories/Competitions/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Competitions
2022
AMSIB Challenge 2022 Recap
\ No newline at end of file + })(window)
Category - Competitions
2022
AMSIB Challenge 2022 Recap
\ No newline at end of file diff --git a/categories/Notes/index.html b/categories/Notes/index.html index 9e7f42c..333f24a 100644 --- a/categories/Notes/index.html +++ b/categories/Notes/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Notes
2024
Randomized Algorithms
\ No newline at end of file + })(window)
Category - Notes
2024
Randomized Algorithms
\ No newline at end of file diff --git a/categories/Others/index.html b/categories/Others/index.html index c1dbf25..185e9b1 100644 --- a/categories/Others/index.html +++ b/categories/Others/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Others
2022
What's On My Laptop
\ No newline at end of file + })(window)
Category - Others
2022
What's On My Laptop
\ No newline at end of file diff --git a/categories/Quant/index.html b/categories/Quant/index.html index 785c980..2bb7fed 100644 --- a/categories/Quant/index.html +++ b/categories/Quant/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Quant
2023
Skills To Become A Quant
\ No newline at end of file + })(window)
Category - Quant
2023
Skills To Become A Quant
\ No newline at end of file diff --git a/categories/Technical/index.html b/categories/Technical/index.html index 4ec8742..172d5a8 100644 --- a/categories/Technical/index.html +++ b/categories/Technical/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Technical
2024
How To Build A Blog With Hexo
\ No newline at end of file + })(window)
Category - Technical
2024
How To Build A Blog With Hexo
\ No newline at end of file diff --git a/categories/Work/index.html b/categories/Work/index.html index 2b9e229..66ff0f9 100644 --- a/categories/Work/index.html +++ b/categories/Work/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
Category - Work
2024
My Interview Experience At Apple Inc.
\ No newline at end of file + })(window)
Category - Work
2024
My Interview Experience At Apple Inc.
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 01c4061..9e43e4e 100644 --- a/categories/index.html +++ b/categories/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/computer-graphics/index.html b/computer-graphics/index.html index 6d31077..3cde02e 100644 --- a/computer-graphics/index.html +++ b/computer-graphics/index.html @@ -1,4 +1,4 @@ -Computer Graphics | Jinny's Blog

Computer Graphics

This page contains my notes on learning Computer Graphics.

Learning Materials

Code for the projects I have completed along with this course can be found on my GitHub repository here.


Computer Graphics describe the use of algorithmic and mathematical tools to create and manipulate graphics. Topics include:

\ No newline at end of file + })(window)

Computer Graphics

This page contains my notes on learning Computer Graphics.

Learning Materials

Code for the projects I have completed along with this course can be found on my GitHub repository here.


Computer Graphics describe the use of algorithmic and mathematical tools to create and manipulate graphics. Topics include:

\ No newline at end of file diff --git a/css/font.css b/css/font.css index 82d1f63..02ab982 100644 --- a/css/font.css +++ b/css/font.css @@ -1,3 +1,3 @@ -/* build time:Sat Apr 27 2024 01:20:31 GMT+0800 (Malaysia Time)*/ +/* build time:Sat Apr 27 2024 01:22:50 GMT+0800 (Malaysia Time)*/ @font-face{font-family:'Noto Serif SC';src:url(https://fonts.googleapis.com/css2?family=Noto+Serif+SC&display=swap)}body{font-family:'Noto Serif SC'} /* rebuild by neat */ \ No newline at end of file diff --git a/css/index.css b/css/index.css index fe165ec..f57b7fb 100644 --- a/css/index.css +++ b/css/index.css @@ -1,3 +1,3 @@ -/* build time:Sat Apr 27 2024 01:20:31 GMT+0800 (Malaysia Time)*/ +/* build time:Sat Apr 27 2024 01:22:50 GMT+0800 (Malaysia Time)*/ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}#article-container .flink .flink-item-desc,#article-container .flink .flink-item-name,#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span,#aside-content .card-info .card-info-data>.card-info-data-item a .headline,#pagination .next_info,#pagination .prev_info,#sidebar #sidebar-menus .menus_items .site-page,#sidebar #sidebar-menus .site-data .data-item>a>div,.limit-one-line{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}#article-container figure.gallery-group .gallery-group-name,#article-container figure.gallery-group p,#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>.title,#post-info .post-title,#recent-posts>.recent-post-item>.recent-post-info>.article-title,#recent-posts>.recent-post-item>.recent-post-info>.content,.article-sort-item-title,.error404 #error-wrap .error-content .error-info .error_subtitle,.limit-more-line,.relatedPosts>.relatedPosts-list .content .title{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}#post .post-copyright:before,#post .post-outdate-notice:before,.fontawesomeIcon,.note:not(.no-icon)::before,hr:before{display:inline-block;font-weight:600;font-family:'Font Awesome 6 Free';text-rendering:auto;-webkit-font-smoothing:antialiased}#aside-content .card-widget,#recent-posts>.recent-post-item,.cardHover,.error404 #error-wrap .error-content,.layout>.recent-posts .pagination>:not(.space),.layout>div:first-child:not(.recent-posts){border-radius:8px;background:var(--card-bg);-webkit-box-shadow:var(--card-box-shadow);box-shadow:var(--card-box-shadow);-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-widget:hover,#recent-posts>.recent-post-item:hover,.cardHover:hover,.error404 #error-wrap .error-content:hover,.layout>.recent-posts .pagination>:not(.space):hover,.layout>div:first-child:not(.recent-posts):hover{-webkit-box-shadow:var(--card-hover-box-shadow);box-shadow:var(--card-hover-box-shadow)}#aside-content .aside-list>.aside-list-item .thumbnail>img,#recent-posts>.recent-post-item .post_cover img.post_bg,.article-sort-item-img img,.error404 #error-wrap .error-content .error-img img,.imgHover{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .6s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .6s;-o-transition:filter 375ms ease-in .2s,-o-transform .6s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .6s;transition:filter 375ms ease-in .2s,transform .6s;object-fit:cover}#aside-content .aside-list>.aside-list-item .thumbnail>img:hover,#recent-posts>.recent-post-item .post_cover img.post_bg:hover,.article-sort-item-img img:hover,.error404 #error-wrap .error-content .error-img img:hover,.imgHover:hover{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post:hover img,#pagination .prev-post:hover img,.postImgHover:hover img,.relatedPosts>.relatedPosts-list>div:hover img{opacity:.8;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post img,#pagination .prev-post img,.postImgHover img,.relatedPosts>.relatedPosts-list>div img{position:absolute;width:100%;height:100%;opacity:.4;-webkit-transition:all .6s,filter 375ms ease-in .2s;-moz-transition:all .6s,filter 375ms ease-in .2s;-o-transition:all .6s,filter 375ms ease-in .2s;-ms-transition:all .6s,filter 375ms ease-in .2s;transition:all .6s,filter 375ms ease-in .2s;object-fit:cover}.category-lists ul,.list-beauty{list-style:none}.category-lists ul li,.list-beauty li{position:relative;padding:.12em .4em .12em 1.4em}.category-lists ul li:hover:before,.list-beauty li:hover:before{border-color:var(--pseudo-hover)}.category-lists ul li:before,.list-beauty li:before{position:absolute;top:.67em;left:0;width:.43em;height:.43em;border:.215em solid #31304d;border-radius:.43em;background:0 0;content:'';cursor:pointer;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#content-inner,#footer{-webkit-animation:bottom-top 1s;-moz-animation:bottom-top 1s;-o-animation:bottom-top 1s;-ms-animation:bottom-top 1s;animation:bottom-top 1s}#page-header{-webkit-animation:header-effect 1s;-moz-animation:header-effect 1s;-o-animation:header-effect 1s;-ms-animation:header-effect 1s;animation:header-effect 1s}#site-subtitle,#site-title{-webkit-animation:titleScale 1s;-moz-animation:titleScale 1s;-o-animation:titleScale 1s;-ms-animation:titleScale 1s;animation:titleScale 1s}#nav.show{-webkit-animation:headerNoOpacity 1s;-moz-animation:headerNoOpacity 1s;-o-animation:headerNoOpacity 1s;-ms-animation:headerNoOpacity 1s;animation:headerNoOpacity 1s}#web_bg,canvas:not(#ribbon-canvas){-webkit-animation:to_show 4s;-moz-animation:to_show 4s;-o-animation:to_show 4s;-ms-animation:to_show 4s;animation:to_show 4s}#ribbon-canvas{-webkit-animation:ribbon_to_show 4s;-moz-animation:ribbon_to_show 4s;-o-animation:ribbon_to_show 4s;-ms-animation:ribbon_to_show 4s;animation:ribbon_to_show 4s}#sidebar-menus.open>:nth-child(1){-webkit-animation:sidebarItem .2 s;-moz-animation:sidebarItem .2 s;-o-animation:sidebarItem .2 s;-ms-animation:sidebarItem .2 s;animation:sidebarItem .2 s}#sidebar-menus.open>:nth-child(2){-webkit-animation:sidebarItem .4 s;-moz-animation:sidebarItem .4 s;-o-animation:sidebarItem .4 s;-ms-animation:sidebarItem .4 s;animation:sidebarItem .4 s}#sidebar-menus.open>:nth-child(3){-webkit-animation:sidebarItem .6 s;-moz-animation:sidebarItem .6 s;-o-animation:sidebarItem .6 s;-ms-animation:sidebarItem .6 s;animation:sidebarItem .6 s}#sidebar-menus.open>:nth-child(4){-webkit-animation:sidebarItem .8 s;-moz-animation:sidebarItem .8 s;-o-animation:sidebarItem .8 s;-ms-animation:sidebarItem .8 s;animation:sidebarItem .8 s}.scroll-down-effects{-webkit-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite;animation:scroll-down-effect 1.5s infinite}.reward-main{-webkit-animation:donate_effcet .3s .1s ease both;-moz-animation:donate_effcet .3s .1s ease both;-o-animation:donate_effcet .3s .1s ease both;-ms-animation:donate_effcet .3s .1s ease both;animation:donate_effcet .3s .1s ease both}@-moz-keyframes scroll-down-effect{0%{top:0;opacity:.4}50%{top:-16px;opacity:1;-ms-filter:none;filter:none}100%{top:0;opacity:.4}}@-webkit-keyframes scroll-down-effect{0%{top:0;opacity:.4}50%{top:-16px;opacity:1;-ms-filter:none;filter:none}100%{top:0;opacity:.4}}@-o-keyframes scroll-down-effect{0%{top:0;opacity:.4}50%{top:-16px;opacity:1;-ms-filter:none;filter:none}100%{top:0;opacity:.4}}@keyframes scroll-down-effect{0%{top:0;opacity:.4}50%{top:-16px;opacity:1;-ms-filter:none;filter:none}100%{top:0;opacity:.4}}@-moz-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes bottom-top{0%{margin-top:50px;opacity:0}100%{margin-top:0;opacity:1;-ms-filter:none;filter:none}}@-webkit-keyframes bottom-top{0%{margin-top:50px;opacity:0}100%{margin-top:0;opacity:1;-ms-filter:none;filter:none}}@-o-keyframes bottom-top{0%{margin-top:50px;opacity:0}100%{margin-top:0;opacity:1;-ms-filter:none;filter:none}}@keyframes bottom-top{0%{margin-top:50px;opacity:0}100%{margin-top:0;opacity:1;-ms-filter:none;filter:none}}@-moz-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-moz-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-webkit-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-o-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-moz-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-webkit-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-o-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-moz-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-webkit-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-o-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-moz-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-o-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}:root{--global-font-size:17px;--global-bg:#fff;--font-color:#4c4948;--hr-border:#aeb2bf;--hr-before-color:#8e93a5;--search-bg:#f6f8fa;--search-input-color:#4c4948;--search-result-title:#4c4948;--preloader-bg:#37474f;--preloader-color:#fff;--tab-border-color:#f0f0f0;--tab-botton-bg:#f0f0f0;--tab-botton-color:#1f2d3d;--tab-button-hover-bg:#dcdcdc;--tab-button-active-bg:#fff;--card-bg:#fff;--sidebar-bg:#f6f8fa;--btn-hover-color:#b6bbc4;--btn-color:#fff;--btn-bg:#31304d;--text-bg-hover:rgba(49,48,77,0.7);--light-grey:#eee;--dark-grey:#cacaca;--white:#fff;--text-highlight-color:#1f2d3d;--blockquote-color:#6a737d;--blockquote-bg:rgba(182,187,196,0.1);--reward-pop:#f5f5f5;--toc-link-color:#666261;--card-box-shadow:0 3px 8px 6px rgba(7,17,27,0.05);--card-hover-box-shadow:0 3px 8px 6px rgba(7,17,27,0.09);--pseudo-hover:#b6bbc4;--headline-presudo:#a0a0a0;--scrollbar-color:#161a30}body{position:relative;min-height:100%;background:var(--global-bg);color:var(--font-color);font-size:var(--global-font-size);font-family:PT Serif,Noto Serif SC;line-height:2;-webkit-tap-highlight-color:transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--scrollbar-color)}::-webkit-scrollbar-track{background-color:transparent}*{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color) transparent}input::placeholder{color:var(--font-color)}h1,h2,h3,h4,h5,h6{position:relative;margin:20px 0 14px;color:var(--text-highlight-color);font-weight:700}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{font-size:inherit!important}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}hr{position:relative;margin:40px auto;border:2px dashed var(--hr-border);width:calc(100% - 4px)}hr:hover:before{left:calc(95% - 20px)}hr:before{position:absolute;top:-10px;left:5%;z-index:1;color:var(--hr-before-color);content:'\f0c2';font-size:20px;line-height:1;-webkit-transition:all 1s ease-in-out;-moz-transition:all 1s ease-in-out;-o-transition:all 1s ease-in-out;-ms-transition:all 1s ease-in-out;transition:all 1s ease-in-out}.table-wrap{overflow-x:scroll;margin:0 0 20px}table{display:table;width:100%;border-spacing:0;border-collapse:collapse;empty-cells:show}table thead{background:rgba(153,169,191,.1)}table td,table th{padding:6px 12px;border:1px solid var(--light-grey);vertical-align:middle}::selection{background:#31304d;color:#f7f7f7}button{padding:0;outline:0;border:none;background:0 0;cursor:pointer;touch-action:manipulation}a{color:#99a9bf;text-decoration:none;word-wrap:break-word;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;-ms-transition:all .2s;transition:all .2s;overflow-wrap:break-word}a:hover{color:#31304d}.is-center{text-align:center}.copy-true{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.pull-left{float:left}.pull-right{float:right}img:not([src]),img[src='']{opacity:0}.img-alt{margin:-10px 0 10px;color:#858585}.img-alt:hover{text-decoration:none!important}blockquote{margin:0 0 20px;padding:12px 15px;border-left:3px solid #b6bbc4;background-color:var(--blockquote-bg);color:var(--blockquote-color)}blockquote footer cite:before{padding:0 5px;content:'—'}blockquote>:last-child{margin-bottom:0!important}:root{--hl-color:#a6accd;--hl-bg:#292d3e;--hltools-bg:#252938;--hltools-color:#a6accd;--hlnumber-bg:#292d3e;--hlnumber-color:rgba(166,172,205,0.5);--hlscrollbar-bg:#393f57;--hlexpand-bg:linear-gradient(180deg, rgba(41,45,62,0.6), rgba(41,45,62,0.9))}figure.highlight table{scrollbar-color:var(--hlscrollbar-bg) transparent}figure.highlight table::-webkit-scrollbar-thumb{background:var(--hlscrollbar-bg)}figure.highlight pre .deletion{color:#bf42bf}figure.highlight pre .addition{color:#105ede}figure.highlight pre .meta{color:#c792ea}figure.highlight pre .comment{color:#676e95}figure.highlight pre .attribute,figure.highlight pre .css .class,figure.highlight pre .css .id,figure.highlight pre .css .pseudo,figure.highlight pre .html .doctype,figure.highlight pre .regexp,figure.highlight pre .ruby .constant,figure.highlight pre .tag .name,figure.highlight pre .variable,figure.highlight pre .xml .doctype,figure.highlight pre .xml .pi,figure.highlight pre .xml .tag .title{color:#ff5370}figure.highlight pre .tag{color:#89ddff}figure.highlight pre .command,figure.highlight pre .constant,figure.highlight pre .literal,figure.highlight pre .number,figure.highlight pre .params,figure.highlight pre .preprocessor{color:#f78c6c}figure.highlight pre .built_in{color:#ffcb6b}figure.highlight pre .css .rules .attribute,figure.highlight pre .formula,figure.highlight pre .header,figure.highlight pre .inheritance,figure.highlight pre .number,figure.highlight pre .ruby .class .title,figure.highlight pre .ruby .symbol,figure.highlight pre .special,figure.highlight pre .string,figure.highlight pre .value,figure.highlight pre .xml .cdata{color:#c3e88d}figure.highlight pre .css .hexcolor,figure.highlight pre .keyword,figure.highlight pre .title{color:#89ddff}figure.highlight pre .coffeescript .title,figure.highlight pre .function,figure.highlight pre .javascript .title,figure.highlight pre .perl .sub,figure.highlight pre .python .decorator,figure.highlight pre .python .title,figure.highlight pre .ruby .function .title,figure.highlight pre .ruby .title .keyword{color:#82aaff}figure.highlight pre .javascript .function,figure.highlight pre .tag .attr{color:#c792ea}#article-container figure.highlight .line:before{display:inline-block;padding:0 6px 0 0;min-width:30px;color:var(--hlnumber-color);content:counter(line);counter-increment:line;text-align:left}#article-container figure.highlight .line.marked{background-color:rgba(113,124,180,.314)}#article-container figure.highlight table{display:block;overflow:auto;border:none}#article-container figure.highlight table td{padding:0;border:none}#article-container figure.highlight .gutter pre{padding-right:10px;padding-left:10px;background-color:var(--hlnumber-bg);color:var(--hlnumber-color);text-align:right}#article-container figure.highlight .code pre{padding-right:10px;padding-left:10px;width:100%}#article-container figure.highlight,#article-container pre{overflow:auto;margin:0 0 20px;padding:0;background:var(--hl-bg);color:var(--hl-color);line-height:1.6;counter-reset:line;white-space:pre-wrap}#article-container code,#article-container pre{font-size:16px;font-family:consolas!important}#article-container code{padding:2px 4px;background:rgba(27,31,35,.05);color:#f47466}#article-container pre{padding:10px 20px}#article-container pre code{padding:0;background:0 0;color:var(--hl-color);text-shadow:none}#article-container figure.highlight{position:relative}#article-container figure.highlight pre{margin:0;padding:8px 0;border:none}#article-container figure.highlight .caption,#article-container figure.highlight figcaption{padding:6px 0 2px 14px;font-size:16px;line-height:1em}#article-container figure.highlight .caption a,#article-container figure.highlight figcaption a{float:right;padding-right:10px;color:var(--hl-color)}#article-container figure.highlight .caption a:hover,#article-container figure.highlight figcaption a:hover{border-bottom-color:var(--hl-color)}#article-container .highlight-tools{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;min-height:24px;height:2.15em;background:var(--hltools-bg);color:var(--hltools-color);font-size:16px}#article-container .highlight-tools.closed~*{display:none}#article-container .highlight-tools .expand{position:absolute;padding:.57em .7em;cursor:pointer;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#article-container .highlight-tools .expand+.code-lang{left:1.7em}#article-container .highlight-tools .expand.closed{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:rotate(-90deg)!important;-moz-transform:rotate(-90deg)!important;-o-transform:rotate(-90deg)!important;-ms-transform:rotate(-90deg)!important;transform:rotate(-90deg)!important}#article-container .highlight-tools .code-lang{position:absolute;left:14px;text-transform:uppercase;font-weight:700;font-size:1.15em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#article-container .highlight-tools .copy-notice{position:absolute;right:2.4em;opacity:0;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s;transition:opacity .4s}#article-container .highlight-tools .copy-button{position:absolute;right:14px;cursor:pointer;-webkit-transition:color .2s;-moz-transition:color .2s;-o-transition:color .2s;-ms-transition:color .2s;transition:color .2s}#article-container .highlight-tools .copy-button:hover{color:#31304d}#article-container .gutter{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#article-container .gist table{width:auto}#article-container .gist table td{border:none}@-moz-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-webkit-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-o-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}.error404 #error-wrap{position:absolute;top:50%;right:0;left:0;margin:0 auto;padding:60px 20px 0;max-width:1000px;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.error404 #error-wrap .error-content{overflow:hidden;margin:0 20px;height:360px}@media screen and (max-width:768px){.error404 #error-wrap .error-content{margin:0;height:500px}}.error404 #error-wrap .error-content .error-img{display:inline-block;overflow:hidden;width:50%;height:100%}@media screen and (max-width:768px){.error404 #error-wrap .error-content .error-img{width:100%;height:45%}}.error404 #error-wrap .error-content .error-img img{background-color:#31304d}.error404 #error-wrap .error-content .error-info{display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-box;display:inline-flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-moz-box-pack:center;-o-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;width:50%;height:100%;vertical-align:top;text-align:center}@media screen and (max-width:768px){.error404 #error-wrap .error-content .error-info{width:100%;height:55%}}.error404 #error-wrap .error-content .error-info .error_title{margin-top:-.6em;font-size:9em}@media screen and (max-width:768px){.error404 #error-wrap .error-content .error-info .error_title{font-size:8em}}.error404 #error-wrap .error-content .error-info .error_subtitle{margin-top:-3em;word-break:break-word;font-size:1.6em;-webkit-line-clamp:2}.error404+#rightside{display:none}.article-sort{margin-left:10px;padding-left:20px;border-left:2px solid #59578c}.article-sort-title{position:relative;margin-left:10px;padding-bottom:20px;padding-left:20px;font-size:1.72em}.article-sort-title:hover:before{border-color:var(--pseudo-hover)}.article-sort-title:before{position:absolute;top:calc(((100% - 36px)/ 2));left:-9px;z-index:1;width:10px;height:10px;border:5px solid #31304d;border-radius:10px;background:var(--card-bg);content:'';line-height:10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-title:after{position:absolute;bottom:0;left:0;z-index:0;width:2px;height:1.5em;background:#59578c;content:''}.article-sort-item{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;margin:0 0 20px 10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item:hover:before{border-color:var(--pseudo-hover)}.article-sort-item:before{position:absolute;left:calc(-20px - 17px);width:6px;height:6px;border:3px solid #31304d;border-radius:6px;background:var(--card-bg);content:'';-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item.no-article-cover{height:80px}.article-sort-item.no-article-cover .article-sort-item-info{padding:0}.article-sort-item.year{font-size:1.43em}.article-sort-item.year:hover:before{border-color:#31304d}.article-sort-item.year:before{border-color:var(--pseudo-hover)}.article-sort-item-time{color:#61677a;font-size:95%}.article-sort-item-time time{padding-left:6px;cursor:default}.article-sort-item-title{color:var(--font-color);font-size:1.1em;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-line-clamp:2}.article-sort-item-title:hover{color:#31304d;-webkit-transform:translateX(10px);-moz-transform:translateX(10px);-o-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}.article-sort-item-img{overflow:hidden;width:80px;height:80px}.article-sort-item-info{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 16px}.category-lists .category-title{font-size:2.57em}@media screen and (max-width:768px){.category-lists .category-title{font-size:2em}}.category-lists .category-list{margin-bottom:0}.category-lists .category-list a{color:var(--font-color)}.category-lists .category-list a:hover{color:#31304d}.category-lists .category-list .category-list-count{margin-left:8px;color:#61677a}.category-lists .category-list .category-list-count:before{content:'('}.category-lists .category-list .category-list-count:after{content:')'}.category-lists ul{padding:0 0 0 20px}.category-lists ul ul{padding-left:4px}.category-lists ul li{position:relative;margin:6px 0;padding:.12em .4em .12em 1.4em}#body-wrap{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100vh}.layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;margin:0 auto;padding:40px 15px;max-width:1200px;width:100%}@media screen and (max-width:900px){.layout{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:768px){.layout{padding:20px 5px}}@media screen and (min-width:2000px){.layout{max-width:1500px}}.layout>div:first-child:not(.recent-posts){-webkit-align-self:flex-start;align-self:flex-start;-ms-flex-item-align:start;padding:50px 40px}@media screen and (max-width:768px){.layout>div:first-child:not(.recent-posts){padding:36px 14px}}.layout>div:first-child{width:74%;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}@media screen and (max-width:900px){.layout>div:first-child{width:100%!important}}@media screen and (min-width:900px){.layout>div:first-child{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-o-box-ordinal-group:2;-ms-flex-order:2;-webkit-order:2;order:2}}.layout.hide-aside{max-width:1000px}@media screen and (min-width:2000px){.layout.hide-aside{max-width:1300px}}.layout.hide-aside>div{width:100%!important}.apple #page-header.full_page{background-attachment:scroll!important}.apple .avatar-img,.apple .flink-item-icon,.apple .recent-post-item{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-o-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}#article-container .flink{margin-bottom:20px}#article-container .flink .flink-list{overflow:auto;padding:10px 10px 0;text-align:center}#article-container .flink .flink-list>.flink-list-item{position:relative;float:left;overflow:hidden;margin:15px 7px;width:calc(100% / 3 - 15px);height:90px;border-radius:8px;line-height:17px;-webkit-transform:translateZ(0)}@media screen and (max-width:1024px){#article-container .flink .flink-list>.flink-list-item{width:calc(50% - 15px)!important}}@media screen and (max-width:600px){#article-container .flink .flink-list>.flink-list-item{width:calc(100% - 15px)!important}}#article-container .flink .flink-list>.flink-list-item:hover .flink-item-icon{margin-left:-10px;width:0}#article-container .flink .flink-list>.flink-list-item:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:var(--text-bg-hover);content:'';-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;-ms-transition:-ms-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}#article-container .flink .flink-list>.flink-list-item:active:before,#article-container .flink .flink-list>.flink-list-item:focus:before,#article-container .flink .flink-list>.flink-list-item:hover:before{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}#article-container .flink .flink-list>.flink-list-item a{color:var(--font-color);text-decoration:none}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon{float:left;overflow:hidden;margin:15px 10px;width:60px;height:60px;border-radius:35px;-webkit-transition:width .3s ease-out;-moz-transition:width .3s ease-out;-o-transition:width .3s ease-out;-ms-transition:width .3s ease-out;transition:width .3s ease-out}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}#article-container .flink .flink-list>.flink-list-item a .img-alt{display:none}#article-container .flink .flink-item-name{padding:16px 10px 0 0;height:40px;font-weight:700;font-size:1.43em}#article-container .flink .flink-item-desc{padding:16px 10px 16px 0;height:50px;font-size:.93em}#article-container .flink .flink-name{margin-bottom:5px;font-weight:700;font-size:1.5em}#recent-posts>.recent-post-item:not(:first-child){margin-top:20px}#recent-posts>.recent-post-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;height:18em}@media screen and (max-width:768px){#recent-posts>.recent-post-item{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:auto}}#recent-posts>.recent-post-item:hover img.post_bg{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#recent-posts>.recent-post-item.ads-wrap{display:block!important;height:auto!important}#recent-posts>.recent-post-item .post_cover{overflow:hidden;width:44%;height:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover{width:100%;height:230px}}#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-o-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:0;-moz-box-ordinal-group:0;-o-box-ordinal-group:0;-ms-flex-order:0;-webkit-order:0;order:0}}#recent-posts>.recent-post-item>.recent-post-info{padding:0 40px;width:57%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info{padding:20px 20px 30px;width:100%}}#recent-posts>.recent-post-item>.recent-post-info.no-cover{width:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info.no-cover{padding:30px 20px}}#recent-posts>.recent-post-item>.recent-post-info>.article-title{color:var(--text-highlight-color);font-size:1.72em;line-height:1.4;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-line-clamp:2}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info>.article-title{font-size:1.43em}}#recent-posts>.recent-post-item>.recent-post-info>.article-title:hover{color:#31304d}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap{margin:6px 0;color:#61677a;font-size:90%}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap>.post-meta-date{cursor:default}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .sticky{color:#ff7242}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap i{margin:0 4px 0 0}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-label{padding-right:4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-separator{margin:0 6px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-link{margin:0 4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a{color:#61677a}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a:hover{color:#31304d;text-decoration:underline}#recent-posts>.recent-post-item>.recent-post-info>.content{-webkit-line-clamp:2}.tag-cloud-list a{display:inline-block;padding:0 8px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}.tag-cloud-list a:hover{color:#31304d!important;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}@media screen and (max-width:768px){.tag-cloud-list a{zoom:.85}}.tag-cloud-title{font-size:2.57em}@media screen and (max-width:768px){.tag-cloud-title{font-size:2em}}h1.page-title+.tag-cloud-list{text-align:left}#aside-content{width:26%}@media screen and (min-width:900px){#aside-content{padding-right:15px}}@media screen and (max-width:900px){#aside-content{width:100%}}#aside-content>.card-widget:first-child{margin-top:0}@media screen and (max-width:900px){#aside-content>.card-widget:first-child{margin-top:20px}}#aside-content .card-widget{position:relative;overflow:hidden;margin-top:20px;padding:20px 24px}#aside-content .card-info .author-info__name{font-weight:500;font-size:1.57em}#aside-content .card-info .author-info__description{margin-top:-.42em}#aside-content .card-info .card-info-data{display:table;margin:14px 0 4px;width:100%;table-layout:fixed}#aside-content .card-info .card-info-data>.card-info-data-item{display:table-cell}#aside-content .card-info .card-info-data>.card-info-data-item a .headline{color:var(--font-color);font-size:1em}#aside-content .card-info .card-info-data>.card-info-data-item a .length-num{margin-top:-.42em;color:var(--text-highlight-color);font-size:1.4em}#aside-content .card-info .card-info-social-icons{margin:6px 0 -6px}#aside-content .card-info .card-info-social-icons .social-icon{margin:0 10px;color:var(--font-color);font-size:1.4em}#aside-content .card-info .card-info-social-icons i{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-info .card-info-social-icons i:hover{-webkit-transform:rotate(540deg);-moz-transform:rotate(540deg);-o-transform:rotate(540deg);-ms-transform:rotate(540deg);transform:rotate(540deg)}#aside-content .card-info #card-info-btn{display:block;margin-top:14px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;line-height:2.4}#aside-content .card-info #card-info-btn:hover{background-color:var(--btn-hover-color)}#aside-content .card-info #card-info-btn span{padding-left:10px}#aside-content .item-headline{padding-bottom:6px;font-size:1.2em}#aside-content .item-headline span{margin-left:6px}@media screen and (min-width:900px){#aside-content .sticky_layout{position:sticky;position:-webkit-sticky;top:20px;-webkit-transition:top .3s;-moz-transition:top .3s;-o-transition:top .3s;-ms-transition:top .3s;transition:top .3s}}#aside-content .card-tag-cloud a{display:inline-block;padding:0 4px}#aside-content .card-tag-cloud a:hover{color:#31304d!important}#aside-content .aside-list>span{display:block;margin-bottom:10px;text-align:center}#aside-content .aside-list>.aside-list-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:6px 0}#aside-content .aside-list>.aside-list-item:first-child{padding-top:0}#aside-content .aside-list>.aside-list-item:not(:last-child){border-bottom:1px dashed #f5f5f5}#aside-content .aside-list>.aside-list-item:last-child{padding-bottom:0}#aside-content .aside-list>.aside-list-item .thumbnail{overflow:hidden;width:4.2em;height:4.2em}#aside-content .aside-list>.aside-list-item .content{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:10px;word-break:break-all}#aside-content .aside-list>.aside-list-item .content>.name{-webkit-line-clamp:1}#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>time{display:block;color:#61677a;font-size:85%}#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.title{color:var(--font-color);font-size:95%;line-height:1.5;-webkit-line-clamp:2}#aside-content .aside-list>.aside-list-item .content>.comment:hover,#aside-content .aside-list>.aside-list-item .content>.title:hover{color:#31304d}#aside-content .aside-list>.aside-list-item.no-cover{min-height:4.4em}#aside-content .card-archives ul.card-archive-list,#aside-content .card-categories ul.card-category-list{margin:0;padding:0;list-style:none}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a,#aside-content .card-categories ul.card-category-list>.card-category-list-item a{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:3px 10px;color:var(--font-color);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{padding:3px 17px;background-color:var(--text-bg-hover)}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:first-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#aside-content .card-categories .card-category-list.child{padding:0 0 0 16px}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-name{width:70%!important}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-count{width:calc(100% - 70% - 20px);text-align:right}#aside-content .card-categories .card-category-list>.parent i{float:right;margin-right:-.5em;padding:.5em;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}#aside-content .card-categories .card-category-list>.parent i.expand{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}#aside-content .card-webinfo .webinfo .webinfo-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:2px 10px 0}#aside-content .card-webinfo .webinfo .webinfo-item div:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-right:20px}@media screen and (min-width:901px){#aside-content #card-toc{right:0!important}}@media screen and (max-width:900px){#aside-content #card-toc{position:fixed;right:-100%;bottom:30px;z-index:100;max-width:380px;max-height:calc(100% - 60px);width:calc(100% - 80px);opacity:0;-webkit-transition:initial;-moz-transition:initial;-o-transition:initial;-ms-transition:initial;transition:initial;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-o-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}}#aside-content #card-toc .toc-percentage{float:right;margin-top:-9px;color:#a9a9a9;font-style:italic;font-size:140%}#aside-content #card-toc .toc-content{overflow-y:scroll;overflow-y:overlay;margin:0 -24px;max-height:calc(100vh - 120px)}@media screen and (max-width:900px){#aside-content #card-toc .toc-content{max-height:calc(100vh - 140px)}}#aside-content #card-toc .toc-content>*{margin:0 20px!important}#aside-content #card-toc .toc-content>*>.toc-item>.toc-child{margin-left:10px;padding-left:10px;border-left:1px solid var(--dark-grey)}#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:none}@media screen and (max-width:900px){#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:block!important}}#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child{display:block}#aside-content #card-toc .toc-content li,#aside-content #card-toc .toc-content ol{list-style:none}#aside-content #card-toc .toc-content>ol{padding:0!important}#aside-content #card-toc .toc-content ol{margin:0;padding-left:18px}#aside-content #card-toc .toc-content .toc-link{display:block;margin:4px 0;padding:1px 6px;color:var(--toc-link-color);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#aside-content #card-toc .toc-content .toc-link:hover{color:#31304d}#aside-content #card-toc .toc-content .toc-link.active{background:#31304d;color:#fff}#aside-content :only-child>.card-widget{margin-top:0}#aside-content .card-more-btn{float:right;color:inherit}#aside-content .card-more-btn:hover{-webkit-animation:more-btn-move 1s infinite;-moz-animation:more-btn-move 1s infinite;-o-animation:more-btn-move 1s infinite;-ms-animation:more-btn-move 1s infinite;animation:more-btn-move 1s infinite}#aside-content .card-announcement .item-headline i{color:red}.avatar-img{overflow:hidden;margin:0 auto;width:110px;height:110px;border-radius:70px}.avatar-img img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}.avatar-img img:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}@media screen and (min-width:900px){html.hide-aside .layout{-webkit-box-pack:center;-moz-box-pack:center;-o-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}html.hide-aside .layout>.aside-content{display:none}html.hide-aside .layout>div:first-child{width:80%}}.page .sticky_layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@-moz-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-webkit-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-o-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-moz-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}#post-comment .comment-head{margin-bottom:20px}#post-comment .comment-head .comment-headline{display:inline-block;vertical-align:middle;font-weight:700;font-size:1.43em}#post-comment .comment-head #comment-switch{display:inline-block;float:right;margin:2px auto 0;padding:4px 16px;width:max-content;border-radius:8px;background:#f6f8fa}#post-comment .comment-head #comment-switch .first-comment{color:#49b1f5}#post-comment .comment-head #comment-switch .second-comment{color:#ff7242}#post-comment .comment-head #comment-switch .switch-btn{position:relative;display:inline-block;margin:-4px 8px 0;width:42px;height:22px;border-radius:34px;background-color:#49b1f5;vertical-align:middle;cursor:pointer;-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-head #comment-switch .switch-btn:before{position:absolute;bottom:4px;left:4px;width:14px;height:14px;border-radius:50%;background-color:#fff;content:'';-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-head #comment-switch .switch-btn.move{background-color:#ff7242}#post-comment .comment-head #comment-switch .switch-btn.move:before{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-o-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}#post-comment .comment-wrap>div:nth-child(2){display:none}#footer{position:relative;background:#31304d;background-attachment:scroll;background-position:bottom;background-size:cover}#footer:before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.5);content:''}#footer-wrap{position:relative;padding:40px 20px;color:var(--light-grey);text-align:center}#footer-wrap a{color:var(--light-grey)}#footer-wrap a:hover{text-decoration:underline}#footer-wrap .footer-separator{margin:0 4px}#footer-wrap .icp-icon{padding:0 4px;max-height:1.4em;width:auto;vertical-align:text-bottom}#page-header{position:relative;width:100%;background-color:#31304d;background-position:center center;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header:not(.not-top-img):before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.3);content:''}#page-header.full_page{height:400px;background-attachment:fixed}#page-header.full_page #site-info{position:absolute;top:43%;padding:0 10px;width:100%}#page-header #scroll-down .scroll-down-effects,#page-header #site-subtitle,#page-header #site-title{text-align:center;text-shadow:2px 2px 4px rgba(0,0,0,.15);line-height:1.5}#page-header #site-title{margin:0;color:var(--white);font-size:1.85em}@media screen and (min-width:768px){#page-header #site-title{font-size:2.85em}}#page-header #site-subtitle{color:var(--light-grey);font-size:1.15em}@media screen and (min-width:768px){#page-header #site-subtitle{font-size:1.72em}}#page-header #site_social_icons{display:none;margin:0 auto;width:300px;text-align:center}@media screen and (max-width:768px){#page-header #site_social_icons{display:block}}#page-header #site_social_icons .social-icon{margin:0 10px;color:var(--light-grey);text-shadow:2px 2px 4px rgba(0,0,0,.15);font-size:1.43em}#page-header #scroll-down{position:absolute;bottom:0;width:100%;cursor:pointer}#page-header #scroll-down .scroll-down-effects{position:relative;width:100%;color:var(--light-grey);font-size:30px}#page-header.not-home-page{height:400px}@media screen and (max-width:768px){#page-header.not-home-page{height:280px}}#page-header #page-site-info{position:absolute;top:200px;padding:0 10px;width:100%}@media screen and (max-width:768px){#page-header #page-site-info{top:140px}}#page-header.post-bg{height:400px}@media screen and (max-width:768px){#page-header.post-bg{height:360px}}#page-header.post-bg:before{background-color:rgba(0,0,0,.5)}#page-header #post-info{position:absolute;bottom:100px;padding:0 8%;width:100%;text-align:center}@media screen and (max-width:900px){#page-header #post-info{bottom:30px;text-align:left}}@media screen and (max-width:768px){#page-header #post-info{bottom:22px;padding:0 22px}}#page-header.not-top-img{margin-bottom:10px;height:60px;background:0}#page-header.not-top-img #nav{background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}#page-header.not-top-img #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav{position:fixed;top:-60px;z-index:91;background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6);-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out,opacity .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out,opacity .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform .2s ease-in-out,opacity .2s ease-in-out}#page-header.nav-fixed #nav #site-name,#page-header.nav-fixed #nav #toggle-menu,#page-header.nav-fixed #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav #site-name:hover,#page-header.nav-fixed #nav #toggle-menu:hover,#page-header.nav-fixed #nav a:hover{color:#31304d}#page-header.nav-visible #nav{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}#page-header.nav-visible+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page h1.page-title{margin:8px 0 20px}#post>#post-info{margin-bottom:30px}#post>#post-info .post-title{padding-bottom:4px;border-bottom:1px solid var(--light-grey);color:var(--text-highlight-color)}#post>#post-info .post-title .post-edit-link{float:right}#post>#post-info #post-meta,#post>#post-info #post-meta a{color:#78818a}#post-info .post-title{margin-bottom:8px;color:var(--white);font-weight:400;font-size:2.5em;line-height:1.5;-webkit-line-clamp:3}@media screen and (max-width:768px){#post-info .post-title{font-size:2.1em}}#post-info .post-title .post-edit-link{padding-left:10px}#post-info #post-meta{color:var(--light-grey);font-size:95%}@media screen and (min-width:768px){#post-info #post-meta>.meta-secondline>span:first-child{display:none}}@media screen and (max-width:768px){#post-info #post-meta{font-size:90%}#post-info #post-meta>.meta-firstline,#post-info #post-meta>.meta-secondline{display:inline}}#post-info #post-meta .post-meta-separator{margin:0 5px}#post-info #post-meta .post-meta-icon{margin-right:4px}#post-info #post-meta .post-meta-label{margin-right:4px}#post-info #post-meta a{color:var(--light-grey);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#post-info #post-meta a:hover{color:#31304d;text-decoration:underline}#nav{position:absolute;top:0;z-index:90;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 36px;width:100%;height:60px;font-size:1.3em;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}@media screen and (max-width:768px){#nav{padding:0 16px}}#nav.show{opacity:1;-ms-filter:none;filter:none}#nav #blog_name{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#nav #toggle-menu{display:none;padding:2px 0 0 6px;vertical-align:top}#nav #toggle-menu:hover{color:var(--white)}#nav a{color:var(--light-grey)}#nav a:hover{color:var(--white)}#nav #site-name{text-shadow:2px 2px 4px rgba(0,0,0,.15);font-weight:700;cursor:pointer}#nav .menus_items{display:inline}#nav .menus_items .menus_item{position:relative;display:inline-block;padding:0 0 0 14px}#nav .menus_items .menus_item:hover .menus_item_child{display:block}#nav .menus_items .menus_item:hover>a>i:last-child{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#nav .menus_items .menus_item>a>i:last-child{padding:4px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#nav .menus_items .menus_item .menus_item_child{position:absolute;right:0;display:none;margin-top:8px;padding:0;width:max-content;background-color:var(--sidebar-bg);-webkit-box-shadow:0 5px 20px -4px rgba(0,0,0,.5);box-shadow:0 5px 20px -4px rgba(0,0,0,.5);-webkit-animation:sub_menus .3s .1s ease both;-moz-animation:sub_menus .3s .1s ease both;-o-animation:sub_menus .3s .1s ease both;-ms-animation:sub_menus .3s .1s ease both;animation:sub_menus .3s .1s ease both;border-radius:5px}#nav .menus_items .menus_item .menus_item_child:before{position:absolute;top:-8px;left:0;width:100%;height:20px;content:''}#nav .menus_items .menus_item .menus_item_child li{list-style:none}#nav .menus_items .menus_item .menus_item_child li:hover{background:var(--text-bg-hover)}#nav .menus_items .menus_item .menus_item_child li:first-child{border-radius:5px 5px 0 0}#nav .menus_items .menus_item .menus_item_child li:last-child{border-radius:0 0 5px 5px}#nav .menus_items .menus_item .menus_item_child li a{display:inline-block;padding:8px 16px;width:100%;color:var(--font-color)!important;text-shadow:none!important}#nav.hide-menu #toggle-menu{display:inline-block!important}#nav.hide-menu #toggle-menu .site-page{font-size:inherit}#nav.hide-menu .menus_items{display:none}#nav.hide-menu #search-button span{display:none}#nav #search-button{display:inline;padding:0 0 0 14px}#nav .site-page{position:relative;padding-bottom:6px;text-shadow:1px 1px 2px rgba(0,0,0,.3);font-size:.78em;cursor:pointer}#nav .site-page:not(.child):after{position:absolute;bottom:0;left:0;z-index:-1;width:0;height:3px;background-color:#5e5c94;content:'';-webkit-transition:all .3s ease-in-out;-moz-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;-ms-transition:all .3s ease-in-out;transition:all .3s ease-in-out}#nav .site-page:not(.child):hover:after{width:100%}#pagination .pagination{margin-top:20px;text-align:center}#pagination .page-number.current{background:#31304d;color:var(--white)}#pagination .pagination-info{position:absolute;top:50%;padding:20px 40px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#pagination .next_info,#pagination .prev_info{color:var(--white);font-weight:500}#pagination .next-post .pagination-info{text-align:right}#pagination .pull-full{width:100%!important}#pagination .next-post .label,#pagination .prev-post .label{color:var(--light-grey);text-transform:uppercase;font-size:90%}#pagination .next-post,#pagination .prev-post{width:50%}@media screen and (max-width:768px){#pagination .next-post,#pagination .prev-post{width:100%}}#pagination .next-post a,#pagination .prev-post a{position:relative;display:block;overflow:hidden;height:150px}#pagination.pagination-post{overflow:hidden;margin-top:40px;width:100%;background:#000}.layout>.recent-posts .pagination>*{display:inline-block;margin:0 6px;width:2.5em;height:2.5em;line-height:2.5em}.layout>.recent-posts .pagination>:not(.space):hover{background:var(--btn-hover-color);color:var(--btn-color)}.layout>div:not(.recent-posts) .pagination .page-number{display:inline-block;margin:0 4px;min-width:24px;height:24px;text-align:center;line-height:24px;cursor:pointer}#article-container{word-wrap:break-word;overflow-wrap:break-word}#article-container a{color:#596fb7}#article-container a:hover{text-decoration:underline}#article-container img{display:block;margin:0 auto 20px;max-width:100%;-webkit-transition:filter 375ms ease-in .2s;-moz-transition:filter 375ms ease-in .2s;-o-transition:filter 375ms ease-in .2s;-ms-transition:filter 375ms ease-in .2s;transition:filter 375ms ease-in .2s}#article-container p{margin:0 0 16px}#article-container iframe{margin:0 0 20px}#article-container kbd{margin:0 3px;padding:3px 5px;border:1px solid #b4b4b4;border-radius:3px;background-color:#f8f8f8;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;color:#34495e;white-space:nowrap;font-weight:600;font-size:.9em;font-family:Monaco,'Ubuntu Mono',monospace;line-height:1em}#article-container ol ol,#article-container ol ul,#article-container ul ol,#article-container ul ul{padding-left:20px}#article-container ol li,#article-container ul li{margin:4px 0}#article-container ol p,#article-container ul p{margin:0 0 8px}#article-container>:last-child{margin-bottom:0!important}#post .tag_share .post-meta__tag-list{display:inline-block}#post .tag_share .post-meta__tags{display:inline-block;margin:8px 8px 8px 0;padding:0 12px;width:fit-content;border:1px solid #31304d;border-radius:12px;color:#31304d;font-size:.85em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#post .tag_share .post-meta__tags:hover{background:#31304d;color:var(--white)}#post .tag_share .post_share{display:inline-block;float:right;margin:8px 0 20px;width:fit-content}#post .tag_share .post_share .social-share{font-size:.85em}#post .tag_share .post_share .social-share .social-share-icon{margin:0 4px;width:1.85em;height:1.85em;font-size:1.2em;line-height:1.85em}#post .post-copyright{position:relative;margin:40px 0 10px;padding:10px 16px;border:1px solid var(--light-grey);-webkit-transition:box-shadow .3s ease-in-out;-moz-transition:box-shadow .3s ease-in-out;-o-transition:box-shadow .3s ease-in-out;-ms-transition:box-shadow .3s ease-in-out;transition:box-shadow .3s ease-in-out}#post .post-copyright:before{position:absolute;top:2px;right:12px;color:#31304d;content:'\f1f9';font-size:1.3em}#post .post-copyright:hover{-webkit-box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5);box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5)}#post .post-copyright .post-copyright-meta{color:#31304d;font-weight:700}#post .post-copyright .post-copyright-info{padding-left:6px}#post .post-copyright .post-copyright-info a{text-decoration:underline;word-break:break-word}#post .post-copyright .post-copyright-info a:hover{text-decoration:none}#post .post-outdate-notice{position:relative;margin:0 0 20px;padding:.5em 1.2em;border-radius:3px;background-color:#ffe6e6;color:#f66;padding:.5em 1em .5em 2.6em;border-left:5px solid #ff8080}#post .post-outdate-notice:before{position:absolute;top:50%;left:.9em;color:#ff8080;content:'\f071';-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-o-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#post .ads-wrap{margin:40px 0}.relatedPosts{margin-top:40px}.relatedPosts>.headline{margin-bottom:5px;font-weight:700;font-size:1.43em}.relatedPosts>.relatedPosts-list>div{position:relative;display:inline-block;overflow:hidden;margin:3px;width:calc(33.333% - 6px);height:200px;background:#000;vertical-align:bottom}@media screen and (max-width:768px){.relatedPosts>.relatedPosts-list>div{margin:2px;width:calc(50% - 4px);height:150px}}@media screen and (max-width:600px){.relatedPosts>.relatedPosts-list>div{width:calc(100% - 4px)}}.relatedPosts>.relatedPosts-list .content{position:absolute;top:50%;padding:0 20px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.relatedPosts>.relatedPosts-list .content .date{color:var(--light-grey);font-size:90%}.relatedPosts>.relatedPosts-list .content .title{color:var(--white);-webkit-line-clamp:2}.post-reward{position:relative;margin-top:80px;width:100%;text-align:center;pointer-events:none}.post-reward>*{pointer-events:auto}.post-reward .reward-button{display:inline-block;padding:4px 24px;background:var(--btn-bg);color:var(--btn-color);cursor:pointer}.post-reward:hover .reward-button{background:var(--btn-hover-color)}.post-reward:hover>.reward-main{display:block}.post-reward .reward-main{position:absolute;bottom:40px;left:0;z-index:100;display:none;padding:0 0 15px;width:100%}.post-reward .reward-main .reward-all{display:inline-block;margin:0;padding:20px 10px;border-radius:4px;background:var(--reward-pop)}.post-reward .reward-main .reward-all:before{position:absolute;bottom:-10px;left:0;width:100%;height:20px;content:''}.post-reward .reward-main .reward-all:after{position:absolute;right:0;bottom:2px;left:0;margin:0 auto;width:0;height:0;border-top:13px solid var(--reward-pop);border-right:13px solid transparent;border-left:13px solid transparent;content:''}.post-reward .reward-main .reward-all .reward-item{display:inline-block;padding:0 8px;list-style-type:none;vertical-align:top}.post-reward .reward-main .reward-all .reward-item img{width:130px;height:130px}.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc{width:130px;color:#858585}#rightside{position:fixed;right:-48px;bottom:40px;z-index:100;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#rightside #rightside-config-hide{height:0;opacity:0;-webkit-transition:-webkit-transform .4s;-moz-transition:-moz-transform .4s;-o-transition:-o-transform .4s;-ms-transition:-ms-transform .4s;transition:transform .4s;-webkit-transform:translate(45px,0);-moz-transform:translate(45px,0);-o-transform:translate(45px,0);-ms-transform:translate(45px,0);transform:translate(45px,0)}#rightside #rightside-config-hide.show{height:auto;opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#rightside #rightside-config-hide.status{height:auto;opacity:1;-ms-filter:none;filter:none}#rightside>div>a,#rightside>div>button{display:block;margin-bottom:5px;width:35px;height:35px;border-radius:5px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;font-size:16px;line-height:35px}#rightside>div>a:hover,#rightside>div>button:hover{background-color:var(--btn-hover-color)}#rightside #mobile-toc-button{display:none}@media screen and (max-width:900px){#rightside #mobile-toc-button{display:block}}@media screen and (max-width:900px){#rightside #hide-aside-btn{display:none}}#sidebar #menu-mask{position:fixed;z-index:102;display:none;width:100%;height:100%;background:rgba(0,0,0,.8)}#sidebar #sidebar-menus{position:fixed;top:0;right:-300px;z-index:103;overflow-x:hidden;overflow-y:auto;width:300px;height:100%;background:var(--sidebar-bg);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#sidebar #sidebar-menus.open{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#sidebar #sidebar-menus>.avatar-img{margin:20px auto}#sidebar #sidebar-menus .site-data{display:table;padding:0 10px;width:100%;table-layout:fixed}#sidebar #sidebar-menus .site-data .data-item{display:table-cell}#sidebar #sidebar-menus .site-data .data-item .length-num{color:var(--text-highlight-color);font-size:1.28em}#sidebar #sidebar-menus .site-data .data-item .headline{color:var(--font-color)}#sidebar #sidebar-menus hr{margin:20px auto}#sidebar #sidebar-menus .menus_items{padding:0 10px 40px}#sidebar #sidebar-menus .menus_items .site-page{position:relative;display:block;padding:6px 30px 6px 22px;color:var(--font-color);font-size:1.15em}#sidebar #sidebar-menus .menus_items .site-page:hover{background:var(--text-bg-hover)}#sidebar #sidebar-menus .menus_items .site-page i:first-child{width:15%;text-align:left}#sidebar #sidebar-menus .menus_items .site-page.group>i:last-child{position:absolute;top:.78em;right:18px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#sidebar #sidebar-menus .menus_items .site-page.group.hide>i:last-child{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}#sidebar #sidebar-menus .menus_items .site-page.group.hide+.menus_item_child{display:none}#sidebar #sidebar-menus .menus_items .menus_item_child{margin:0;list-style:none}#vcomment{font-size:1.1em}#vcomment .vbtn{border:none;background:var(--btn-bg);color:var(--btn-color)}#vcomment .vbtn:hover{background:var(--btn-hover-color)}#vcomment .vimg{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#vcomment .vimg:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}#vcomment .vcards .vcard .vcontent.expand:after,#vcomment .vcards .vcard .vcontent.expand:before{z-index:22}#waline-wrap{--waline-font-size:1.1em;--waline-theme-color:#31304d;--waline-active-color:#b6bbc4}#waline-wrap .vuser{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#waline-wrap .vuser:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}.fireworks{position:fixed;top:0;left:0;z-index:9999;pointer-events:none}.medium-zoom-image--opened{z-index:99999!important;margin:0!important}.medium-zoom-overlay{z-index:99999!important}.mermaid-wrap{margin:0 0 20px;text-align:center}.mermaid-wrap>svg{height:100%}.fb-comments iframe,.utterances{width:100%!important}#gitalk-container .gt-meta{margin:0 0 .8em;padding:6px 0 16px}.katex-wrap{overflow:auto}.katex-wrap::-webkit-scrollbar{display:none}.has-jax,mjx-container[display]{overflow-x:auto;overflow-y:hidden}.aplayer{color:#4c4948}#article-container .aplayer{margin:0 0 20px}.snackbar-css{border-radius:5px!important}#article-container .btn-center{margin:0 0 20px;text-align:center}#article-container .btn-beautify{display:inline-block;margin:0 4px 6px;padding:0 15px;background-color:var(--btn-beautify-color,#777);color:#fff;line-height:2}#article-container .btn-beautify.blue{--btn-beautify-color:#428bca}#article-container .btn-beautify.pink{--btn-beautify-color:#ff69b4}#article-container .btn-beautify.red{--btn-beautify-color:#f00}#article-container .btn-beautify.purple{--btn-beautify-color:#6f42c1}#article-container .btn-beautify.orange{--btn-beautify-color:#ff8c00}#article-container .btn-beautify.green{--btn-beautify-color:#5cb85c}#article-container .btn-beautify:hover{background-color:var(--btn-hover-color)}#article-container .btn-beautify i+span{margin-left:6px}#article-container .btn-beautify:not(.block)+.btn-beautify:not(.block){margin:0 4px 20px}#article-container .btn-beautify.block{display:block;margin:0 0 20px;width:fit-content;width:-moz-fit-content}#article-container .btn-beautify.block.center{margin:0 auto 20px}#article-container .btn-beautify.block.right{margin:0 0 20px auto}#article-container .btn-beautify.larger{padding:6px 15px}#article-container .btn-beautify:hover{text-decoration:none}#article-container .btn-beautify.outline{border:1px solid transparent;border-color:var(--btn-beautify-color,#777);background-color:transparent;color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{background-color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{color:#fff!important}#article-container figure.gallery-group{position:relative;float:left;overflow:hidden;margin:6px 4px;width:calc(50% - 8px);height:250px;border-radius:8px;background:#000;-webkit-transform:translate3d(0,0,0)}@media screen and (max-width:600px){#article-container figure.gallery-group{width:calc(100% - 8px)}}#article-container figure.gallery-group:hover img{opacity:.4;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover .gallery-group-name::after{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover p{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group img{position:relative;margin:0;max-width:none;width:calc(100% + 20px);height:250px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;opacity:.8;-webkit-transition:all .3s,filter 375ms ease-in .2s;-moz-transition:all .3s,filter 375ms ease-in .2s;-o-transition:all .3s,filter 375ms ease-in .2s;-ms-transition:all .3s,filter 375ms ease-in .2s;transition:all .3s,filter 375ms ease-in .2s;-webkit-transform:translate3d(-10px,0,0);-moz-transform:translate3d(-10px,0,0);-o-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);object-fit:cover}#article-container figure.gallery-group figcaption{position:absolute;top:0;left:0;padding:30px;width:100%;height:100%;color:#fff;text-transform:uppercase;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}#article-container figure.gallery-group figcaption>a{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;opacity:0}#article-container figure.gallery-group p{margin:0;padding:8px 0 0;letter-spacing:1px;font-size:1.1em;line-height:1.5;opacity:0;-webkit-transition:opacity .35s,-webkit-transform .35s;-moz-transition:opacity .35s,-moz-transform .35s;-o-transition:opacity .35s,-o-transform .35s;-ms-transition:opacity .35s,-ms-transform .35s;transition:opacity .35s,transform .35s;-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);-o-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-line-clamp:4}#article-container figure.gallery-group .gallery-group-name{position:relative;margin:0;padding:8px 0;font-weight:700;font-size:1.65em;line-height:1.5;-webkit-line-clamp:2}#article-container figure.gallery-group .gallery-group-name:after{position:absolute;bottom:0;left:0;width:100%;height:2px;background:#fff;content:'';-webkit-transition:-webkit-transform .35s;-moz-transition:-moz-transform .35s;-o-transition:-o-transform .35s;-ms-transition:-ms-transform .35s;transition:transform .35s;-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#article-container .gallery-group-main{overflow:auto;padding:0 0 16px}#article-container .fj-gallery{margin:0 0 16px;opacity:0}#article-container .fj-gallery .img-alt{display:none}blockquote.pullquote{position:relative;max-width:45%;font-size:110%}blockquote.pullquote.left{float:left;margin:1em .5em 0 0}blockquote.pullquote.right{float:right;margin:1em 0 0 .5em}.video-container{position:relative;overflow:hidden;margin-bottom:16px;padding-top:56.25%;height:0}.video-container iframe{position:absolute;top:0;left:0;margin-top:0;width:100%;height:100%}.hide-block>.hide-button,.hide-inline>.hide-button{display:inline-block;padding:5px 18px;background:#31304d;color:var(--white)}.hide-block>.hide-button:hover,.hide-inline>.hide-button:hover{background-color:var(--btn-hover-color)}.hide-block>.hide-button.open,.hide-inline>.hide-button.open{display:none}.hide-block>.hide-button.open+div,.hide-inline>.hide-button.open+div{display:block}.hide-block>.hide-button.open+span,.hide-inline>.hide-button.open+span{display:inline}.hide-block>.hide-content,.hide-inline>.hide-content{display:none}.hide-inline>.hide-button{margin:0 6px}.hide-inline>.hide-content{margin:0 6px}.hide-block{margin:0 0 16px}.toggle{margin-bottom:20px;border:1px solid #f0f0f0}.toggle>.toggle-button{padding:6px 15px;background:#f0f0f0;color:#1f2d3d;cursor:pointer}.toggle>.toggle-content{margin:30px 24px}#article-container .inline-img{display:inline;margin:0 3px;height:1.1em;vertical-align:text-bottom}.hl-label{padding:2px 4px;border-radius:3px;color:#fff}.hl-label.default{background-color:#777}.hl-label.blue{background-color:#428bca}.hl-label.pink{background-color:#ff69b4}.hl-label.red{background-color:red}.hl-label.purple{background-color:#6f42c1}.hl-label.orange{background-color:#ff8c00}.hl-label.green{background-color:#5cb85c}.note{position:relative;margin:0 0 20px;padding:15px;border-radius:3px}.note.icon{padding-left:3em}.note>.note-icon{position:absolute;top:calc(50% - .5em);left:.8em;font-size:larger}.note.blue:not(.disabled){border-left-color:#428bca!important}.note.blue:not(.disabled).modern{border-left-color:transparent!important;color:#428bca}.note.blue:not(.disabled):not(.simple){background:#e3eef7!important}.note.blue>.note-icon{color:#428bca}.note.pink:not(.disabled){border-left-color:#ff69b4!important}.note.pink:not(.disabled).modern{border-left-color:transparent!important;color:#ff69b4}.note.pink:not(.disabled):not(.simple){background:#ffe9f4!important}.note.pink>.note-icon{color:#ff69b4}.note.red:not(.disabled){border-left-color:red!important}.note.red:not(.disabled).modern{border-left-color:transparent!important;color:red}.note.red:not(.disabled):not(.simple){background:#ffd9d9!important}.note.red>.note-icon{color:red}.note.purple:not(.disabled){border-left-color:#6f42c1!important}.note.purple:not(.disabled).modern{border-left-color:transparent!important;color:#6f42c1}.note.purple:not(.disabled):not(.simple){background:#e9e3f6!important}.note.purple>.note-icon{color:#6f42c1}.note.orange:not(.disabled){border-left-color:#ff8c00!important}.note.orange:not(.disabled).modern{border-left-color:transparent!important;color:#ff8c00}.note.orange:not(.disabled):not(.simple){background:#ffeed9!important}.note.orange>.note-icon{color:#ff8c00}.note.green:not(.disabled){border-left-color:#5cb85c!important}.note.green:not(.disabled).modern{border-left-color:transparent!important;color:#5cb85c}.note.green:not(.disabled):not(.simple){background:#e7f4e7!important}.note.green>.note-icon{color:#5cb85c}.note.simple{border:1px solid #eee;border-left-width:5px}.note.modern{border:1px solid transparent!important;background-color:#f5f5f5;color:#4c4948}.note.flat{border:initial;border-left:5px solid #eee;background-color:#f9f9f9;color:#4c4948}.note h2,.note h3,.note h4,.note h5,.note h6{margin-top:3px;margin-bottom:0;padding-top:0!important;border-bottom:initial}.note blockquote:first-child,.note img:first-child,.note ol:first-child,.note p:first-child,.note pre:first-child,.note table:first-child,.note ul:first-child{margin-top:0!important}.note blockquote:last-child,.note img:last-child,.note ol:last-child,.note p:last-child,.note pre:last-child,.note table:last-child,.note ul:last-child{margin-bottom:0!important}.note:not(.no-icon){padding-left:3em}.note:not(.no-icon)::before{position:absolute;top:calc(50% - .95em);left:.8em;font-size:larger}.note.default.flat{background:#f7f7f7}.note.default.modern{border-color:#e1e1e1;background:#f3f3f3;color:#666}.note.default.modern a:not(.btn){color:#666}.note.default.modern a:not(.btn):hover{color:#454545}.note.default:not(.modern){border-left-color:#777}.note.default:not(.modern) h2,.note.default:not(.modern) h3,.note.default:not(.modern) h4,.note.default:not(.modern) h5,.note.default:not(.modern) h6{color:#777}.note.default:not(.no-icon)::before{content:'\f0a9'}.note.default:not(.no-icon):not(.modern)::before{color:#777}.note.primary.flat{background:#f5f0fa}.note.primary.modern{border-color:#e1c2ff;background:#f3daff;color:#6f42c1}.note.primary.modern a:not(.btn){color:#6f42c1}.note.primary.modern a:not(.btn):hover{color:#453298}.note.primary:not(.modern){border-left-color:#6f42c1}.note.primary:not(.modern) h2,.note.primary:not(.modern) h3,.note.primary:not(.modern) h4,.note.primary:not(.modern) h5,.note.primary:not(.modern) h6{color:#6f42c1}.note.primary:not(.no-icon)::before{content:'\f055'}.note.primary:not(.no-icon):not(.modern)::before{color:#6f42c1}.note.info.flat{background:#eef7fa}.note.info.modern{border-color:#b3e5ef;background:#d9edf7;color:#31708f}.note.info.modern a:not(.btn){color:#31708f}.note.info.modern a:not(.btn):hover{color:#215761}.note.info:not(.modern){border-left-color:#428bca}.note.info:not(.modern) h2,.note.info:not(.modern) h3,.note.info:not(.modern) h4,.note.info:not(.modern) h5,.note.info:not(.modern) h6{color:#428bca}.note.info:not(.no-icon)::before{content:'\f05a'}.note.info:not(.no-icon):not(.modern)::before{color:#428bca}.note.success.flat{background:#eff8f0}.note.success.modern{border-color:#d0e6be;background:#dff0d8;color:#3c763d}.note.success.modern a:not(.btn){color:#3c763d}.note.success.modern a:not(.btn):hover{color:#32562c}.note.success:not(.modern){border-left-color:#5cb85c}.note.success:not(.modern) h2,.note.success:not(.modern) h3,.note.success:not(.modern) h4,.note.success:not(.modern) h5,.note.success:not(.modern) h6{color:#5cb85c}.note.success:not(.no-icon)::before{content:'\f058'}.note.success:not(.no-icon):not(.modern)::before{color:#5cb85c}.note.warning.flat{background:#fdf8ea}.note.warning.modern{border-color:#fae4cd;background:#fcf4e3;color:#8a6d3b}.note.warning.modern a:not(.btn){color:#8a6d3b}.note.warning.modern a:not(.btn):hover{color:#714f30}.note.warning:not(.modern){border-left-color:#f0ad4e}.note.warning:not(.modern) h2,.note.warning:not(.modern) h3,.note.warning:not(.modern) h4,.note.warning:not(.modern) h5,.note.warning:not(.modern) h6{color:#f0ad4e}.note.warning:not(.no-icon)::before{content:'\f06a'}.note.warning:not(.no-icon):not(.modern)::before{color:#f0ad4e}.note.danger.flat{background:#fcf1f2}.note.danger.modern{border-color:#ebcdd2;background:#f2dfdf;color:#a94442}.note.danger.modern a:not(.btn){color:#a94442}.note.danger.modern a:not(.btn):hover{color:#84333f}.note.danger:not(.modern){border-left-color:#d9534f}.note.danger:not(.modern) h2,.note.danger:not(.modern) h3,.note.danger:not(.modern) h4,.note.danger:not(.modern) h5,.note.danger:not(.modern) h6{color:#d9534f}.note.danger:not(.no-icon)::before{content:'\f056'}.note.danger:not(.no-icon):not(.modern)::before{color:#d9534f}#article-container .tabs{position:relative;margin:0 0 20px;border-right:1px solid var(--tab-border-color);border-bottom:1px solid var(--tab-border-color);border-left:1px solid var(--tab-border-color)}#article-container .tabs>.nav-tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-lines:multiple;-moz-box-lines:multiple;-o-box-lines:multiple;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;background:var(--tab-botton-bg)}#article-container .tabs>.nav-tabs>.tab{margin:0;padding:0;list-style:none}@media screen and (max-width:768px){#article-container .tabs>.nav-tabs>.tab{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;-ms-box-flex:1;box-flex:1;-webkit-flex-grow:1;flex-grow:1}}#article-container .tabs>.nav-tabs>.tab button{display:block;padding:8px 18px;width:100%;border-top:2px solid var(--tab-border-color);background:var(--tab-botton-bg);color:var(--tab-botton-color);line-height:2;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#article-container .tabs>.nav-tabs>.tab button i{width:1.5em}#article-container .tabs>.nav-tabs>.tab.active button{border-top:2px solid #31304d;background:var(--tab-button-active-bg);cursor:default}#article-container .tabs>.nav-tabs>.tab:not(.active) button:hover{border-top:2px solid var(--tab-button-hover-bg);background:var(--tab-button-hover-bg)}#article-container .tabs>.tab-contents .tab-item-content{position:relative;display:none;padding:36px 24px}@media screen and (max-width:768px){#article-container .tabs>.tab-contents .tab-item-content{padding:24px 14px}}#article-container .tabs>.tab-contents .tab-item-content.active{display:block;-webkit-animation:tabshow .5s;-moz-animation:tabshow .5s;-o-animation:tabshow .5s;-ms-animation:tabshow .5s;animation:tabshow .5s}#article-container .tabs .tab-to-top{position:relative;display:block;margin:0 0 0 auto;color:#99a9bf}@-moz-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}#article-container .timeline{margin:0 0 20px 10px;padding:14px 20px 5px;border-left:2px solid var(--timeline-color,#31304d)}#article-container .timeline.blue{--timeline-color:#428bca;--timeline-bg:rgba(66,139,202, 0.2)}#article-container .timeline.pink{--timeline-color:#ff69b4;--timeline-bg:rgba(255,105,180, 0.2)}#article-container .timeline.red{--timeline-color:#f00;--timeline-bg:rgba(255,0,0, 0.2)}#article-container .timeline.purple{--timeline-color:#6f42c1;--timeline-bg:rgba(111,66,193, 0.2)}#article-container .timeline.orange{--timeline-color:#ff8c00;--timeline-bg:rgba(255,140,0, 0.2)}#article-container .timeline.green{--timeline-color:#5cb85c;--timeline-bg:rgba(92,184,92, 0.2)}#article-container .timeline .timeline-item{margin:0 0 15px}#article-container .timeline .timeline-item:hover .item-circle:before{border-color:var(--timeline-color,#31304d)}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle>p{font-weight:600;font-size:1.2em}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before{left:-28px;border:4px solid var(--timeline-color,#31304d)}#article-container .timeline .timeline-item.headline:hover .item-circle:before{border-color:var(--pseudo-hover)}#article-container .timeline .timeline-item .timeline-item-title{position:relative}#article-container .timeline .timeline-item .item-circle:before{position:absolute;top:50%;left:-27px;width:6px;height:6px;border:3px solid var(--pseudo-hover);border-radius:50%;background:var(--card-bg);content:'';-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#article-container .timeline .timeline-item .item-circle>p{margin:0 0 8px;font-weight:500}#article-container .timeline .timeline-item .timeline-item-content{position:relative;padding:12px 15px;border-radius:8px;background:var(--timeline-bg,#dcdbe9);font-size:.93em}#article-container .timeline .timeline-item .timeline-item-content>:last-child{margin-bottom:0}#article-container .timeline+.timeline{margin-top:-20px}.search-dialog{position:fixed;top:100px;left:50%;z-index:1001;display:none;margin-left:-300px;padding:20px;width:600px;border-radius:8px;background:var(--search-bg)}@media screen and (max-width:768px){.search-dialog{top:0;left:0;margin:0;width:100%;height:100%;border-radius:0}}.search-dialog hr{margin:20px auto}.search-dialog .search-nav{margin:0 0 14px;color:#31304d;font-size:1.4em;line-height:1}.search-dialog .search-nav .search-dialog-title{margin-right:10px}.search-dialog .search-nav .search-close-button{float:right;color:#858585;-webkit-transition:color .2s ease-in-out;-moz-transition:color .2s ease-in-out;-o-transition:color .2s ease-in-out;-ms-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.search-dialog .search-nav .search-close-button:hover{color:#31304d}#search-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none;background:rgba(0,0,0,.6)}#local-search .search-dialog .local-search-box{margin:0 auto;max-width:100%;width:100%}#local-search .search-dialog .local-search-box input{padding:5px 14px;width:100%;outline:0;border:2px solid #31304d;border-radius:40px;background:var(--search-bg);color:var(--search-input-color);-webkit-appearance:none}#local-search .search-dialog .search-wrap{display:none}#local-search .search-dialog .local-search__hit-item{position:relative;padding-left:24px;line-height:1.7}#local-search .search-dialog .local-search__hit-item:hover:before{border-color:var(--pseudo-hover)}#local-search .search-dialog .local-search__hit-item:before{position:absolute;top:.45em;left:0;width:.5em;height:.5em;border:3px solid #31304d;border-radius:.5em;background:0 0;content:'';line-height:.5em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#local-search .search-dialog .local-search__hit-item a{display:block;color:var(--search-result-title);font-weight:600;cursor:pointer}#local-search .search-dialog .local-search__hit-item a:hover{color:#31304d}#local-search .search-dialog .local-search__hit-item .search-result{margin:0 0 8px;word-break:break-all}#local-search .search-dialog .local-search__hit-item .search-keyword{color:#f47466;font-weight:700}#local-search .search-dialog .search-result-list{overflow-y:auto;max-height:210px}@media screen and (max-width:768px){#local-search .search-dialog .search-result-list{padding-bottom:40px;max-height:75vh!important}} /* rebuild by neat */ \ No newline at end of file diff --git a/css/var.css b/css/var.css index f6a8e3e..16b7b43 100644 --- a/css/var.css +++ b/css/var.css @@ -1,3 +1,3 @@ -/* build time:Sat Apr 27 2024 01:20:31 GMT+0800 (Malaysia Time)*/ +/* build time:Sat Apr 27 2024 01:22:50 GMT+0800 (Malaysia Time)*/ /* rebuild by neat */ \ No newline at end of file diff --git a/gen-ai/index.html b/gen-ai/index.html index 9c5c93a..23c6842 100644 --- a/gen-ai/index.html +++ b/gen-ai/index.html @@ -1,4 +1,4 @@ -Generative AI & LLMs | Jinny's Blog

Generative AI & LLMs

This page contains my notes on learning Generative Artificial Intelligence & Large Language Models.

Learning Materials

Prerequisites: Basic understanding of machine learning concepts such as classification, regression, neural networks, loss functions, hyperparameters.


Introduction

Generative AI is a subset of traditional machine learning. The machine learning models underlying Generative AI have learn to create content that mimics human ability by finding statistical patterns in massive datasets of content that was originally generated by humans.

Traditional machine learning models require users to write computer code with formalized syntax to interact with libraries and APIs. In contrast, Large Language Models (LLMs) are able to take natural human language or written instructions to perform tasks, just like how a human would. The text that you pass to a LLM is known as a prompt, and the act of using the model to generate text is know as inference, the output text is known as completion.


Some examples of Large Language Models are:

  • GPT
  • BERT
  • LLaMa
  • FLANT-T5
  • BLOOM
  • PaLM
  • Jurassic

Large Language Models are used in a wide variety of situations, including:

  • Language translation (natural <-> natural / code <-> natural)
  • Information retrieval (ask the model to retrieve specific data from large dataset)
  • Text classification
  • Question & answering
  • Sentiment analysis

Topics

\ No newline at end of file + })(window)

Generative AI & LLMs

This page contains my notes on learning Generative Artificial Intelligence & Large Language Models.

Learning Materials

Prerequisites: Basic understanding of machine learning concepts such as classification, regression, neural networks, loss functions, hyperparameters.


Introduction

Generative AI is a subset of traditional machine learning. The machine learning models underlying Generative AI have learn to create content that mimics human ability by finding statistical patterns in massive datasets of content that was originally generated by humans.

Traditional machine learning models require users to write computer code with formalized syntax to interact with libraries and APIs. In contrast, Large Language Models (LLMs) are able to take natural human language or written instructions to perform tasks, just like how a human would. The text that you pass to a LLM is known as a prompt, and the act of using the model to generate text is know as inference, the output text is known as completion.


Some examples of Large Language Models are:

  • GPT
  • BERT
  • LLaMa
  • FLANT-T5
  • BLOOM
  • PaLM
  • Jurassic

Large Language Models are used in a wide variety of situations, including:

  • Language translation (natural <-> natural / code <-> natural)
  • Information retrieval (ask the model to retrieve specific data from large dataset)
  • Text classification
  • Question & answering
  • Sentiment analysis

Topics

\ No newline at end of file diff --git a/hexo-blog/index.html b/hexo-blog/index.html index 36c513d..ffa5d94 100644 --- a/hexo-blog/index.html +++ b/hexo-blog/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)

How To Build A Blog With Hexo

Introduction

Hexo is a fast and powerful Node.js blog framework. You can write blog posts in Markdown and Hexo will generate static HTML (along with CSS, JavaScript) files with a custom beautiful theme in seconds. You can then deploy these static files online with services like GitHub Pages, Vercel or Netlify.

Installation

Before installing Hexo, you should have Node.js and Git installed first.

In the terminal, enter the commands below to install Hexo

npm install -g hexo-cli

Then initialize a folder for your blog

hexo init <folder name> 

Enter the folder

cd <folder name>

Customization

The Hexo framework provides multiple blog themes that you can choose from to customize your blog. The theme that I have chosen is the Butterfly theme.

For more customization tips, please refer to the guide for your selected theme.
Link to Butterfly theme customization guide

Theme Installation

  1. In Hexo root file, install Butterfly theme:
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
  1. In _config.yml, change theme to butterfly.
theme: butterfly
  1. In Hexo root directory, create a new theme config file _config.butterfly.yml. Then install pug and stylus
npm install hexo-renderer-pug hexo-renderer-stylus --save

Custom Fonts

The fonts that I use for my blog is PT Serif and Noto Serif SC by Google Fonts.

  1. In _config.butterfly.yml, change the global font settings
font:
global-font-size: 17px
code-font-size: 16px
font-family: PT Serif, Noto Serif SC
code-font-family: consolas
  1. Embed the font as follow in _config.butterfly.yml
inject:
head:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=PT+Serif&display=swap" rel="stylesheet">

KaTex Support

KaTex is a JavaScript library that displays mathematical notation in web browsers.

  1. Enable KaTex in blog post metadata
---
title: 'Post title'
date: 2023-1-1 00:00:00
categories: "Test"
description: A test
cover:
tags:
katex: true
---
  1. Uninstall previous Hexo markdown rendered and install other plugins.
npm un hexo-renderer-marked --save # Uninstall this if you have it
npm un hexo-renderer-kramed --save # Uninstall this if you have it

npm i hexo-math --save
npm i hexo-renderer-markdown-it-plus --save # Install this renderer plugin
npm install katex @renbaoshuo/markdown-it-katex # Install this katex plugin
  1. Add the code given below at the bottom of configuration file _config.yml.
math:
engine: katex
katex:
css: https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css
js: https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js
config:
# KaTeX config
throwOnError: false
errorColor: "#cc0000"


markdown:
plugins:
- '@renbaoshuo/markdown-it-katex'

Writing A New Post

To write a new blog post, insert a new Markdown file (for example: blog_post_name.md) into the source/_posts directory. Then, insert .yaml metadata at the top of your Markdown post.

---
title: 'Post title'
date: 2023-1-1 00:00:00
categories: "test"
description: A test
cover:
tags:
toc_number: true
katex: true
---



# Heading 1
Some text here for your blog post.

If you’re unfamiliar with Markdown syntax, you can refer to this guide.


Deployment

Deploy and preview on a local server

Install plugins and run server

npm install hexo-server --save
hexo server

Your blog should start running locally at http://localhost:4000/

Deploy to GitHub and Vercel

Create a GitHub repository for your blog.

Then, install Hexo plugins:

npm install hexo-deployer-git --save

In _config.yml configure the deploy settings

deploy:
type:git
repo: <repository link>
branch: main

Run commands to clean database, generate new static HTML files from your Markdown files, and then deploy them to GitHub.

hexo clean
hexo generate
hexo deploy

Finally, create a new Vercel project from your blog’s GitHub repository.

Your blog should start running online now at Vercel’s given link https://<project_name>.vercel.app.

If any issues occur while deploying, you can refer to some of these articles below:

git config --global http.version HTTP/1.1
git config --global --unset http.proxy
git config --global --unset https.proxy

SEO

SEO stands for search engine optimization, which is improving your website to increase its chances of ranking higher in Google or other search engines.

sitemap.xml

Sitemaps are files where you provide information about the pages, videos, and other files on your site, and the relationships between them. Search engines read this file to crawl your site more efficiently.

Install this Hexo plugin to automatically generate sitemaps for your blog

npm install hexo-generator-sitemap --save

In _config.yml file, change the permalink

permalink: :title/

and also add this piece of code

sitemap:
path: sitemap.xml

robots.txt

A robots.txt file tells search engine crawlers which URLs the crawler can access on your site.

Under your /source folder, create your own robots.txt file and then copy the code below into it

User-agent: *
Allow: /
Allow: /archives/
Allow: /categories/
Allow: /tags/
Allow: /about/

Disallow: /vendors/
Disallow: /js/
Disallow: /css/
Disallow: /fonts/
Disallow: /vendors/
Disallow: /fancybox/

Sitemap: https://blog.jinny.work/sitemap.xml

Code compression

Minimizing or compressing your code can make your website load faster.

Install this Hexo plugin to automatically make your code neat

npm install hexo-neat --save

In your _config.yml file, add these settings

neat_enable: true
neat_html:
enable: true
exclude:
neat_css:
enable: true
exclude:
- '**/*.min.css'
neat_js:
enable: true
mangle: true
output:
compress:
exclude:
- '**/*.min.js'
- '**/index.js'

Adding A Search Function

Install Hexo plugin

npm install hexo-generator-search --save

In _config.yml, add these settings:

search:
path: search.xml
field: post
format: html
limit: 10000

Then enable local search in _config.butterfly.yml

local_search:
enable: true
preload: false
Author: Jinny
Link: https://blog.jinny.work/hexo-blog/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file + })(window)

How To Build A Blog With Hexo

Introduction

Hexo is a fast and powerful Node.js blog framework. You can write blog posts in Markdown and Hexo will generate static HTML (along with CSS, JavaScript) files with a custom beautiful theme in seconds. You can then deploy these static files online with services like GitHub Pages, Vercel or Netlify.

Installation

Before installing Hexo, you should have Node.js and Git installed first.

In the terminal, enter the commands below to install Hexo

npm install -g hexo-cli

Then initialize a folder for your blog

hexo init <folder name> 

Enter the folder

cd <folder name>

Customization

The Hexo framework provides multiple blog themes that you can choose from to customize your blog. The theme that I have chosen is the Butterfly theme.

For more customization tips, please refer to the guide for your selected theme.
Link to Butterfly theme customization guide

Theme Installation

  1. In Hexo root file, install Butterfly theme:
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
  1. In _config.yml, change theme to butterfly.
theme: butterfly
  1. In Hexo root directory, create a new theme config file _config.butterfly.yml. Then install pug and stylus
npm install hexo-renderer-pug hexo-renderer-stylus --save

Custom Fonts

The fonts that I use for my blog is PT Serif and Noto Serif SC by Google Fonts.

  1. In _config.butterfly.yml, change the global font settings
font:
global-font-size: 17px
code-font-size: 16px
font-family: PT Serif, Noto Serif SC
code-font-family: consolas
  1. Embed the font as follow in _config.butterfly.yml
inject:
head:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=PT+Serif&display=swap" rel="stylesheet">

KaTex Support

KaTex is a JavaScript library that displays mathematical notation in web browsers.

  1. Enable KaTex in blog post metadata
---
title: 'Post title'
date: 2023-1-1 00:00:00
categories: "Test"
description: A test
cover:
tags:
katex: true
---
  1. Uninstall previous Hexo markdown rendered and install other plugins.
npm un hexo-renderer-marked --save # Uninstall this if you have it
npm un hexo-renderer-kramed --save # Uninstall this if you have it

npm i hexo-math --save
npm i hexo-renderer-markdown-it-plus --save # Install this renderer plugin
npm install katex @renbaoshuo/markdown-it-katex # Install this katex plugin
  1. Add the code given below at the bottom of configuration file _config.yml.
math:
engine: katex
katex:
css: https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css
js: https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js
config:
# KaTeX config
throwOnError: false
errorColor: "#cc0000"


markdown:
plugins:
- '@renbaoshuo/markdown-it-katex'

Writing A New Post

To write a new blog post, insert a new Markdown file (for example: blog_post_name.md) into the source/_posts directory. Then, insert .yaml metadata at the top of your Markdown post.

---
title: 'Post title'
date: 2023-1-1 00:00:00
categories: "test"
description: A test
cover:
tags:
toc_number: true
katex: true
---



# Heading 1
Some text here for your blog post.

If you’re unfamiliar with Markdown syntax, you can refer to this guide.


Deployment

Deploy and preview on a local server

Install plugins and run server

npm install hexo-server --save
hexo server

Your blog should start running locally at http://localhost:4000/

Deploy to GitHub and Vercel

Create a GitHub repository for your blog.

Then, install Hexo plugins:

npm install hexo-deployer-git --save

In _config.yml configure the deploy settings

deploy:
type:git
repo: <repository link>
branch: main

Run commands to clean database, generate new static HTML files from your Markdown files, and then deploy them to GitHub.

hexo clean
hexo generate
hexo deploy

Finally, create a new Vercel project from your blog’s GitHub repository.

Your blog should start running online now at Vercel’s given link https://<project_name>.vercel.app.

If any issues occur while deploying, you can refer to some of these articles below:

git config --global http.version HTTP/1.1
git config --global --unset http.proxy
git config --global --unset https.proxy

SEO

SEO stands for search engine optimization, which is improving your website to increase its chances of ranking higher in Google or other search engines.

sitemap.xml

Sitemaps are files where you provide information about the pages, videos, and other files on your site, and the relationships between them. Search engines read this file to crawl your site more efficiently.

Install this Hexo plugin to automatically generate sitemaps for your blog

npm install hexo-generator-sitemap --save

In _config.yml file, change the permalink

permalink: :title/

and also add this piece of code

sitemap:
path: sitemap.xml

robots.txt

A robots.txt file tells search engine crawlers which URLs the crawler can access on your site.

Under your /source folder, create your own robots.txt file and then copy the code below into it

User-agent: *
Allow: /
Allow: /archives/
Allow: /categories/
Allow: /tags/
Allow: /about/

Disallow: /vendors/
Disallow: /js/
Disallow: /css/
Disallow: /fonts/
Disallow: /vendors/
Disallow: /fancybox/

Sitemap: https://blog.jinny.work/sitemap.xml

Code compression

Minimizing or compressing your code can make your website load faster.

Install this Hexo plugin to automatically make your code neat

npm install hexo-neat --save

In your _config.yml file, add these settings

neat_enable: true
neat_html:
enable: true
exclude:
neat_css:
enable: true
exclude:
- '**/*.min.css'
neat_js:
enable: true
mangle: true
output:
compress:
exclude:
- '**/*.min.js'
- '**/index.js'

Adding A Search Function

Install Hexo plugin

npm install hexo-generator-search --save

In _config.yml, add these settings:

search:
path: search.xml
field: post
format: html
limit: 10000

Then enable local search in _config.butterfly.yml

local_search:
enable: true
preload: false
Author: Jinny
Link: https://blog.jinny.work/hexo-blog/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/index.html b/index.html index f499c3a..4141fca 100644 --- a/index.html +++ b/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/quant-skills/index.html b/quant-skills/index.html index a6e4f93..c7167ed 100644 --- a/quant-skills/index.html +++ b/quant-skills/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)

Skills To Become A Quant

Background

As of September 2023, I am a third year computer science student at Fudan University. After trying out backend developer roles, I found out that I wasn’t particularly interested in them, and at the moment there isn’t much chances of becoming a frontend developer due to the recent tech job freeze.
So I’ve decided to explore some of the quantitative finance roles.

A quant (quantitative trading analyst) is someone who:

  • analyzes financial data to identify trends and patterns
  • develops and implements mathematical models to help forecast financial markets and identify investment opportunities
  • designs risk management strategies and makes investment decisions

I’ve always been interested in investing and trading, and this job seems like a great way to use my programming skills in finance, so I’ve decided to try it out.

List of Skills

Quantitative trading requires knowledge in multiple complicated subjects, like: math, finance, statistics, programming and etc. Therefore, there is still a lot to learn before I apply to any internship or full-time roles. Below is a list of skills to learn, and I’ll be sharing the specific resources I’ve used.

Programming

Machine Learning, Deep Learning & Data Science

Math & Statistics

Finance


So, this list pretty much sums up what I’m planning to learn / currently learning, and I might update it in the future as I make more progress.

Author: Jinny
Link: https://blog.jinny.work/quant-skills/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file + })(window)

Skills To Become A Quant

Background

As of September 2023, I am a third year computer science student at Fudan University. After trying out backend developer roles, I found out that I wasn’t particularly interested in them, and at the moment there isn’t much chances of becoming a frontend developer due to the recent tech job freeze.
So I’ve decided to explore some of the quantitative finance roles.

A quant (quantitative trading analyst) is someone who:

  • analyzes financial data to identify trends and patterns
  • develops and implements mathematical models to help forecast financial markets and identify investment opportunities
  • designs risk management strategies and makes investment decisions

I’ve always been interested in investing and trading, and this job seems like a great way to use my programming skills in finance, so I’ve decided to try it out.

List of Skills

Quantitative trading requires knowledge in multiple complicated subjects, like: math, finance, statistics, programming and etc. Therefore, there is still a lot to learn before I apply to any internship or full-time roles. Below is a list of skills to learn, and I’ll be sharing the specific resources I’ve used.

Programming

Machine Learning, Deep Learning & Data Science

Math & Statistics

Finance


So, this list pretty much sums up what I’m planning to learn / currently learning, and I might update it in the future as I make more progress.

Author: Jinny
Link: https://blog.jinny.work/quant-skills/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/randomized-algorithms/index.html b/randomized-algorithms/index.html index e24f978..1f751a6 100644 --- a/randomized-algorithms/index.html +++ b/randomized-algorithms/index.html @@ -93,7 +93,7 @@ } } detectApple() - })(window)

Randomized Algorithms

This note is part of my learning notes on Data Structures & Algorithms.


Introduction

Randomized Algorithms are algorithms that solves a problem step-by-step by making random choices, from a finite set of possible steps. We call an algorithm randomized if its behavior is determined not only by its input but also by values produced by a random number generator (r1,...,Rr \in {1,...,R}). Hence, a randomized algorithm may produce different outputs when applied more than one times to the same input.

We use randomized algorithms because they can help speed up a decision algorithm, resulting in shorter running time (reduced time complexity).

Randomized algorithms can be designed either as a Las Vegas algorithm or a Monte Carlo algorithm. A Las Vegas algorithm is weaker than a Monte Carlo algorithm, so we often design a Monte Carlo algorithm first.

  • Monte Carlo algorithm: may produce incorrect results with a certain probability, but it will stop after a fixed amount of time or after a certain number of iterations. A common example is the Karger-Stein’s algorithm.
    • output is a random variable
    • running time is bounded by something deterministic
  • Las Vegas algorithm: keep running the algorithm until it produces the correct result, but the running time may vary. A common example is the randomized quicksort algorithm.
    • output is deterministic
    • running time is a random variable

Indicator Random Variable

An indicator random variable is a function that assigns a real value to an outcome in the sample space of a random experiment. It provides a convenient method for converting between probabilities and expectations. Suppose we are given a sample space SS and an event AA. Then the indicator random variable I{A}I\{A\} associated with event AA is defined as:

I{A}={1,if A occurs0,if A does not occurI\{A\} = \begin{cases} 1, \text{if A occurs}\\ 0, \text{if A does not occur} \end{cases}


High Probability Bounds

In randomized algorithms, high probability bounds refer to probabilistic guarantees on the performance or behavior of the algorithm. Specifically, these bounds indicate that the algorithm will achieve certain outcomes with high probability, meaning that the probability of failure is very low.

For example, if an algorithm has a high probability bound of 1δ1 - \delta, it means that the algorithm will produce the correct result or behave as expected with probability at least 1δ1 - \delta where δ\delta is a small constant typically representing the probability of failure.

Markov’s Inequality

Markov’s inequality provides a loose upper-bound on the probability that a non-negative random variable is greater than or equal to a positive constant. It is useful for providing a quick and simple estimate of the upper bound on the probability that a random variable deviates from its expected value. This is particularly useful in algorithms where the exact distribution of the variable is unknown but its expectation is known.

Theorem: for any non-negative random variable XX and all positive constant δ>0\delta > 0:

P(Xδ)E[X]δ,for X0,δ>0P(X \geq \delta) \leq \frac{E[X]}{\delta}, \text{for } X \geq 0, \delta >0

where:

  • P(Xδ)P(X \geq \delta) is the probability that the random variable XX is greater than or equal to δ\delta.
  • E[X]E[X] is the expected value (mean) of the random variable XX.
  • δ\delta is the threshold (XX is at least δ\delta).

Chebyshev’s Inequality

Chebyshev’s inequality is an extension of Markov’s Inequality. It provides an upper bound on the probability and helps quantify how much a random variable can deviate from its mean, which is critical in algorithms where high reliability or consistency is required despite the presence of randomness.

Theorem: for any random variable XX with finite mean μ\mu and finite non-zero variance σ2\sigma^2, and for any positive constant kk:

P(Xμδ)Var[X]δ2P(|X - \mu| \geq \delta) \leq \frac{Var[X]}{\delta^2}

where:

  • P(Xμδ)P(|X-\mu| \geq \delta) is the probability that the absolute deviation of the random variable XX from its mean μ\mu is greater than or equal to kk times the standard deviation σ\sigma.
  • μ=E(X)\mu = E(X) is the mean (expected value) of the random variable XX.
  • Var[X]=σ2Var[X] = \sigma^2 is the variance of the random variable XX.

Chernoff Bounds

Chernoff Bounds are particularly useful in settings where an algorithm needs to ensure that the probability of an undesirable outcome (e.g., large deviation from the mean) is extremely low.

Given a sequence of independent random variables X1X_1, X2X_2, ......, XnX_n with 0Xi10 \leq X_i \leq 1 and their sum S=X1+X2+...+XnS = X_1 + X_2 + ... + X_n, the Chernoff bounds give upper bounds on the probability that SS deviates significantly from its expected value E[S]E[S].

There are several forms of Chernoff bounds, but one common form is the following:

P(S(1+δ)E[S])eδ2E[S]3P(S \geq (1 + \delta)E[S]) \leq e^{-\frac{\delta^2E[S]}{3}}

P(S(1δ)E[S])eδ2E[S]2P(S \leq (1 - \delta)E[S]) \leq e^{-\frac{\delta^2E[S]}{2}}

Comparison between Markov, Chebyshev, and Chernoff Bounds:

The bound given by Markov is the “weakest” one. It is constant and does not change as n increases. The bound given by Chebyshev’s inequality is “stronger” than the one given by Markov’s inequality. The strongest bound is the Chernoff bound. It goes to zero exponentially fast.

Binomial Distribution

The binomial distribution is the discrete probability distribution which shows the number of success in a sequence of nn independent Bernoulli trials (each with two possible outcomes, and with the same probability of success pp).

Probability mass function:

f(k;n,p)=Pr[X=k]=(kn)pk(1p)nk,0kn\begin{aligned} f(k;n,p) &= Pr[X=k] \\ &= (^n_k) p^k (1-p)^{n-k}, 0 \leq k \leq n \\ \end{aligned}

Cumulative distribution function:

F(k;n,p)=Pr[Xk]=i=0k(in)pi(1p)ni,0kn\begin{aligned} F(k;n,p) &= Pr[X \leq k] \\ \displaystyle &= \sum^k_{i=0} (^n_i) p^i (1-p)^{n-i}, 0 \leq k \leq n \end{aligned}

Normal Distribution

Normal distribution is also known as the Gaussian distribution. It describes data that tends to cluster around a mean. Many random processes tend towards a normal distribution as the number of trials increases (Central Limit Theorem).

When μ=E[X]=np\mu = E[X]=np and σ2=Var[X]=np(1p)\sigma^2 = Var[X]=np(1-p) are large enough, the binomial distribution can be approximated with a normal distribution.

nn: number of trials
pp: probability of success in each trial

Normal distribution with mean μ\mu and variance σ2\sigma^2 is:

f(x;μ,σ2)=1σ2πe12(xμσ)2,xRf(x;\mu,\sigma^2) = \frac{1}{\sigma \sqrt{2\pi}} e^{- \frac{1}{2}(\frac{x-\mu}{\sigma})^2}, x \in R

Randomized Algorithms

This note is part of my learning notes on Data Structures & Algorithms.


Introduction

Randomized Algorithms are algorithms that solves a problem step-by-step by making random choices, from a finite set of possible steps. We call an algorithm randomized if its behavior is determined not only by its input but also by values produced by a random number generator (r1,...,Rr \in {1,...,R}). Hence, a randomized algorithm may produce different outputs when applied more than one times to the same input.

We use randomized algorithms because they can help speed up a decision algorithm, resulting in shorter running time (reduced time complexity).

Randomized algorithms can be designed either as a Las Vegas algorithm or a Monte Carlo algorithm. A Las Vegas algorithm is weaker than a Monte Carlo algorithm, so we often design a Monte Carlo algorithm first.

  • Monte Carlo algorithm: may produce incorrect results with a certain probability, but it will stop after a fixed amount of time or after a certain number of iterations. A common example is the Karger-Stein’s algorithm.
    • output is a random variable
    • running time is bounded by something deterministic
  • Las Vegas algorithm: keep running the algorithm until it produces the correct result, but the running time may vary. A common example is the randomized quicksort algorithm.
    • output is deterministic
    • running time is a random variable

Indicator Random Variable

An indicator random variable is a function that assigns a real value to an outcome in the sample space of a random experiment. It provides a convenient method for converting between probabilities and expectations. Suppose we are given a sample space SS and an event AA. Then the indicator random variable I{A}I\{A\} associated with event AA is defined as:

I{A}={1,if A occurs0,if A does not occurI\{A\} = \begin{cases} 1, \text{if A occurs}\\ 0, \text{if A does not occur} \end{cases}


High Probability Bounds

In randomized algorithms, high probability bounds refer to probabilistic guarantees on the performance or behavior of the algorithm. Specifically, these bounds indicate that the algorithm will achieve certain outcomes with high probability, meaning that the probability of failure is very low.

For example, if an algorithm has a high probability bound of 1δ1 - \delta, it means that the algorithm will produce the correct result or behave as expected with probability at least 1δ1 - \delta where δ\delta is a small constant typically representing the probability of failure.

Markov’s Inequality

Markov’s inequality provides a loose upper-bound on the probability that a non-negative random variable is greater than or equal to a positive constant. It is useful for providing a quick and simple estimate of the upper bound on the probability that a random variable deviates from its expected value. This is particularly useful in algorithms where the exact distribution of the variable is unknown but its expectation is known.

Theorem: for any non-negative random variable XX and all positive constant δ>0\delta > 0:

P(Xδ)E[X]δ,for X0,δ>0P(X \geq \delta) \leq \frac{E[X]}{\delta}, \text{for } X \geq 0, \delta >0

where:

  • P(Xδ)P(X \geq \delta) is the probability that the random variable XX is greater than or equal to δ\delta.
  • E[X]E[X] is the expected value (mean) of the random variable XX.
  • δ\delta is the threshold (XX is at least δ\delta).

Chebyshev’s Inequality

Chebyshev’s inequality is an extension of Markov’s Inequality. It provides an upper bound on the probability and helps quantify how much a random variable can deviate from its mean, which is critical in algorithms where high reliability or consistency is required despite the presence of randomness.

Theorem: for any random variable XX with finite mean μ\mu and finite non-zero variance σ2\sigma^2, and for any positive constant kk:

P(Xμδ)Var[X]δ2P(|X - \mu| \geq \delta) \leq \frac{Var[X]}{\delta^2}

where:

  • P(Xμδ)P(|X-\mu| \geq \delta) is the probability that the absolute deviation of the random variable XX from its mean μ\mu is greater than or equal to kk times the standard deviation σ\sigma.
  • μ=E(X)\mu = E(X) is the mean (expected value) of the random variable XX.
  • Var[X]=σ2Var[X] = \sigma^2 is the variance of the random variable XX.

Chernoff Bounds

Chernoff Bounds are particularly useful in settings where an algorithm needs to ensure that the probability of an undesirable outcome (e.g., large deviation from the mean) is extremely low.

Given a sequence of independent random variables X1X_1, X2X_2, ......, XnX_n with 0Xi10 \leq X_i \leq 1 and their sum S=X1+X2+...+XnS = X_1 + X_2 + ... + X_n, the Chernoff bounds give upper bounds on the probability that SS deviates significantly from its expected value E[S]E[S].

There are several forms of Chernoff bounds, but one common form is the following:

P(S(1+δ)E[S])eδ2E[S]3P(S \geq (1 + \delta)E[S]) \leq e^{-\frac{\delta^2E[S]}{3}}

P(S(1δ)E[S])eδ2E[S]2P(S \leq (1 - \delta)E[S]) \leq e^{-\frac{\delta^2E[S]}{2}}

Comparison between Markov, Chebyshev, and Chernoff Bounds:

The bound given by Markov is the “weakest” one. It is constant and does not change as n increases. The bound given by Chebyshev’s inequality is “stronger” than the one given by Markov’s inequality. The strongest bound is the Chernoff bound. It goes to zero exponentially fast.

Binomial Distribution

The binomial distribution is the discrete probability distribution which shows the number of success in a sequence of nn independent Bernoulli trials (each with two possible outcomes, and with the same probability of success pp).

Probability mass function:

f(k;n,p)=Pr[X=k]=(kn)pk(1p)nk,0kn\begin{aligned} f(k;n,p) &= Pr[X=k] \\ &= (^n_k) p^k (1-p)^{n-k}, 0 \leq k \leq n \\ \end{aligned}

Cumulative distribution function:

F(k;n,p)=Pr[Xk]=i=0k(in)pi(1p)ni,0kn\begin{aligned} F(k;n,p) &= Pr[X \leq k] \\ \displaystyle &= \sum^k_{i=0} (^n_i) p^i (1-p)^{n-i}, 0 \leq k \leq n \end{aligned}

Normal Distribution

Normal distribution is also known as the Gaussian distribution. It describes data that tends to cluster around a mean. Many random processes tend towards a normal distribution as the number of trials increases (Central Limit Theorem).

When μ=E[X]=np\mu = E[X]=np and σ2=Var[X]=np(1p)\sigma^2 = Var[X]=np(1-p) are large enough, the binomial distribution can be approximated with a normal distribution.

nn: number of trials
pp: probability of success in each trial

Normal distribution with mean μ\mu and variance σ2\sigma^2 is:

f(x;μ,σ2)=1σ2πe12(xμσ)2,xRf(x;\mu,\sigma^2) = \frac{1}{\sigma \sqrt{2\pi}} e^{- \frac{1}{2}(\frac{x-\mu}{\sigma})^2}, x \in R

Poisson Distribution

Poisson distribution describes the probability of a given number of events happening in a fixed interval of time or space, under the assumption that these events happen with a known constant mean rate and independently of the time since the last event.

In the analysis of randomized algorithms, particularly those involving random sampling, the number of iterations or trials until a certain event occurs can often be modeled using a Poisson distribution (especially for Monte Carlo methods).

If nn is huge and pp is very small, the binomial distribution can be approximated by a Poisson distribution with μ=np\mu = np

Poisson distribution with mean μ>0\mu > 0 is:

f(k;μ)=μkeμk!,k=0,1,2,...f(k;\mu) = \frac{\mu^ke^{-\mu}}{k!}, k=0,1,2,...


Example: Coupon Collector

Suppose there is a lucky draw, in which you can get different types of coupons. Each time you collect a coupon, it’s chosen uniformly at random from the available types. The goal is to determine the expected number of draws to get a full collection of all coupons.

Algorithm:

  1. Initialize an empty set to keep track of the types of coupons collected.
  2. Repeat the following steps until all types of coupons are collected:
    a. Choose a coupon uniformly at random from the available types.
    b. If the chosen coupon is not already in the set, add it to the set.
  3. Count the total number of coupons collected until all types are collected.

Analysis:
Let XX be the number of draws to get a full collection, XiX_i is the number of coupons collected at stage ii.

X=i=0n1XiX = \sum^{n-1}_{i=0} X_i

E[Xi]=nniE[X_i] = \frac{n}{n-i}

E[X]=i=0n1E[Xi]=i=0n1(nni)=nj=1n1j=nlogn+O(n)\begin{aligned} E[X] &= \sum^{n-1}_{i=0} E[X_i] \\ &= \sum^{n-1}_{i=0} \left( \frac{n}{n-i} \right) \\ &= n \sum^n_{j=1} \frac{1}{j} \\ &= nlogn + O(n) \end{aligned}

Example: Randomized Quicksort

Quicksort is a popular algorithm used to sort numbers, it works by first choosing a pivot element, then sorting the numbers arohnd that particular pivot. A randomized quicksort is designed to decrease the chances of the quicksort algorithm being executed in the worst case time complexity of O(n2)O(n^2).

The running time of a randomized quicksort is independent of the input order. No assumptions need to be made about the input distribution. The worst case is determined only be the output of a random-number generator.

Algorithm:

  1. Randomly select a number xx to be the pivot
  2. Divided the remaining numbers into two groups:
    • those smaller than xx
    • those larger than xx
  3. Sort each group recursively, and concatenate them.

Analysis:
We analyze the number of comparisons needed to fully sort all the numbers.

Let T(n)T(n) be the random variable for the running time of randomized quicksort on an input size of nn, where random numbers are independent.

For i=0,1,...,n1i=0,1,...,n-1, the indicator random variable is as follows:

Xi={1,If partition generates ak:nk1split0,otherwiseX_i = \begin{cases} 1, \text{If partition generates a} k:n-k-1 \text{split} \\ 0, \text{otherwise} \end{cases}

Since all splits are likely equal, assuming elements are distinct, then:

E[Xi]=Pr[Xi=1]=1nE[X_i] = Pr[X_i = 1] = \frac{1}{n}

T(n)=O(nlogn)T(n) = O(nlogn)

Randomized Quicksort always outperform deterministic algorithms like heap sort and merge sort.

Example: Karger-Stein’s Algorithm

Karger-Stein’s algorithm is used to find minimum cuts in graphs, by iteratively contracting randomly chosen edges until only two edges remain.

Given a connected graph G=V(E)G=V(E) which is undirected, unweighted, and has V=n|V|=n number of vertices, E=m|E|=m number of edges. We need to compute the smallest set of edges that will make GG disconnected.

A cut in a graph is a partition of the vertices into two non-empty parts. An edge crosses the cut if it goes from one side of the cut to the other. A minimum cut is a cut that has the fewest possible edges crossing it.

Algorithm:

  1. Pick a random edge
  2. Contract the chosen edge (merge the two endpoints together)
  3. Repeat steps 1 and 2, until there are only two vertices left
  4. Return the cut that corresponds to those two vertices

Theorem: the probability that Karger-Stein’s algorithm returns a minimum cut in a graph with nn vertices is at least 2n(n1)\frac{2}{n(n-1)}.

Example: Polynomial Identity Testing

Given a polynomial P(x1,x2,x3)=x32(x1+x2)(x1x2)+(x12+(1+x2)(1x2))x32x32(x1+x2)(x1x2)P(x_1,x_2,x_3) = x_3^2(x_1+x_2)(x_1-x_2) + \left( x_1^2+(1+x_2)(1-x_2)\right)x_3^2 - x_3^2(x_1 + x_2)(x_1 - x_2), we want to find out if this polynomial is equivalent to 0.

In fundamental theorem of algebra: a nn-variable polynomial with dd degreees has at most dd roots.

Analysis:
For P(x1,x2,...,xn)P(x_1,x_2,...,x_n) which has sample space SS,

  1. Choose nn number of random values r1,r2,...,rnr_1, r_2, ... , r_n independently and uniformly from SS.
  2. Eval(P(r1,r2,...,rn)P(r_1,r_2,...,r_n))

{if eval=0, outputP0else, output P0\begin{cases} \text{if eval=0, output} P \equiv 0 \\ \text{else, output } P \neq 0 \end{cases}

When nn is true, P(x1,x2,...,xn)=x1kQ(x2,...,xn)+T(x1,x2,...,xn)P(x_1,x_2,...,x_n) = x_1^k \cdot Q(x_2,...,x_n) + T(x_1,x_2,...,x_n), the degree(x1)<k(x_1) < k

(x1,x2,...,xn)=(r1,r2,...,rn)(x_1,x_2,...,x_n) = (r_1, r_2, ..., r_n)

The possibility that QQ is equal to zero:

Pr[Q=0]dkSPr[Q=0] \leq \frac{d-k}{|S|}

The possibility that QQ isn not equal to zero:

Pr[Q0]1dkSPr[Q \neq 0] \geq 1 - \frac{d-k}{|S|}

The possibility of TT is not zero when QQ is zero:

Pr[T0Q=0]=Pr[T(x1,x2,...,xn)kS]Pr[T \neq 0 | Q=0 ] = Pr\left[T(x_1,x_2,...,x_n) \leq \frac{k}{|S|} \right]


References

Author: Jinny
Link: https://blog.jinny.work/randomized-algorithms/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file +M834 80h400000v40h-400000z"/>1e21(σxμ)2,xR

Poisson Distribution

Poisson distribution describes the probability of a given number of events happening in a fixed interval of time or space, under the assumption that these events happen with a known constant mean rate and independently of the time since the last event.

In the analysis of randomized algorithms, particularly those involving random sampling, the number of iterations or trials until a certain event occurs can often be modeled using a Poisson distribution (especially for Monte Carlo methods).

If nn is huge and pp is very small, the binomial distribution can be approximated by a Poisson distribution with μ=np\mu = np

Poisson distribution with mean μ>0\mu > 0 is:

f(k;μ)=μkeμk!,k=0,1,2,...f(k;\mu) = \frac{\mu^ke^{-\mu}}{k!}, k=0,1,2,...


Example: Coupon Collector

Suppose there is a lucky draw, in which you can get different types of coupons. Each time you collect a coupon, it’s chosen uniformly at random from the available types. The goal is to determine the expected number of draws to get a full collection of all coupons.

Algorithm:

  1. Initialize an empty set to keep track of the types of coupons collected.
  2. Repeat the following steps until all types of coupons are collected:
    a. Choose a coupon uniformly at random from the available types.
    b. If the chosen coupon is not already in the set, add it to the set.
  3. Count the total number of coupons collected until all types are collected.

Analysis:
Let XX be the number of draws to get a full collection, XiX_i is the number of coupons collected at stage ii.

X=i=0n1XiX = \sum^{n-1}_{i=0} X_i

E[Xi]=nniE[X_i] = \frac{n}{n-i}

E[X]=i=0n1E[Xi]=i=0n1(nni)=nj=1n1j=nlogn+O(n)\begin{aligned} E[X] &= \sum^{n-1}_{i=0} E[X_i] \\ &= \sum^{n-1}_{i=0} \left( \frac{n}{n-i} \right) \\ &= n \sum^n_{j=1} \frac{1}{j} \\ &= nlogn + O(n) \end{aligned}

Example: Randomized Quicksort

Quicksort is a popular algorithm used to sort numbers, it works by first choosing a pivot element, then sorting the numbers arohnd that particular pivot. A randomized quicksort is designed to decrease the chances of the quicksort algorithm being executed in the worst case time complexity of O(n2)O(n^2).

The running time of a randomized quicksort is independent of the input order. No assumptions need to be made about the input distribution. The worst case is determined only be the output of a random-number generator.

Algorithm:

  1. Randomly select a number xx to be the pivot
  2. Divided the remaining numbers into two groups:
    • those smaller than xx
    • those larger than xx
  3. Sort each group recursively, and concatenate them.

Analysis:
We analyze the number of comparisons needed to fully sort all the numbers.

Let T(n)T(n) be the random variable for the running time of randomized quicksort on an input size of nn, where random numbers are independent.

For i=0,1,...,n1i=0,1,...,n-1, the indicator random variable is as follows:

Xi={1,If partition generates ak:nk1split0,otherwiseX_i = \begin{cases} 1, \text{If partition generates a} k:n-k-1 \text{split} \\ 0, \text{otherwise} \end{cases}

Since all splits are likely equal, assuming elements are distinct, then:

E[Xi]=Pr[Xi=1]=1nE[X_i] = Pr[X_i = 1] = \frac{1}{n}

T(n)=O(nlogn)T(n) = O(nlogn)

Randomized Quicksort always outperform deterministic algorithms like heap sort and merge sort.

Example: Karger-Stein’s Algorithm

Karger-Stein’s algorithm is used to find minimum cuts in graphs, by iteratively contracting randomly chosen edges until only two edges remain.

Given a connected graph G=V(E)G=V(E) which is undirected, unweighted, and has V=n|V|=n number of vertices, E=m|E|=m number of edges. We need to compute the smallest set of edges that will make GG disconnected.

A cut in a graph is a partition of the vertices into two non-empty parts. An edge crosses the cut if it goes from one side of the cut to the other. A minimum cut is a cut that has the fewest possible edges crossing it.

Algorithm:

  1. Pick a random edge
  2. Contract the chosen edge (merge the two endpoints together)
  3. Repeat steps 1 and 2, until there are only two vertices left
  4. Return the cut that corresponds to those two vertices

Theorem: the probability that Karger-Stein’s algorithm returns a minimum cut in a graph with nn vertices is at least 2n(n1)\frac{2}{n(n-1)}.

Example: Polynomial Identity Testing

Given a polynomial P(x1,x2,x3)=x32(x1+x2)(x1x2)+(x12+(1+x2)(1x2))x32x32(x1+x2)(x1x2)P(x_1,x_2,x_3) = x_3^2(x_1+x_2)(x_1-x_2) + \left( x_1^2+(1+x_2)(1-x_2)\right)x_3^2 - x_3^2(x_1 + x_2)(x_1 - x_2), we want to find out if this polynomial is equivalent to 0.

In fundamental theorem of algebra: a nn-variable polynomial with dd degreees has at most dd roots.

Analysis:
For P(x1,x2,...,xn)P(x_1,x_2,...,x_n) which has sample space SS,

  1. Choose nn number of random values r1,r2,...,rnr_1, r_2, ... , r_n independently and uniformly from SS.
  2. Eval(P(r1,r2,...,rn)P(r_1,r_2,...,r_n))

{if eval=0, outputP0else, output P0\begin{cases} \text{if eval=0, output} P \equiv 0 \\ \text{else, output } P \neq 0 \end{cases}

When nn is true, P(x1,x2,...,xn)=x1kQ(x2,...,xn)+T(x1,x2,...,xn)P(x_1,x_2,...,x_n) = x_1^k \cdot Q(x_2,...,x_n) + T(x_1,x_2,...,x_n), the degree(x1)<k(x_1) < k

(x1,x2,...,xn)=(r1,r2,...,rn)(x_1,x_2,...,x_n) = (r_1, r_2, ..., r_n)

The possibility that QQ is equal to zero:

Pr[Q=0]dkSPr[Q=0] \leq \frac{d-k}{|S|}

The possibility that QQ isn not equal to zero:

Pr[Q0]1dkSPr[Q \neq 0] \geq 1 - \frac{d-k}{|S|}

The possibility of TT is not zero when QQ is zero:

Pr[T0Q=0]=Pr[T(x1,x2,...,xn)kS]Pr[T \neq 0 | Q=0 ] = Pr\left[T(x_1,x_2,...,x_n) \leq \frac{k}{|S|} \right]


References

Author: Jinny
Link: https://blog.jinny.work/randomized-algorithms/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 56055cd..df7f417 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -119,14 +119,14 @@ - https://blog.jinny.work/tags/Work/ + https://blog.jinny.work/tags/Technical/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/tags/Technical/ + https://blog.jinny.work/tags/Competitions/ 2024-04-26 weekly 0.2 @@ -140,35 +140,35 @@ - https://blog.jinny.work/tags/Interviews/ + https://blog.jinny.work/tags/DSA/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/tags/Quant/ + https://blog.jinny.work/tags/Work/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/tags/Others/ + https://blog.jinny.work/tags/Interviews/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/tags/Competitions/ + https://blog.jinny.work/tags/Others/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/tags/DSA/ + https://blog.jinny.work/tags/Quant/ 2024-04-26 weekly 0.2 @@ -177,42 +177,42 @@ - https://blog.jinny.work/categories/Work/ + https://blog.jinny.work/categories/Technical/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/categories/Notes/ + https://blog.jinny.work/categories/Competitions/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/categories/Quant/ + https://blog.jinny.work/categories/Notes/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/categories/Others/ + https://blog.jinny.work/categories/Work/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/categories/Competitions/ + https://blog.jinny.work/categories/Others/ 2024-04-26 weekly 0.2 - https://blog.jinny.work/categories/Technical/ + https://blog.jinny.work/categories/Quant/ 2024-04-26 weekly 0.2 diff --git a/tags/Competitions/index.html b/tags/Competitions/index.html index 31d5816..e3f9290 100644 --- a/tags/Competitions/index.html +++ b/tags/Competitions/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/DSA/index.html b/tags/DSA/index.html index e7c4cf1..ff53969 100644 --- a/tags/DSA/index.html +++ b/tags/DSA/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Interviews/index.html b/tags/Interviews/index.html index a196160..e5ba572 100644 --- a/tags/Interviews/index.html +++ b/tags/Interviews/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Notes/index.html b/tags/Notes/index.html index 9b8b2a3..2c57142 100644 --- a/tags/Notes/index.html +++ b/tags/Notes/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Others/index.html b/tags/Others/index.html index 04383d9..349ac1d 100644 --- a/tags/Others/index.html +++ b/tags/Others/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Quant/index.html b/tags/Quant/index.html index 43c7d0c..a95d7dc 100644 --- a/tags/Quant/index.html +++ b/tags/Quant/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Technical/index.html b/tags/Technical/index.html index 920bef5..58498fb 100644 --- a/tags/Technical/index.html +++ b/tags/Technical/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/Work/index.html b/tags/Work/index.html index 88fc85a..3aa55bd 100644 --- a/tags/Work/index.html +++ b/tags/Work/index.html @@ -34,7 +34,7 @@ isPhotoFigcaption: true, islazyload: false, isAnchor: false -}
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 3f2abf9..bac6c0b 100644 --- a/tags/index.html +++ b/tags/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)
\ No newline at end of file + })(window)
\ No newline at end of file diff --git a/whatson-mypc/index.html b/whatson-mypc/index.html index 1dca5f2..a7b2ba8 100644 --- a/whatson-mypc/index.html +++ b/whatson-mypc/index.html @@ -93,4 +93,4 @@ } } detectApple() - })(window)

What's On My Laptop

Writing this because I switch between devices often, so I really need to keep track of the tools I use.


Productivity

  • Notion
  • Obsidian
  • Google Calendar

Surfing the Web

  • Chrome
  • Tor Browser
  • Clash
  • uTorrent

Programming & Work

  • MarkText
  • Visual Studio Code + Dracula theme
  • GitHub Desktop
  • Windows Subsystem for Linux (WSL)
  • VirtualBox + Ubuntu
  • matlab
  • PowerBI
  • Trader Workstation
  • Microsoft Office / WPS Suite
  • Drawboard PDF
  • Inkscape
  • Xmind

Photography, Music & Art

  • Adobe Suite (for Lightroom, Photoshop & etc.)
  • Davinci Resolve
  • Autodesk Maya
  • Blender
  • MuseScore
  • Cakewalk by Bandlab

Fun & Nice to Have

  • Spotify
  • Steam (I absolutely love Apex Legends)
  • Epic Games

Customization

  • Custom Cursor
  • TranslucentTB
  • Rainmeter

Other Useful Stuff

  • Bitwarden Password Manager
  • 7-Zip
  • ScreenToGIF
  • Open Broadcaster Software (OBS)
  • Voicemeeter
  • Audacity
  • Zotero
  • Huorong
  • WeChat
  • Discord
  • Wallpaper by Milad Fakurian
Author: Jinny
Link: https://blog.jinny.work/whatson-mypc/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file + })(window)

What's On My Laptop

Writing this because I switch between devices often, so I really need to keep track of the tools I use.


Productivity

  • Notion
  • Obsidian
  • Google Calendar

Surfing the Web

  • Chrome
  • Tor Browser
  • Clash
  • uTorrent

Programming & Work

  • MarkText
  • Visual Studio Code + Dracula theme
  • GitHub Desktop
  • Windows Subsystem for Linux (WSL)
  • VirtualBox + Ubuntu
  • matlab
  • PowerBI
  • Trader Workstation
  • Microsoft Office / WPS Suite
  • Drawboard PDF
  • Inkscape
  • Xmind

Photography, Music & Art

  • Adobe Suite (for Lightroom, Photoshop & etc.)
  • Davinci Resolve
  • Autodesk Maya
  • Blender
  • MuseScore
  • Cakewalk by Bandlab

Fun & Nice to Have

  • Spotify
  • Steam (I absolutely love Apex Legends)
  • Epic Games

Customization

  • Custom Cursor
  • TranslucentTB
  • Rainmeter

Other Useful Stuff

  • Bitwarden Password Manager
  • 7-Zip
  • ScreenToGIF
  • Open Broadcaster Software (OBS)
  • Voicemeeter
  • Audacity
  • Zotero
  • Huorong
  • WeChat
  • Discord
  • Wallpaper by Milad Fakurian
Author: Jinny
Link: https://blog.jinny.work/whatson-mypc/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file