Ubuntu supports the ability to upgrade from one LTS to the next LTS in sequential order. For instance, a user on Ubuntu 16.04 LTS can upgrade to Ubuntu 18.04 LTS, but cannot jump directly to Ubuntu 20.04 LTS. To do this, the user would need to upgrade twice from Ubuntu 16.04 to Ubuntu 20.04.
For a complete list of releases and current supporting status see the Ubuntu Wiki Releases page.
Check the release notes for the new release for any known issues or important changes.
sudo apt update
sudo apt upgrade
sudo reboot
Users should check that there is sufficient free disk space for the upgrade. Systems with additional software installed may require a few gigabytes of disk space.
The upgrade process takes time to complete, be patient.
Third-party software repositories and PPAs are disabled during the upgrade. However, any software installed from these repositories is not removed or downgraded. Software installed from these repositories is the single most common cause of upgrade issues.
It is recommended to upgrade the system using the do-release-upgrade
command on server edition and cloud images. This command can handle system configuration changes that are sometimes needed between releases.
To check for any available new versions to which you can upgrade, run the following command:
do-release-upgrade-c
This will check Ubuntu’s servers for any available updates and informs you which version of Ubuntu you’ll be upgrading to.
To begin this process, run the following command:
sudo do-release-upgrade
Upgrading to a development release of Ubuntu is available using the -d
flag:
sudo do-release-upgrade-d
Here, the emojis are enabled with the OpenMoji Jekyll Plugin. Also a cheat sheet list for available emojis in GitHub flavoured Markdown documents using free JoyPixels icons is presented.
Add jekyll-openmoji
plugin in your site’s Gemfile
, and run bundle install
.
gem 'jekyll-openmoji'
Then add jekyll-openmoji
to the plugins
section in the _config.yml
file.
plugins:-jekyll-openmoji
With this plugin, Jekyll will turn Markdown emoji alias into images, e.g.:
I give this post two :clap:!
Code above would be parsed as:
I give this post two :clap:!
By default, the emoji images are served from https://cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin
with OpenMoji icons.
It’s also flexible to change to other emoji sources, just customise it in the _config.yml
file. Here I’m going to use JoyPixels icons:
# Where things areemoji:src:"https://cdn.honglin.eu.org"asset:"/emojis/joypixels"extension:"png"img_attrs:class:"emoji"height:"25"width:"25"
This results in emoji image URLs like https://cdn.honglin.eu.org/emojis/joypixels/1f604.png
. Be careful that the URLs are case-sensitive, this plugin only parsed the emoji unicodes in lower-case.
Detailed explains of these configurations available at OpenMoji Jekyll Plugin.
This plugin is also compatible with other emoji packages such as GitHub emojis or Twemoji. For example, if you want to switch to GitHub emojis, just change the src
and asset
fields to:
emoji:src:"https://github.githubassets.com"asset:"/images/icons/emoji/unicode"
OpenMoji and Twemoji are free with
svg
supports.Try OpenMoji
svg
icons with:emoji:src:"https://cdn.honglin.eu.org"asset:"/emojis/openmoji"extension:"svg"img_attrs:class:"emoji"height:"25"width:"25"
The following Emoji list are subdivided according the Full Emoji List from unicode.org, which borrowed from the emoji-cheat-sheet.
Some of the emojis are not parsed by the plugin, so the original code is showing in the emoji
column in the table…
emoji | code | emoji | code |
---|---|---|---|
:grinning: | :grinning: | :smiley: | :smiley: |
:smile: | :smile: | :grin: | :grin: |
:laughing: | :laughing: :satisfied: | :sweat_smile: | :sweat_smile: |
:rofl: | :rofl: | :joy: | :joy: |
:slightly_smiling_face: | :slightly_smiling_face: | :upside_down_face: | :upside_down_face: |
:wink: | :wink: | :blush: | :blush: |
:innocent: | :innocent: |
emoji | code | emoji | code |
---|---|---|---|
:smiling_face_with_three_hearts: | :smiling_face_with_three_hearts: | :heart_eyes: | :heart_eyes: |
:star_struck: | :star_struck: | :kissing_heart: | :kissing_heart: |
:kissing: | :kissing: | :relaxed: | :relaxed: |
:kissing_closed_eyes: | :kissing_closed_eyes: | :kissing_smiling_eyes: | :kissing_smiling_eyes: |
:smiling_face_with_tear: | :smiling_face_with_tear: |
emoji | code | emoji | code |
---|---|---|---|
:yum: | :yum: | :stuck_out_tongue: | :stuck_out_tongue: |
:stuck_out_tongue_winking_eye: | :stuck_out_tongue_winking_eye: | :money_mouth_face: | :money_mouth_face: |
:stuck_out_tongue_closed_eyes: | :stuck_out_tongue_closed_eyes: | :zany_face: | :zany_face: |
emoji | code | emoji | code |
---|---|---|---|
:hugs: | :hugs: | :hand_over_mouth: | :hand_over_mouth: |
:shushing_face: | :shushing_face: | :thinking: | :thinking: |
emoji | code | emoji | code |
---|---|---|---|
:zipper_mouth_face: | :zipper_mouth_face: | :raised_eyebrow: | :raised_eyebrow: |
:neutral_face: | :neutral_face: | :expressionless: | :expressionless: |
:no_mouth: | :no_mouth: | :face_in_clouds: | :face_in_clouds: |
:smirk: | :smirk: | :unamused: | :unamused: |
:roll_eyes: | :roll_eyes: | :grimacing: | :grimacing: |
:face_exhaling: | :face_exhaling: | :lying_face: | :lying_face: |
emoji | code | emoji | code |
---|---|---|---|
:relieved: | :relieved: | :pensive: | :pensive: |
:sleepy: | :sleepy: | :drooling_face: | :drooling_face: |
:sleeping: | :sleeping: |
emoji | code | emoji | code |
---|---|---|---|
:mask: | :mask: | :face_with_thermometer: | :face_with_thermometer: |
:face_with_head_bandage: | :face_with_head_bandage: | :nauseated_face: | :nauseated_face: |
:vomiting_face: | :vomiting_face: | :sneezing_face: | :sneezing_face: |
:hot_face: | :hot_face: | :cold_face: | :cold_face: |
:woozy_face: | :woozy_face: | :dizzy_face: | :dizzy_face: |
:face_with_spiral_eyes: | :face_with_spiral_eyes: | :exploding_head: | :exploding_head: |
emoji | code | emoji | code |
---|---|---|---|
:cowboy_hat_face: | :cowboy_hat_face: | :partying_face: | :partying_face: |
:disguised_face: | :disguised_face: |
emoji | code | emoji | code |
---|---|---|---|
:sunglasses: | :sunglasses: | :nerd_face: | :nerd_face: |
:monocle_face: | :monocle_face: |
emoji | code | emoji | code |
---|---|---|---|
:confused: | :confused: | :worried: | :worried: |
:slightly_frowning_face: | :slightly_frowning_face: | :frowning_face: | :frowning_face: |
:open_mouth: | :open_mouth: | :hushed: | :hushed: |
:astonished: | :astonished: | :flushed: | :flushed: |
:pleading_face: | :pleading_face: | :frowning: | :frowning: |
:anguished: | :anguished: | :fearful: | :fearful: |
:cold_sweat: | :cold_sweat: | :disappointed_relieved: | :disappointed_relieved: |
:cry: | :cry: | :sob: | :sob: |
:scream: | :scream: | :confounded: | :confounded: |
:persevere: | :persevere: | :disappointed: | :disappointed: |
:sweat: | :sweat: | :weary: | :weary: |
:tired_face: | :tired_face: | :yawning_face: | :yawning_face: |
emoji | code | emoji | code |
---|---|---|---|
:triumph: | :triumph: | :pout: | :pout: :rage: |
:angry: | :angry: | :cursing_face: | :cursing_face: |
:smiling_imp: | :smiling_imp: | :imp: | :imp: |
:skull: | :skull: | :skull_and_crossbones: | :skull_and_crossbones: |
emoji | code | emoji | code |
---|---|---|---|
:hankey: | :hankey: :poop: :shit: | :clown_face: | :clown_face: |
:japanese_ogre: | :japanese_ogre: | :japanese_goblin: | :japanese_goblin: |
:ghost: | :ghost: | :alien: | :alien: |
:space_invader: | :space_invader: | :robot: | :robot: |
emoji | code | emoji | code |
---|---|---|---|
:smiley_cat: | :smiley_cat: | :smile_cat: | :smile_cat: |
:joy_cat: | :joy_cat: | :heart_eyes_cat: | :heart_eyes_cat: |
:smirk_cat: | :smirk_cat: | :kissing_cat: | :kissing_cat: |
:scream_cat: | :scream_cat: | :crying_cat_face: | :crying_cat_face: |
:pouting_cat: | :pouting_cat: |
emoji | code | emoji | code |
---|---|---|---|
:see_no_evil: | :see_no_evil: | :hear_no_evil: | :hear_no_evil: |
:speak_no_evil: | :speak_no_evil: |
emoji | code | emoji | code |
---|---|---|---|
:kiss: | :kiss: | :love_letter: | :love_letter: |
:cupid: | :cupid: | :gift_heart: | :gift_heart: |
:sparkling_heart: | :sparkling_heart: | :heartpulse: | :heartpulse: |
:heartbeat: | :heartbeat: | :revolving_hearts: | :revolving_hearts: |
:two_hearts: | :two_hearts: | :heart_decoration: | :heart_decoration: |
:heavy_heart_exclamation: | :heavy_heart_exclamation: | :broken_heart: | :broken_heart: |
:heart_on_fire: | :heart_on_fire: | :mending_heart: | :mending_heart: |
:heart: | :heart: | :orange_heart: | :orange_heart: |
:yellow_heart: | :yellow_heart: | :green_heart: | :green_heart: |
:blue_heart: | :blue_heart: | :purple_heart: | :purple_heart: |
:brown_heart: | :brown_heart: | :black_heart: | :black_heart: |
:white_heart: | :white_heart: | :100: | :100: |
:anger: | :anger: | :boom: | :boom: :collision: |
:dizzy: | :dizzy: | :sweat_drops: | :sweat_drops: |
:dash: | :dash: | :hole: | :hole: |
:bomb: | :bomb: | :speech_balloon: | :speech_balloon: |
:eye_speech_bubble: | :eye_speech_bubble: | :left_speech_bubble: | :left_speech_bubble: |
:right_anger_bubble: | :right_anger_bubble: | :thought_balloon: | :thought_balloon: |
:zzz: | :zzz: |
emoji | code | emoji | code |
---|---|---|---|
:wave: | :wave: | :raised_back_of_hand: | :raised_back_of_hand: |
:raised_hand_with_fingers_splayed: | :raised_hand_with_fingers_splayed: | :hand: | :hand: :raised_hand: |
:vulcan_salute: | :vulcan_salute: |
emoji | code | emoji | code |
---|---|---|---|
:ok_hand: | :ok_hand: | :pinched_fingers: | :pinched_fingers: |
:pinching_hand: | :pinching_hand: | :v: | :v: |
:crossed_fingers: | :crossed_fingers: | :love_you_gesture: | :love_you_gesture: |
:metal: | :metal: | :call_me_hand: | :call_me_hand: |
emoji | code | emoji | code |
---|---|---|---|
:point_left: | :point_left: | :point_right: | :point_right: |
:point_up_2: | :point_up_2: | :fu: | :fu: :middle_finger: |
:point_down: | :point_down: | :point_up: | :point_up: |
emoji | code | emoji | code |
---|---|---|---|
:+1: | :+1: :thumbsup: | :-1: | :-1: :thumbsdown: |
:fist: | :fist: :fist_raised: | :facepunch: | :facepunch: :fist_oncoming: :punch: |
:fist_left: | :fist_left: | :fist_right: | :fist_right: |
emoji | code | emoji | code |
---|---|---|---|
:clap: | :clap: | :raised_hands: | :raised_hands: |
:open_hands: | :open_hands: | :palms_up_together: | :palms_up_together: |
:handshake: | :handshake: | :pray: | :pray: |
emoji | code | emoji | code |
---|---|---|---|
:writing_hand: | :writing_hand: | :nail_care: | :nail_care: |
:selfie: | :selfie: |
emoji | code | emoji | code |
---|---|---|---|
:muscle: | :muscle: | :mechanical_arm: | :mechanical_arm: |
:mechanical_leg: | :mechanical_leg: | :leg: | :leg: |
:foot: | :foot: | :ear: | :ear: |
:ear_with_hearing_aid: | :ear_with_hearing_aid: | :nose: | :nose: |
:brain: | :brain: | :anatomical_heart: | :anatomical_heart: |
:lungs: | :lungs: | :tooth: | :tooth: |
:bone: | :bone: | :eyes: | :eyes: |
:eye: | :eye: | :tongue: | :tongue: |
:lips: | :lips: |
emoji | code | emoji | code |
---|---|---|---|
:baby: | :baby: | :child: | :child: |
:boy: | :boy: | :girl: | :girl: |
:adult: | :adult: | :blond_haired_person: | :blond_haired_person: |
:man: | :man: | :bearded_person: | :bearded_person: |
:man_beard: | :man_beard: | :woman_beard: | :woman_beard: |
:red_haired_man: | :red_haired_man: | :curly_haired_man: | :curly_haired_man: |
:white_haired_man: | :white_haired_man: | :bald_man: | :bald_man: |
:woman: | :woman: | :red_haired_woman: | :red_haired_woman: |
:person_red_hair: | :person_red_hair: | :curly_haired_woman: | :curly_haired_woman: |
:person_curly_hair: | :person_curly_hair: | :white_haired_woman: | :white_haired_woman: |
:person_white_hair: | :person_white_hair: | :bald_woman: | :bald_woman: |
:person_bald: | :person_bald: | :blond_haired_woman: | :blond_haired_woman: :blonde_woman: |
:blond_haired_man: | :blond_haired_man: | :older_adult: | :older_adult: |
:older_man: | :older_man: | :older_woman: | :older_woman: |
emoji | code | emoji | code |
---|---|---|---|
:frowning_person: | :frowning_person: | :frowning_man: | :frowning_man: |
:frowning_woman: | :frowning_woman: | :pouting_face: | :pouting_face: |
:pouting_man: | :pouting_man: | :pouting_woman: | :pouting_woman: |
:no_good: | :no_good: | :ng_man: | :ng_man: :no_good_man: |
:ng_woman: | :ng_woman: :no_good_woman: | :ok_person: | :ok_person: |
:ok_man: | :ok_man: | :ok_woman: | :ok_woman: |
:information_desk_person: | :information_desk_person: :tipping_hand_person: | :sassy_man: | :sassy_man: :tipping_hand_man: |
:sassy_woman: | :sassy_woman: :tipping_hand_woman: | :raising_hand: | :raising_hand: |
:raising_hand_man: | :raising_hand_man: | :raising_hand_woman: | :raising_hand_woman: |
:deaf_person: | :deaf_person: | :deaf_man: | :deaf_man: |
:deaf_woman: | :deaf_woman: | :bow: | :bow: |
:bowing_man: | :bowing_man: | :bowing_woman: | :bowing_woman: |
:facepalm: | :facepalm: | :man_facepalming: | :man_facepalming: |
:woman_facepalming: | :woman_facepalming: | :shrug: | :shrug: |
:man_shrugging: | :man_shrugging: | :woman_shrugging: | :woman_shrugging: |
emoji | code | emoji | code |
---|---|---|---|
:health_worker: | :health_worker: | :man_health_worker: | :man_health_worker: |
:woman_health_worker: | :woman_health_worker: | :student: | :student: |
:man_student: | :man_student: | :woman_student: | :woman_student: |
:teacher: | :teacher: | :man_teacher: | :man_teacher: |
:woman_teacher: | :woman_teacher: | :judge: | :judge: |
:man_judge: | :man_judge: | :woman_judge: | :woman_judge: |
:farmer: | :farmer: | :man_farmer: | :man_farmer: |
:woman_farmer: | :woman_farmer: | :cook: | :cook: |
:man_cook: | :man_cook: | :woman_cook: | :woman_cook: |
:mechanic: | :mechanic: | :man_mechanic: | :man_mechanic: |
:woman_mechanic: | :woman_mechanic: | :factory_worker: | :factory_worker: |
:man_factory_worker: | :man_factory_worker: | :woman_factory_worker: | :woman_factory_worker: |
:office_worker: | :office_worker: | :man_office_worker: | :man_office_worker: |
:woman_office_worker: | :woman_office_worker: | :scientist: | :scientist: |
:man_scientist: | :man_scientist: | :woman_scientist: | :woman_scientist: |
:technologist: | :technologist: | :man_technologist: | :man_technologist: |
:woman_technologist: | :woman_technologist: | :singer: | :singer: |
:man_singer: | :man_singer: | :woman_singer: | :woman_singer: |
:artist: | :artist: | :man_artist: | :man_artist: |
:woman_artist: | :woman_artist: | :pilot: | :pilot: |
:man_pilot: | :man_pilot: | :woman_pilot: | :woman_pilot: |
:astronaut: | :astronaut: | :man_astronaut: | :man_astronaut: |
:woman_astronaut: | :woman_astronaut: | :firefighter: | :firefighter: |
:man_firefighter: | :man_firefighter: | :woman_firefighter: | :woman_firefighter: |
:cop: | :cop: :police_officer: | :policeman: | :policeman: |
:policewoman: | :policewoman: | :detective: | :detective: |
:male_detective: | :male_detective: | :female_detective: | :female_detective: |
:guard: | :guard: | :guardsman: | :guardsman: |
:guardswoman: | :guardswoman: | :ninja: | :ninja: |
:construction_worker: | :construction_worker: | :construction_worker_man: | :construction_worker_man: |
:construction_worker_woman: | :construction_worker_woman: | :prince: | :prince: |
:princess: | :princess: | :person_with_turban: | :person_with_turban: |
:man_with_turban: | :man_with_turban: | :woman_with_turban: | :woman_with_turban: |
:man_with_gua_pi_mao: | :man_with_gua_pi_mao: | :woman_with_headscarf: | :woman_with_headscarf: |
:person_in_tuxedo: | :person_in_tuxedo: | :man_in_tuxedo: | :man_in_tuxedo: |
:woman_in_tuxedo: | :woman_in_tuxedo: | :person_with_veil: | :person_with_veil: |
:man_with_veil: | :man_with_veil: | :bride_with_veil: | :bride_with_veil: :woman_with_veil: |
:pregnant_woman: | :pregnant_woman: | :breast_feeding: | :breast_feeding: |
:woman_feeding_baby: | :woman_feeding_baby: | :man_feeding_baby: | :man_feeding_baby: |
:person_feeding_baby: | :person_feeding_baby: |
emoji | code | emoji | code |
---|---|---|---|
:angel: | :angel: | :santa: | :santa: |
:mrs_claus: | :mrs_claus: | :mx_claus: | :mx_claus: |
:superhero: | :superhero: | :superhero_man: | :superhero_man: |
:superhero_woman: | :superhero_woman: | :supervillain: | :supervillain: |
:supervillain_man: | :supervillain_man: | :supervillain_woman: | :supervillain_woman: |
:mage: | :mage: | :mage_man: | :mage_man: |
:mage_woman: | :mage_woman: | :fairy: | :fairy: |
:fairy_man: | :fairy_man: | :fairy_woman: | :fairy_woman: |
:vampire: | :vampire: | :vampire_man: | :vampire_man: |
:vampire_woman: | :vampire_woman: | :merperson: | :merperson: |
:merman: | :merman: | :mermaid: | :mermaid: |
:elf: | :elf: | :elf_man: | :elf_man: |
:elf_woman: | :elf_woman: | :genie: | :genie: |
:genie_man: | :genie_man: | :genie_woman: | :genie_woman: |
:zombie: | :zombie: | :zombie_man: | :zombie_man: |
:zombie_woman: | :zombie_woman: |
emoji | code | emoji | code |
---|---|---|---|
:massage: | :massage: | :massage_man: | :massage_man: |
:massage_woman: | :massage_woman: | :haircut: | :haircut: |
:haircut_man: | :haircut_man: | :haircut_woman: | :haircut_woman: |
:walking: | :walking: | :walking_man: | :walking_man: |
:walking_woman: | :walking_woman: | :standing_person: | :standing_person: |
:standing_man: | :standing_man: | :standing_woman: | :standing_woman: |
:kneeling_person: | :kneeling_person: | :kneeling_man: | :kneeling_man: |
:kneeling_woman: | :kneeling_woman: | :person_with_probing_cane: | :person_with_probing_cane: |
:man_with_probing_cane: | :man_with_probing_cane: | :woman_with_probing_cane: | :woman_with_probing_cane: |
:person_in_motorized_wheelchair: | :person_in_motorized_wheelchair: | :man_in_motorized_wheelchair: | :man_in_motorized_wheelchair: |
:woman_in_motorized_wheelchair: | :woman_in_motorized_wheelchair: | :person_in_manual_wheelchair: | :person_in_manual_wheelchair: |
:man_in_manual_wheelchair: | :man_in_manual_wheelchair: | :woman_in_manual_wheelchair: | :woman_in_manual_wheelchair: |
:runner: | :runner: :running: | :running_man: | :running_man: |
:running_woman: | :running_woman: | :dancer: | :dancer: :woman_dancing: |
:man_dancing: | :man_dancing: | :business_suit_levitating: | :business_suit_levitating: |
:dancers: | :dancers: | :dancing_men: | :dancing_men: |
:dancing_women: | :dancing_women: | :sauna_person: | :sauna_person: |
:sauna_man: | :sauna_man: | :sauna_woman: | :sauna_woman: |
:climbing: | :climbing: | :climbing_man: | :climbing_man: |
:climbing_woman: | :climbing_woman: |
emoji | code | emoji | code |
---|---|---|---|
:person_fencing: | :person_fencing: | :horse_racing: | :horse_racing: |
:skier: | :skier: | :snowboarder: | :snowboarder: |
:golfing: | :golfing: | :golfing_man: | :golfing_man: |
:golfing_woman: | :golfing_woman: | :surfer: | :surfer: |
:surfing_man: | :surfing_man: | :surfing_woman: | :surfing_woman: |
:rowboat: | :rowboat: | :rowing_man: | :rowing_man: |
:rowing_woman: | :rowing_woman: | :swimmer: | :swimmer: |
:swimming_man: | :swimming_man: | :swimming_woman: | :swimming_woman: |
:bouncing_ball_person: | :bouncing_ball_person: | :basketball_man: | :basketball_man: :bouncing_ball_man: |
:basketball_woman: | :basketball_woman: :bouncing_ball_woman: | :weight_lifting: | :weight_lifting: |
:weight_lifting_man: | :weight_lifting_man: | :weight_lifting_woman: | :weight_lifting_woman: |
:bicyclist: | :bicyclist: | :biking_man: | :biking_man: |
:biking_woman: | :biking_woman: | :mountain_bicyclist: | :mountain_bicyclist: |
:mountain_biking_man: | :mountain_biking_man: | :mountain_biking_woman: | :mountain_biking_woman: |
:cartwheeling: | :cartwheeling: | :man_cartwheeling: | :man_cartwheeling: |
:woman_cartwheeling: | :woman_cartwheeling: | :wrestling: | :wrestling: |
:men_wrestling: | :men_wrestling: | :women_wrestling: | :women_wrestling: |
:water_polo: | :water_polo: | :man_playing_water_polo: | :man_playing_water_polo: |
:woman_playing_water_polo: | :woman_playing_water_polo: | :handball_person: | :handball_person: |
:man_playing_handball: | :man_playing_handball: | :woman_playing_handball: | :woman_playing_handball: |
:juggling_person: | :juggling_person: | :man_juggling: | :man_juggling: |
:woman_juggling: | :woman_juggling: |
emoji | code | emoji | code |
---|---|---|---|
:lotus_position: | :lotus_position: | :lotus_position_man: | :lotus_position_man: |
:lotus_position_woman: | :lotus_position_woman: | :bath: | :bath: |
:sleeping_bed: | :sleeping_bed: |
emoji | code | emoji | code |
---|---|---|---|
:people_holding_hands: | :people_holding_hands: | :two_women_holding_hands: | :two_women_holding_hands: |
:couple: | :couple: | :two_men_holding_hands: | :two_men_holding_hands: |
:couplekiss: | :couplekiss: | :couplekiss_man_woman: | :couplekiss_man_woman: |
:couplekiss_man_man: | :couplekiss_man_man: | :couplekiss_woman_woman: | :couplekiss_woman_woman: |
:couple_with_heart: | :couple_with_heart: | :couple_with_heart_woman_man: | :couple_with_heart_woman_man: |
:couple_with_heart_man_man: | :couple_with_heart_man_man: | :couple_with_heart_woman_woman: | :couple_with_heart_woman_woman: |
:family: | :family: | :family_man_woman_boy: | :family_man_woman_boy: |
:family_man_woman_girl: | :family_man_woman_girl: | :family_man_woman_girl_boy: | :family_man_woman_girl_boy: |
:family_man_woman_boy_boy: | :family_man_woman_boy_boy: | :family_man_woman_girl_girl: | :family_man_woman_girl_girl: |
:family_man_man_boy: | :family_man_man_boy: | :family_man_man_girl: | :family_man_man_girl: |
:family_man_man_girl_boy: | :family_man_man_girl_boy: | :family_man_man_boy_boy: | :family_man_man_boy_boy: |
:family_man_man_girl_girl: | :family_man_man_girl_girl: | :family_woman_woman_boy: | :family_woman_woman_boy: |
:family_woman_woman_girl: | :family_woman_woman_girl: | :family_woman_woman_girl_boy: | :family_woman_woman_girl_boy: |
:family_woman_woman_boy_boy: | :family_woman_woman_boy_boy: | :family_woman_woman_girl_girl: | :family_woman_woman_girl_girl: |
:family_man_boy: | :family_man_boy: | :family_man_boy_boy: | :family_man_boy_boy: |
:family_man_girl: | :family_man_girl: | :family_man_girl_boy: | :family_man_girl_boy: |
:family_man_girl_girl: | :family_man_girl_girl: | :family_woman_boy: | :family_woman_boy: |
:family_woman_boy_boy: | :family_woman_boy_boy: | :family_woman_girl: | :family_woman_girl: |
:family_woman_girl_boy: | :family_woman_girl_boy: | :family_woman_girl_girl: | :family_woman_girl_girl: |
emoji | code | emoji | code |
---|---|---|---|
:speaking_head: | :speaking_head: | :bust_in_silhouette: | :bust_in_silhouette: |
:busts_in_silhouette: | :busts_in_silhouette: | :people_hugging: | :people_hugging: |
:footprints: | :footprints: |
emoji | code | emoji | code |
---|---|---|---|
:monkey_face: | :monkey_face: | :monkey: | :monkey: |
:gorilla: | :gorilla: | :orangutan: | :orangutan: |
:dog: | :dog: | :dog2: | :dog2: |
:guide_dog: | :guide_dog: | :service_dog: | :service_dog: |
:poodle: | :poodle: | :wolf: | :wolf: |
:fox_face: | :fox_face: | :raccoon: | :raccoon: |
:cat: | :cat: | :cat2: | :cat2: |
:black_cat: | :black_cat: | :lion: | :lion: |
:tiger: | :tiger: | :tiger2: | :tiger2: |
:leopard: | :leopard: | :horse: | :horse: |
:racehorse: | :racehorse: | :unicorn: | :unicorn: |
:zebra: | :zebra: | :deer: | :deer: |
:bison: | :bison: | :cow: | :cow: |
:ox: | :ox: | :water_buffalo: | :water_buffalo: |
:cow2: | :cow2: | :pig: | :pig: |
:pig2: | :pig2: | :boar: | :boar: |
:pig_nose: | :pig_nose: | :ram: | :ram: |
:sheep: | :sheep: | :goat: | :goat: |
:dromedary_camel: | :dromedary_camel: | :camel: | :camel: |
:llama: | :llama: | :giraffe: | :giraffe: |
:elephant: | :elephant: | :mammoth: | :mammoth: |
:rhinoceros: | :rhinoceros: | :hippopotamus: | :hippopotamus: |
:mouse: | :mouse: | :mouse2: | :mouse2: |
:rat: | :rat: | :hamster: | :hamster: |
:rabbit: | :rabbit: | :rabbit2: | :rabbit2: |
:chipmunk: | :chipmunk: | :beaver: | :beaver: |
:hedgehog: | :hedgehog: | :bat: | :bat: |
:bear: | :bear: | :polar_bear: | :polar_bear: |
:koala: | :koala: | :panda_face: | :panda_face: |
:sloth: | :sloth: | :otter: | :otter: |
:skunk: | :skunk: | :kangaroo: | :kangaroo: |
:badger: | :badger: | :feet: | :feet: :paw_prints: |
emoji | code | emoji | code |
---|---|---|---|
:turkey: | :turkey: | :chicken: | :chicken: |
:rooster: | :rooster: | :hatching_chick: | :hatching_chick: |
:baby_chick: | :baby_chick: | :hatched_chick: | :hatched_chick: |
:bird: | :bird: | :penguin: | :penguin: |
:dove: | :dove: | :eagle: | :eagle: |
:duck: | :duck: | :swan: | :swan: |
:owl: | :owl: | :dodo: | :dodo: |
:feather: | :feather: | :flamingo: | :flamingo: |
:peacock: | :peacock: | :parrot: | :parrot: |
emoji | code |
---|---|
:frog: | :frog: |
emoji | code | emoji | code |
---|---|---|---|
:crocodile: | :crocodile: | :turtle: | :turtle: |
:lizard: | :lizard: | :snake: | :snake: |
:dragon_face: | :dragon_face: | :dragon: | :dragon: |
:sauropod: | :sauropod: | :t-rex: | :t-rex: |
emoji | code | emoji | code |
---|---|---|---|
:whale: | :whale: | :whale2: | :whale2: |
:dolphin: | :dolphin: :flipper: | :seal: | :seal: |
:fish: | :fish: | :tropical_fish: | :tropical_fish: |
:blowfish: | :blowfish: | :shark: | :shark: |
:octopus: | :octopus: | :shell: | :shell: |
emoji | code | emoji | code |
---|---|---|---|
:snail: | :snail: | :butterfly: | :butterfly: |
:bug: | :bug: | :ant: | :ant: |
:bee: | :bee: :honeybee: | :beetle: | :beetle: |
:lady_beetle: | :lady_beetle: | :cricket: | :cricket: |
:cockroach: | :cockroach: | :spider: | :spider: |
:spider_web: | :spider_web: | :scorpion: | :scorpion: |
:mosquito: | :mosquito: | :fly: | :fly: |
:worm: | :worm: | :microbe: | :microbe: |
emoji | code | emoji | code |
---|---|---|---|
:bouquet: | :bouquet: | :cherry_blossom: | :cherry_blossom: |
:white_flower: | :white_flower: | :rosette: | :rosette: |
:rose: | :rose: | :wilted_flower: | :wilted_flower: |
:hibiscus: | :hibiscus: | :sunflower: | :sunflower: |
:blossom: | :blossom: | :tulip: | :tulip: |
emoji | code | emoji | code |
---|---|---|---|
:seedling: | :seedling: | :potted_plant: | :potted_plant: |
:evergreen_tree: | :evergreen_tree: | :deciduous_tree: | :deciduous_tree: |
:palm_tree: | :palm_tree: | :cactus: | :cactus: |
:ear_of_rice: | :ear_of_rice: | :herb: | :herb: |
:shamrock: | :shamrock: | :four_leaf_clover: | :four_leaf_clover: |
:maple_leaf: | :maple_leaf: | :fallen_leaf: | :fallen_leaf: |
:leaves: | :leaves: |
emoji | code | emoji | code |
---|---|---|---|
:grapes: | :grapes: | :melon: | :melon: |
:watermelon: | :watermelon: | :mandarin: | :mandarin: :orange: :tangerine: |
:lemon: | :lemon: | :banana: | :banana: |
:pineapple: | :pineapple: | :mango: | :mango: |
:apple: | :apple: | :green_apple: | :green_apple: |
:pear: | :pear: | :peach: | :peach: |
:cherries: | :cherries: | :strawberry: | :strawberry: |
:blueberries: | :blueberries: | :kiwi_fruit: | :kiwi_fruit: |
:tomato: | :tomato: | :olive: | :olive: |
:coconut: | :coconut: |
emoji | code | emoji | code |
---|---|---|---|
:avocado: | :avocado: | :eggplant: | :eggplant: |
:potato: | :potato: | :carrot: | :carrot: |
:corn: | :corn: | :hot_pepper: | :hot_pepper: |
:bell_pepper: | :bell_pepper: | :cucumber: | :cucumber: |
:leafy_green: | :leafy_green: | :broccoli: | :broccoli: |
:garlic: | :garlic: | :onion: | :onion: |
:mushroom: | :mushroom: | :peanuts: | :peanuts: |
:chestnut: | :chestnut: |
emoji | code | emoji | code |
---|---|---|---|
:bread: | :bread: | :croissant: | :croissant: |
:baguette_bread: | :baguette_bread: | :flatbread: | :flatbread: |
:pretzel: | :pretzel: | :bagel: | :bagel: |
:pancakes: | :pancakes: | :waffle: | :waffle: |
:cheese: | :cheese: | :meat_on_bone: | :meat_on_bone: |
:poultry_leg: | :poultry_leg: | :cut_of_meat: | :cut_of_meat: |
:bacon: | :bacon: | :hamburger: | :hamburger: |
:fries: | :fries: | :pizza: | :pizza: |
:hotdog: | :hotdog: | :sandwich: | :sandwich: |
:taco: | :taco: | :burrito: | :burrito: |
:tamale: | :tamale: | :stuffed_flatbread: | :stuffed_flatbread: |
:falafel: | :falafel: | :egg: | :egg: |
:fried_egg: | :fried_egg: | :shallow_pan_of_food: | :shallow_pan_of_food: |
:stew: | :stew: | :fondue: | :fondue: |
:bowl_with_spoon: | :bowl_with_spoon: | :green_salad: | :green_salad: |
:popcorn: | :popcorn: | :butter: | :butter: |
:salt: | :salt: | :canned_food: | :canned_food: |
emoji | code | emoji | code |
---|---|---|---|
:bento: | :bento: | :rice_cracker: | :rice_cracker: |
:rice_ball: | :rice_ball: | :rice: | :rice: |
:curry: | :curry: | :ramen: | :ramen: |
:spaghetti: | :spaghetti: | :sweet_potato: | :sweet_potato: |
:oden: | :oden: | :sushi: | :sushi: |
:fried_shrimp: | :fried_shrimp: | :fish_cake: | :fish_cake: |
:moon_cake: | :moon_cake: | :dango: | :dango: |
:dumpling: | :dumpling: | :fortune_cookie: | :fortune_cookie: |
:takeout_box: | :takeout_box: |
emoji | code | emoji | code |
---|---|---|---|
:crab: | :crab: | :lobster: | :lobster: |
:shrimp: | :shrimp: | :squid: | :squid: |
:oyster: | :oyster: |
emoji | code | emoji | code |
---|---|---|---|
:icecream: | :icecream: | :shaved_ice: | :shaved_ice: |
:ice_cream: | :ice_cream: | :doughnut: | :doughnut: |
:cookie: | :cookie: | :birthday: | :birthday: |
:cake: | :cake: | :cupcake: | :cupcake: |
:pie: | :pie: | :chocolate_bar: | :chocolate_bar: |
:candy: | :candy: | :lollipop: | :lollipop: |
:custard: | :custard: | :honey_pot: | :honey_pot: |
emoji | code | emoji | code |
---|---|---|---|
:baby_bottle: | :baby_bottle: | :milk_glass: | :milk_glass: |
:coffee: | :coffee: | :teapot: | :teapot: |
:tea: | :tea: | :sake: | :sake: |
:champagne: | :champagne: | :wine_glass: | :wine_glass: |
:cocktail: | :cocktail: | :tropical_drink: | :tropical_drink: |
:beer: | :beer: | :beers: | :beers: |
:clinking_glasses: | :clinking_glasses: | :tumbler_glass: | :tumbler_glass: |
:cup_with_straw: | :cup_with_straw: | :bubble_tea: | :bubble_tea: |
:beverage_box: | :beverage_box: | :mate: | :mate: |
:ice_cube: | :ice_cube: |
emoji | code | emoji | code |
---|---|---|---|
:chopsticks: | :chopsticks: | :plate_with_cutlery: | :plate_with_cutlery: |
:fork_and_knife: | :fork_and_knife: | :spoon: | :spoon: |
:hocho: | :hocho: :knife: | :amphora: | :amphora: |
emoji | code | emoji | code |
---|---|---|---|
:earth_africa: | :earth_africa: | :earth_americas: | :earth_americas: |
:earth_asia: | :earth_asia: | :globe_with_meridians: | :globe_with_meridians: |
:world_map: | :world_map: | :japan: | :japan: |
:compass: | :compass: |
emoji | code | emoji | code |
---|---|---|---|
:mountain_snow: | :mountain_snow: | :mountain: | :mountain: |
:volcano: | :volcano: | :mount_fuji: | :mount_fuji: |
:camping: | :camping: | :beach_umbrella: | :beach_umbrella: |
:desert: | :desert: | :desert_island: | :desert_island: |
:national_park: | :national_park: |
emoji | code | emoji | code |
---|---|---|---|
:stadium: | :stadium: | :classical_building: | :classical_building: |
:building_construction: | :building_construction: | :bricks: | :bricks: |
:rock: | :rock: | :wood: | :wood: |
:hut: | :hut: | :houses: | :houses: |
:derelict_house: | :derelict_house: | :house: | :house: |
:house_with_garden: | :house_with_garden: | :office: | :office: |
:post_office: | :post_office: | :european_post_office: | :european_post_office: |
:hospital: | :hospital: | :bank: | :bank: |
:hotel: | :hotel: | :love_hotel: | :love_hotel: |
:convenience_store: | :convenience_store: | :school: | :school: |
:department_store: | :department_store: | :factory: | :factory: |
:japanese_castle: | :japanese_castle: | :european_castle: | :european_castle: |
:wedding: | :wedding: | :tokyo_tower: | :tokyo_tower: |
:statue_of_liberty: | :statue_of_liberty: |
emoji | code | emoji | code |
---|---|---|---|
:church: | :church: | :mosque: | :mosque: |
:hindu_temple: | :hindu_temple: | :synagogue: | :synagogue: |
:shinto_shrine: | :shinto_shrine: | :kaaba: | :kaaba: |
emoji | code | emoji | code |
---|---|---|---|
:fountain: | :fountain: | :tent: | :tent: |
:foggy: | :foggy: | :night_with_stars: | :night_with_stars: |
:cityscape: | :cityscape: | :sunrise_over_mountains: | :sunrise_over_mountains: |
:sunrise: | :sunrise: | :city_sunset: | :city_sunset: |
:city_sunrise: | :city_sunrise: | :bridge_at_night: | :bridge_at_night: |
:hotsprings: | :hotsprings: | :carousel_horse: | :carousel_horse: |
:ferris_wheel: | :ferris_wheel: | :roller_coaster: | :roller_coaster: |
:barber: | :barber: | :circus_tent: | :circus_tent: |
emoji | code | emoji | code |
---|---|---|---|
:steam_locomotive: | :steam_locomotive: | :railway_car: | :railway_car: |
:bullettrain_side: | :bullettrain_side: | :bullettrain_front: | :bullettrain_front: |
:train2: | :train2: | :metro: | :metro: |
:light_rail: | :light_rail: | :station: | :station: |
:tram: | :tram: | :monorail: | :monorail: |
:mountain_railway: | :mountain_railway: | :train: | :train: |
:bus: | :bus: | :oncoming_bus: | :oncoming_bus: |
:trolleybus: | :trolleybus: | :minibus: | :minibus: |
:ambulance: | :ambulance: | :fire_engine: | :fire_engine: |
:police_car: | :police_car: | :oncoming_police_car: | :oncoming_police_car: |
:taxi: | :taxi: | :oncoming_taxi: | :oncoming_taxi: |
:car: | :car: :red_car: | :oncoming_automobile: | :oncoming_automobile: |
:blue_car: | :blue_car: | :pickup_truck: | :pickup_truck: |
:truck: | :truck: | :articulated_lorry: | :articulated_lorry: |
:tractor: | :tractor: | :racing_car: | :racing_car: |
:motorcycle: | :motorcycle: | :motor_scooter: | :motor_scooter: |
:manual_wheelchair: | :manual_wheelchair: | :motorized_wheelchair: | :motorized_wheelchair: |
:auto_rickshaw: | :auto_rickshaw: | :bike: | :bike: |
:kick_scooter: | :kick_scooter: | :skateboard: | :skateboard: |
:roller_skate: | :roller_skate: | :busstop: | :busstop: |
:motorway: | :motorway: | :railway_track: | :railway_track: |
:oil_drum: | :oil_drum: | :fuelpump: | :fuelpump: |
:rotating_light: | :rotating_light: | :traffic_light: | :traffic_light: |
:vertical_traffic_light: | :vertical_traffic_light: | :stop_sign: | :stop_sign: |
:construction: | :construction: |
emoji | code | emoji | code |
---|---|---|---|
:anchor: | :anchor: | :boat: | :boat: :sailboat: |
:canoe: | :canoe: | :speedboat: | :speedboat: |
:passenger_ship: | :passenger_ship: | :ferry: | :ferry: |
:motor_boat: | :motor_boat: | :ship: | :ship: |
emoji | code | emoji | code |
---|---|---|---|
:airplane: | :airplane: | :small_airplane: | :small_airplane: |
:flight_departure: | :flight_departure: | :flight_arrival: | :flight_arrival: |
:parachute: | :parachute: | :seat: | :seat: |
:helicopter: | :helicopter: | :suspension_railway: | :suspension_railway: |
:mountain_cableway: | :mountain_cableway: | :aerial_tramway: | :aerial_tramway: |
:artificial_satellite: | :artificial_satellite: | :rocket: | :rocket: |
:flying_saucer: | :flying_saucer: |
emoji | code | emoji | code |
---|---|---|---|
:bellhop_bell: | :bellhop_bell: | :luggage: | :luggage: |
emoji | code | emoji | code |
---|---|---|---|
:hourglass: | :hourglass: | :hourglass_flowing_sand: | :hourglass_flowing_sand: |
:watch: | :watch: | :alarm_clock: | :alarm_clock: |
:stopwatch: | :stopwatch: | :timer_clock: | :timer_clock: |
:mantelpiece_clock: | :mantelpiece_clock: | :clock12: | :clock12: |
:clock1230: | :clock1230: | :clock1: | :clock1: |
:clock130: | :clock130: | :clock2: | :clock2: |
:clock230: | :clock230: | :clock3: | :clock3: |
:clock330: | :clock330: | :clock4: | :clock4: |
:clock430: | :clock430: | :clock5: | :clock5: |
:clock530: | :clock530: | :clock6: | :clock6: |
:clock630: | :clock630: | :clock7: | :clock7: |
:clock730: | :clock730: | :clock8: | :clock8: |
:clock830: | :clock830: | :clock9: | :clock9: |
:clock930: | :clock930: | :clock10: | :clock10: |
:clock1030: | :clock1030: | :clock11: | :clock11: |
:clock1130: | :clock1130: |
emoji | code | emoji | code |
---|---|---|---|
:new_moon: | :new_moon: | :waxing_crescent_moon: | :waxing_crescent_moon: |
:first_quarter_moon: | :first_quarter_moon: | :moon: | :moon: :waxing_gibbous_moon: |
:full_moon: | :full_moon: | :waning_gibbous_moon: | :waning_gibbous_moon: |
:last_quarter_moon: | :last_quarter_moon: | :waning_crescent_moon: | :waning_crescent_moon: |
:crescent_moon: | :crescent_moon: | :new_moon_with_face: | :new_moon_with_face: |
:first_quarter_moon_with_face: | :first_quarter_moon_with_face: | :last_quarter_moon_with_face: | :last_quarter_moon_with_face: |
:thermometer: | :thermometer: | :sunny: | :sunny: |
:full_moon_with_face: | :full_moon_with_face: | :sun_with_face: | :sun_with_face: |
:ringed_planet: | :ringed_planet: | :star: | :star: |
:star2: | :star2: | :stars: | :stars: |
:milky_way: | :milky_way: | :cloud: | :cloud: |
:partly_sunny: | :partly_sunny: | :cloud_with_lightning_and_rain: | :cloud_with_lightning_and_rain: |
:sun_behind_small_cloud: | :sun_behind_small_cloud: | :sun_behind_large_cloud: | :sun_behind_large_cloud: |
:sun_behind_rain_cloud: | :sun_behind_rain_cloud: | :cloud_with_rain: | :cloud_with_rain: |
:cloud_with_snow: | :cloud_with_snow: | :cloud_with_lightning: | :cloud_with_lightning: |
:tornado: | :tornado: | :fog: | :fog: |
:wind_face: | :wind_face: | :cyclone: | :cyclone: |
:rainbow: | :rainbow: | :closed_umbrella: | :closed_umbrella: |
:open_umbrella: | :open_umbrella: | :umbrella: | :umbrella: |
:parasol_on_ground: | :parasol_on_ground: | :zap: | :zap: |
:snowflake: | :snowflake: | :snowman_with_snow: | :snowman_with_snow: |
:snowman: | :snowman: | :comet: | :comet: |
:fire: | :fire: | :droplet: | :droplet: |
:ocean: | :ocean: |
emoji | code | emoji | code |
---|---|---|---|
:jack_o_lantern: | :jack_o_lantern: | :christmas_tree: | :christmas_tree: |
:fireworks: | :fireworks: | :sparkler: | :sparkler: |
:firecracker: | :firecracker: | :sparkles: | :sparkles: |
:balloon: | :balloon: | :tada: | :tada: |
:confetti_ball: | :confetti_ball: | :tanabata_tree: | :tanabata_tree: |
:bamboo: | :bamboo: | :dolls: | :dolls: |
:flags: | :flags: | :wind_chime: | :wind_chime: |
:rice_scene: | :rice_scene: | :red_envelope: | :red_envelope: |
:ribbon: | :ribbon: | :gift: | :gift: |
:reminder_ribbon: | :reminder_ribbon: | :tickets: | :tickets: |
:ticket: | :ticket: |
emoji | code | emoji | code |
---|---|---|---|
:medal_military: | :medal_military: | :trophy: | :trophy: |
:medal_sports: | :medal_sports: | :1st_place_medal: | :1st_place_medal: |
:2nd_place_medal: | :2nd_place_medal: | :3rd_place_medal: | :3rd_place_medal: |
emoji | code | emoji | code |
---|---|---|---|
:soccer: | :soccer: | :baseball: | :baseball: |
:softball: | :softball: | :basketball: | :basketball: |
:volleyball: | :volleyball: | :football: | :football: |
:rugby_football: | :rugby_football: | :tennis: | :tennis: |
:flying_disc: | :flying_disc: | :bowling: | :bowling: |
:cricket_game: | :cricket_game: | :field_hockey: | :field_hockey: |
:ice_hockey: | :ice_hockey: | :lacrosse: | :lacrosse: |
:ping_pong: | :ping_pong: | :badminton: | :badminton: |
:boxing_glove: | :boxing_glove: | :martial_arts_uniform: | :martial_arts_uniform: |
:goal_net: | :goal_net: | :golf: | :golf: |
:ice_skate: | :ice_skate: | :fishing_pole_and_fish: | :fishing_pole_and_fish: |
:diving_mask: | :diving_mask: | :running_shirt_with_sash: | :running_shirt_with_sash: |
:ski: | :ski: | :sled: | :sled: |
:curling_stone: | :curling_stone: |
emoji | code | emoji | code |
---|---|---|---|
:dart: | :dart: | :yo_yo: | :yo_yo: |
:kite: | :kite: | :8ball: | :8ball: |
:crystal_ball: | :crystal_ball: | :magic_wand: | :magic_wand: |
:nazar_amulet: | :nazar_amulet: | :video_game: | :video_game: |
:joystick: | :joystick: | :slot_machine: | :slot_machine: |
:game_die: | :game_die: | :jigsaw: | :jigsaw: |
:teddy_bear: | :teddy_bear: | :pinata: | :pinata: |
:nesting_dolls: | :nesting_dolls: | :spades: | :spades: |
:hearts: | :hearts: | :diamonds: | :diamonds: |
:clubs: | :clubs: | :chess_pawn: | :chess_pawn: |
:black_joker: | :black_joker: | :mahjong: | :mahjong: |
:flower_playing_cards: | :flower_playing_cards: |
emoji | code | emoji | code |
---|---|---|---|
:performing_arts: | :performing_arts: | :framed_picture: | :framed_picture: |
:art: | :art: | :thread: | :thread: |
:sewing_needle: | :sewing_needle: | :yarn: | :yarn: |
:knot: | :knot: |
emoji | code | emoji | code |
---|---|---|---|
:eyeglasses: | :eyeglasses: | :dark_sunglasses: | :dark_sunglasses: |
:goggles: | :goggles: | :lab_coat: | :lab_coat: |
:safety_vest: | :safety_vest: | :necktie: | :necktie: |
:shirt: | :shirt: :tshirt: | :jeans: | :jeans: |
:scarf: | :scarf: | :gloves: | :gloves: |
:coat: | :coat: | :socks: | :socks: |
:dress: | :dress: | :kimono: | :kimono: |
:sari: | :sari: | :one_piece_swimsuit: | :one_piece_swimsuit: |
:swim_brief: | :swim_brief: | :shorts: | :shorts: |
:bikini: | :bikini: | :womans_clothes: | :womans_clothes: |
:purse: | :purse: | :handbag: | :handbag: |
:pouch: | :pouch: | :shopping: | :shopping: |
:school_satchel: | :school_satchel: | :thong_sandal: | :thong_sandal: |
:mans_shoe: | :mans_shoe: :shoe: | :athletic_shoe: | :athletic_shoe: |
:hiking_boot: | :hiking_boot: | :flat_shoe: | :flat_shoe: |
:high_heel: | :high_heel: | :sandal: | :sandal: |
:ballet_shoes: | :ballet_shoes: | :boot: | :boot: |
:crown: | :crown: | :womans_hat: | :womans_hat: |
:tophat: | :tophat: | :mortar_board: | :mortar_board: |
:billed_cap: | :billed_cap: | :military_helmet: | :military_helmet: |
:rescue_worker_helmet: | :rescue_worker_helmet: | :prayer_beads: | :prayer_beads: |
:lipstick: | :lipstick: | :ring: | :ring: |
:gem: | :gem: |
emoji | code | emoji | code |
---|---|---|---|
:mute: | :mute: | :speaker: | :speaker: |
:sound: | :sound: | :loud_sound: | :loud_sound: |
:loudspeaker: | :loudspeaker: | :mega: | :mega: |
:postal_horn: | :postal_horn: | :bell: | :bell: |
:no_bell: | :no_bell: |
emoji | code | emoji | code |
---|---|---|---|
:musical_score: | :musical_score: | :musical_note: | :musical_note: |
:notes: | :notes: | :studio_microphone: | :studio_microphone: |
:level_slider: | :level_slider: | :control_knobs: | :control_knobs: |
:microphone: | :microphone: | :headphones: | :headphones: |
:radio: | :radio: |
emoji | code | emoji | code |
---|---|---|---|
:saxophone: | :saxophone: | :accordion: | :accordion: |
:guitar: | :guitar: | :musical_keyboard: | :musical_keyboard: |
:trumpet: | :trumpet: | :violin: | :violin: |
:banjo: | :banjo: | :drum: | :drum: |
:long_drum: | :long_drum: |
emoji | code | emoji | code |
---|---|---|---|
:iphone: | :iphone: | :calling: | :calling: |
:phone: | :phone: :telephone: | :telephone_receiver: | :telephone_receiver: |
:pager: | :pager: | :fax: | :fax: |
emoji | code | emoji | code |
---|---|---|---|
:battery: | :battery: | :electric_plug: | :electric_plug: |
:computer: | :computer: | :desktop_computer: | :desktop_computer: |
:printer: | :printer: | :keyboard: | :keyboard: |
:computer_mouse: | :computer_mouse: | :trackball: | :trackball: |
:minidisc: | :minidisc: | :floppy_disk: | :floppy_disk: |
:cd: | :cd: | :dvd: | :dvd: |
:abacus: | :abacus: |
emoji | code | emoji | code |
---|---|---|---|
:movie_camera: | :movie_camera: | :film_strip: | :film_strip: |
:film_projector: | :film_projector: | :clapper: | :clapper: |
:tv: | :tv: | :camera: | :camera: |
:camera_flash: | :camera_flash: | :video_camera: | :video_camera: |
:vhs: | :vhs: | :mag: | :mag: |
:mag_right: | :mag_right: | :candle: | :candle: |
:bulb: | :bulb: | :flashlight: | :flashlight: |
:izakaya_lantern: | :izakaya_lantern: :lantern: | :diya_lamp: | :diya_lamp: |
emoji | code | emoji | code |
---|---|---|---|
:notebook_with_decorative_cover: | :notebook_with_decorative_cover: | :closed_book: | :closed_book: |
:book: | :book: :open_book: | :green_book: | :green_book: |
:blue_book: | :blue_book: | :orange_book: | :orange_book: |
:books: | :books: | :notebook: | :notebook: |
:ledger: | :ledger: | :page_with_curl: | :page_with_curl: |
:scroll: | :scroll: | :page_facing_up: | :page_facing_up: |
:newspaper: | :newspaper: | :newspaper_roll: | :newspaper_roll: |
:bookmark_tabs: | :bookmark_tabs: | :bookmark: | :bookmark: |
:label: | :label: |
emoji | code | emoji | code |
---|---|---|---|
:moneybag: | :moneybag: | :coin: | :coin: |
:yen: | :yen: | :dollar: | :dollar: |
:euro: | :euro: | :pound: | :pound: |
:money_with_wings: | :money_with_wings: | :credit_card: | :credit_card: |
:receipt: | :receipt: | :chart: | :chart: |
emoji | code | emoji | code |
---|---|---|---|
:envelope: | :envelope: | :e-mail: | :e-mail: :email: |
:incoming_envelope: | :incoming_envelope: | :envelope_with_arrow: | :envelope_with_arrow: |
:outbox_tray: | :outbox_tray: | :inbox_tray: | :inbox_tray: |
:package: | :package: | :mailbox: | :mailbox: |
:mailbox_closed: | :mailbox_closed: | :mailbox_with_mail: | :mailbox_with_mail: |
:mailbox_with_no_mail: | :mailbox_with_no_mail: | :postbox: | :postbox: |
:ballot_box: | :ballot_box: |
emoji | code | emoji | code |
---|---|---|---|
:pencil2: | :pencil2: | :black_nib: | :black_nib: |
:fountain_pen: | :fountain_pen: | :pen: | :pen: |
:paintbrush: | :paintbrush: | :crayon: | :crayon: |
:memo: | :memo: :pencil: |
emoji | code | emoji | code |
---|---|---|---|
:briefcase: | :briefcase: | :file_folder: | :file_folder: |
:open_file_folder: | :open_file_folder: | :card_index_dividers: | :card_index_dividers: |
:date: | :date: | :calendar: | :calendar: |
:spiral_notepad: | :spiral_notepad: | :spiral_calendar: | :spiral_calendar: |
:card_index: | :card_index: | :chart_with_upwards_trend: | :chart_with_upwards_trend: |
:chart_with_downwards_trend: | :chart_with_downwards_trend: | :bar_chart: | :bar_chart: |
:clipboard: | :clipboard: | :pushpin: | :pushpin: |
:round_pushpin: | :round_pushpin: | :paperclip: | :paperclip: |
:paperclips: | :paperclips: | :straight_ruler: | :straight_ruler: |
:triangular_ruler: | :triangular_ruler: | :scissors: | :scissors: |
:card_file_box: | :card_file_box: | :file_cabinet: | :file_cabinet: |
:wastebasket: | :wastebasket: |
emoji | code | emoji | code |
---|---|---|---|
:lock: | :lock: | :unlock: | :unlock: |
:lock_with_ink_pen: | :lock_with_ink_pen: | :closed_lock_with_key: | :closed_lock_with_key: |
:key: | :key: | :old_key: | :old_key: |
emoji | code | emoji | code |
---|---|---|---|
:hammer: | :hammer: | :axe: | :axe: |
:pick: | :pick: | :hammer_and_pick: | :hammer_and_pick: |
:hammer_and_wrench: | :hammer_and_wrench: | :dagger: | :dagger: |
:crossed_swords: | :crossed_swords: | :gun: | :gun: |
:boomerang: | :boomerang: | :bow_and_arrow: | :bow_and_arrow: |
:shield: | :shield: | :carpentry_saw: | :carpentry_saw: |
:wrench: | :wrench: | :screwdriver: | :screwdriver: |
:nut_and_bolt: | :nut_and_bolt: | :gear: | :gear: |
:clamp: | :clamp: | :balance_scale: | :balance_scale: |
:probing_cane: | :probing_cane: | :link: | :link: |
:chains: | :chains: | :hook: | :hook: |
:toolbox: | :toolbox: | :magnet: | :magnet: |
:ladder: | :ladder: |
emoji | code | emoji | code |
---|---|---|---|
:alembic: | :alembic: | :test_tube: | :test_tube: |
:petri_dish: | :petri_dish: | :dna: | :dna: |
:microscope: | :microscope: | :telescope: | :telescope: |
:satellite: | :satellite: |
emoji | code | emoji | code |
---|---|---|---|
:syringe: | :syringe: | :drop_of_blood: | :drop_of_blood: |
:pill: | :pill: | :adhesive_bandage: | :adhesive_bandage: |
:stethoscope: | :stethoscope: |
emoji | code | emoji | code |
---|---|---|---|
:door: | :door: | :elevator: | :elevator: |
:mirror: | :mirror: | :window: | :window: |
:bed: | :bed: | :couch_and_lamp: | :couch_and_lamp: |
:chair: | :chair: | :toilet: | :toilet: |
:plunger: | :plunger: | :shower: | :shower: |
:bathtub: | :bathtub: | :mouse_trap: | :mouse_trap: |
:razor: | :razor: | :lotion_bottle: | :lotion_bottle: |
:safety_pin: | :safety_pin: | :broom: | :broom: |
:basket: | :basket: | :roll_of_paper: | :roll_of_paper: |
:bucket: | :bucket: | :soap: | :soap: |
:toothbrush: | :toothbrush: | :sponge: | :sponge: |
:fire_extinguisher: | :fire_extinguisher: | :shopping_cart: | :shopping_cart: |
emoji | code | emoji | code |
---|---|---|---|
:smoking: | :smoking: | :coffin: | :coffin: |
:headstone: | :headstone: | :funeral_urn: | :funeral_urn: |
:moyai: | :moyai: | :placard: | :placard: |
emoji | code | emoji | code |
---|---|---|---|
:atm: | :atm: | :put_litter_in_its_place: | :put_litter_in_its_place: |
:potable_water: | :potable_water: | :wheelchair: | :wheelchair: |
:mens: | :mens: | :womens: | :womens: |
:restroom: | :restroom: | :baby_symbol: | :baby_symbol: |
:wc: | :wc: | :passport_control: | :passport_control: |
:customs: | :customs: | :baggage_claim: | :baggage_claim: |
:left_luggage: | :left_luggage: |
emoji | code | emoji | code |
---|---|---|---|
:warning: | :warning: | :children_crossing: | :children_crossing: |
:no_entry: | :no_entry: | :no_entry_sign: | :no_entry_sign: |
:no_bicycles: | :no_bicycles: | :no_smoking: | :no_smoking: |
:do_not_litter: | :do_not_litter: | :non-potable_water: | :non-potable_water: |
:no_pedestrians: | :no_pedestrians: | :no_mobile_phones: | :no_mobile_phones: |
:underage: | :underage: | :radioactive: | :radioactive: |
:biohazard: | :biohazard: |
emoji | code | emoji | code |
---|---|---|---|
:arrow_up: | :arrow_up: | :arrow_upper_right: | :arrow_upper_right: |
:arrow_right: | :arrow_right: | :arrow_lower_right: | :arrow_lower_right: |
:arrow_down: | :arrow_down: | :arrow_lower_left: | :arrow_lower_left: |
:arrow_left: | :arrow_left: | :arrow_upper_left: | :arrow_upper_left: |
:arrow_up_down: | :arrow_up_down: | :left_right_arrow: | :left_right_arrow: |
:leftwards_arrow_with_hook: | :leftwards_arrow_with_hook: | :arrow_right_hook: | :arrow_right_hook: |
:arrow_heading_up: | :arrow_heading_up: | :arrow_heading_down: | :arrow_heading_down: |
:arrows_clockwise: | :arrows_clockwise: | :arrows_counterclockwise: | :arrows_counterclockwise: |
:back: | :back: | :end: | :end: |
:on: | :on: | :soon: | :soon: |
:top: | :top: |
emoji | code | emoji | code |
---|---|---|---|
:place_of_worship: | :place_of_worship: | :atom_symbol: | :atom_symbol: |
:om: | :om: | :star_of_david: | :star_of_david: |
:wheel_of_dharma: | :wheel_of_dharma: | :yin_yang: | :yin_yang: |
:latin_cross: | :latin_cross: | :orthodox_cross: | :orthodox_cross: |
:star_and_crescent: | :star_and_crescent: | :peace_symbol: | :peace_symbol: |
:menorah: | :menorah: | :six_pointed_star: | :six_pointed_star: |
emoji | code | emoji | code |
---|---|---|---|
:aries: | :aries: | :taurus: | :taurus: |
:gemini: | :gemini: | :cancer: | :cancer: |
:leo: | :leo: | :virgo: | :virgo: |
:libra: | :libra: | :scorpius: | :scorpius: |
:sagittarius: | :sagittarius: | :capricorn: | :capricorn: |
:aquarius: | :aquarius: | :pisces: | :pisces: |
:ophiuchus: | :ophiuchus: |
emoji | code | emoji | code |
---|---|---|---|
:twisted_rightwards_arrows: | :twisted_rightwards_arrows: | :repeat: | :repeat: |
:repeat_one: | :repeat_one: | :arrow_forward: | :arrow_forward: |
:fast_forward: | :fast_forward: | :next_track_button: | :next_track_button: |
:play_or_pause_button: | :play_or_pause_button: | :arrow_backward: | :arrow_backward: |
:rewind: | :rewind: | :previous_track_button: | :previous_track_button: |
:arrow_up_small: | :arrow_up_small: | :arrow_double_up: | :arrow_double_up: |
:arrow_down_small: | :arrow_down_small: | :arrow_double_down: | :arrow_double_down: |
:pause_button: | :pause_button: | :stop_button: | :stop_button: |
:record_button: | :record_button: | :eject_button: | :eject_button: |
:cinema: | :cinema: | :low_brightness: | :low_brightness: |
:high_brightness: | :high_brightness: | :signal_strength: | :signal_strength: |
:vibration_mode: | :vibration_mode: | :mobile_phone_off: | :mobile_phone_off: |
emoji | code | emoji | code |
---|---|---|---|
:female_sign: | :female_sign: | :male_sign: | :male_sign: |
:transgender_symbol: | :transgender_symbol: |
emoji | code | emoji | code |
---|---|---|---|
:heavy_multiplication_x: | :heavy_multiplication_x: | :heavy_plus_sign: | :heavy_plus_sign: |
:heavy_minus_sign: | :heavy_minus_sign: | :heavy_division_sign: | :heavy_division_sign: |
:infinity: | :infinity: |
emoji | code | emoji | code |
---|---|---|---|
:bangbang: | :bangbang: | :interrobang: | :interrobang: |
:question: | :question: | :grey_question: | :grey_question: |
:grey_exclamation: | :grey_exclamation: | :exclamation: | :exclamation: :heavy_exclamation_mark: |
:wavy_dash: | :wavy_dash: |
emoji | code | emoji | code |
---|---|---|---|
:currency_exchange: | :currency_exchange: | :heavy_dollar_sign: | :heavy_dollar_sign: |
emoji | code | emoji | code |
---|---|---|---|
:medical_symbol: | :medical_symbol: | :recycle: | :recycle: |
:fleur_de_lis: | :fleur_de_lis: | :trident: | :trident: |
:name_badge: | :name_badge: | :beginner: | :beginner: |
:o: | :o: | :white_check_mark: | :white_check_mark: |
:ballot_box_with_check: | :ballot_box_with_check: | :heavy_check_mark: | :heavy_check_mark: |
:x: | :x: | :negative_squared_cross_mark: | :negative_squared_cross_mark: |
:curly_loop: | :curly_loop: | :loop: | :loop: |
:part_alternation_mark: | :part_alternation_mark: | :eight_spoked_asterisk: | :eight_spoked_asterisk: |
:eight_pointed_black_star: | :eight_pointed_black_star: | :sparkle: | :sparkle: |
:copyright: | :copyright: | :registered: | :registered: |
:tm: | :tm: |
emoji | code | emoji | code |
---|---|---|---|
:hash: | :hash: | :asterisk: | :asterisk: |
:zero: | :zero: | :one: | :one: |
:two: | :two: | :three: | :three: |
:four: | :four: | :five: | :five: |
:six: | :six: | :seven: | :seven: |
:eight: | :eight: | :nine: | :nine: |
:keycap_ten: | :keycap_ten: |
emoji | code | emoji | code |
---|---|---|---|
:capital_abcd: | :capital_abcd: | :abcd: | :abcd: |
:1234: | :1234: | :symbols: | :symbols: |
:abc: | :abc: | :a: | :a: |
:ab: | :ab: | :b: | :b: |
:cl: | :cl: | :cool: | :cool: |
:free: | :free: | :information_source: | :information_source: |
:id: | :id: | :m: | :m: |
:new: | :new: | :ng: | :ng: |
:o2: | :o2: | :ok: | :ok: |
:parking: | :parking: | :sos: | :sos: |
:up: | :up: | :vs: | :vs: |
:koko: | :koko: | :sa: | :sa: |
:u6708: | :u6708: | :u6709: | :u6709: |
:u6307: | :u6307: | :ideograph_advantage: | :ideograph_advantage: |
:u5272: | :u5272: | :u7121: | :u7121: |
:u7981: | :u7981: | :accept: | :accept: |
:u7533: | :u7533: | :u5408: | :u5408: |
:u7a7a: | :u7a7a: | :congratulations: | :congratulations: |
:secret: | :secret: | :u55b6: | :u55b6: |
:u6e80: | :u6e80: |
emoji | code | emoji | code |
---|---|---|---|
:red_circle: | :red_circle: | :orange_circle: | :orange_circle: |
:yellow_circle: | :yellow_circle: | :green_circle: | :green_circle: |
:large_blue_circle: | :large_blue_circle: | :purple_circle: | :purple_circle: |
:brown_circle: | :brown_circle: | :black_circle: | :black_circle: |
:white_circle: | :white_circle: | :red_square: | :red_square: |
:orange_square: | :orange_square: | :yellow_square: | :yellow_square: |
:green_square: | :green_square: | :blue_square: | :blue_square: |
:purple_square: | :purple_square: | :brown_square: | :brown_square: |
:black_large_square: | :black_large_square: | :white_large_square: | :white_large_square: |
:black_medium_square: | :black_medium_square: | :white_medium_square: | :white_medium_square: |
:black_medium_small_square: | :black_medium_small_square: | :white_medium_small_square: | :white_medium_small_square: |
:black_small_square: | :black_small_square: | :white_small_square: | :white_small_square: |
:large_orange_diamond: | :large_orange_diamond: | :large_blue_diamond: | :large_blue_diamond: |
:small_orange_diamond: | :small_orange_diamond: | :small_blue_diamond: | :small_blue_diamond: |
:small_red_triangle: | :small_red_triangle: | :small_red_triangle_down: | :small_red_triangle_down: |
:diamond_shape_with_a_dot_inside: | :diamond_shape_with_a_dot_inside: | :radio_button: | :radio_button: |
:white_square_button: | :white_square_button: | :black_square_button: | :black_square_button: |
emoji | code | emoji | code |
---|---|---|---|
:checkered_flag: | :checkered_flag: | :triangular_flag_on_post: | :triangular_flag_on_post: |
:crossed_flags: | :crossed_flags: | :black_flag: | :black_flag: |
:white_flag: | :white_flag: | :rainbow_flag: | :rainbow_flag: |
:transgender_flag: | :transgender_flag: | :pirate_flag: | :pirate_flag: |
emoji | code | emoji | code |
---|---|---|---|
:ascension_island: | :ascension_island: | :andorra: | :andorra: |
:united_arab_emirates: | :united_arab_emirates: | :afghanistan: | :afghanistan: |
:antigua_barbuda: | :antigua_barbuda: | :anguilla: | :anguilla: |
:albania: | :albania: | :armenia: | :armenia: |
:angola: | :angola: | :antarctica: | :antarctica: |
:argentina: | :argentina: | :american_samoa: | :american_samoa: |
:austria: | :austria: | :australia: | :australia: |
:aruba: | :aruba: | :aland_islands: | :aland_islands: |
:azerbaijan: | :azerbaijan: | :bosnia_herzegovina: | :bosnia_herzegovina: |
:barbados: | :barbados: | :bangladesh: | :bangladesh: |
:belgium: | :belgium: | :burkina_faso: | :burkina_faso: |
:bulgaria: | :bulgaria: | :bahrain: | :bahrain: |
:burundi: | :burundi: | :benin: | :benin: |
:st_barthelemy: | :st_barthelemy: | :bermuda: | :bermuda: |
:brunei: | :brunei: | :bolivia: | :bolivia: |
:caribbean_netherlands: | :caribbean_netherlands: | :brazil: | :brazil: |
:bahamas: | :bahamas: | :bhutan: | :bhutan: |
:bouvet_island: | :bouvet_island: | :botswana: | :botswana: |
:belarus: | :belarus: | :belize: | :belize: |
:canada: | :canada: | :cocos_islands: | :cocos_islands: |
:congo_kinshasa: | :congo_kinshasa: | :central_african_republic: | :central_african_republic: |
:congo_brazzaville: | :congo_brazzaville: | :switzerland: | :switzerland: |
:cote_divoire: | :cote_divoire: | :cook_islands: | :cook_islands: |
:chile: | :chile: | :cameroon: | :cameroon: |
:cn: | :cn: | :colombia: | :colombia: |
:clipperton_island: | :clipperton_island: | :costa_rica: | :costa_rica: |
:cuba: | :cuba: | :cape_verde: | :cape_verde: |
:curacao: | :curacao: | :christmas_island: | :christmas_island: |
:cyprus: | :cyprus: | :czech_republic: | :czech_republic: |
:de: | :de: | :diego_garcia: | :diego_garcia: |
:djibouti: | :djibouti: | :denmark: | :denmark: |
:dominica: | :dominica: | :dominican_republic: | :dominican_republic: |
:algeria: | :algeria: | :ceuta_melilla: | :ceuta_melilla: |
:ecuador: | :ecuador: | :estonia: | :estonia: |
:egypt: | :egypt: | :western_sahara: | :western_sahara: |
:eritrea: | :eritrea: | :es: | :es: |
:ethiopia: | :ethiopia: | :eu: | :eu: :european_union: |
:finland: | :finland: | :fiji: | :fiji: |
:falkland_islands: | :falkland_islands: | :micronesia: | :micronesia: |
:faroe_islands: | :faroe_islands: | :fr: | :fr: |
:gabon: | :gabon: | :gb: | :gb: :uk: |
:grenada: | :grenada: | :georgia: | :georgia: |
:french_guiana: | :french_guiana: | :guernsey: | :guernsey: |
:ghana: | :ghana: | :gibraltar: | :gibraltar: |
:greenland: | :greenland: | :gambia: | :gambia: |
:guinea: | :guinea: | :guadeloupe: | :guadeloupe: |
:equatorial_guinea: | :equatorial_guinea: | :greece: | :greece: |
:south_georgia_south_sandwich_islands: | :south_georgia_south_sandwich_islands: | :guatemala: | :guatemala: |
:guam: | :guam: | :guinea_bissau: | :guinea_bissau: |
:guyana: | :guyana: | :hong_kong: | :hong_kong: |
:heard_mcdonald_islands: | :heard_mcdonald_islands: | :honduras: | :honduras: |
:croatia: | :croatia: | :haiti: | :haiti: |
:hungary: | :hungary: | :canary_islands: | :canary_islands: |
:indonesia: | :indonesia: | :ireland: | :ireland: |
:israel: | :israel: | :isle_of_man: | :isle_of_man: |
:india: | :india: | :british_indian_ocean_territory: | :british_indian_ocean_territory: |
:iraq: | :iraq: | :iran: | :iran: |
:iceland: | :iceland: | :it: | :it: |
:jersey: | :jersey: | :jamaica: | :jamaica: |
:jordan: | :jordan: | :jp: | :jp: |
:kenya: | :kenya: | :kyrgyzstan: | :kyrgyzstan: |
:cambodia: | :cambodia: | :kiribati: | :kiribati: |
:comoros: | :comoros: | :st_kitts_nevis: | :st_kitts_nevis: |
:north_korea: | :north_korea: | :kr: | :kr: |
:kuwait: | :kuwait: | :cayman_islands: | :cayman_islands: |
:kazakhstan: | :kazakhstan: | :laos: | :laos: |
:lebanon: | :lebanon: | :st_lucia: | :st_lucia: |
:liechtenstein: | :liechtenstein: | :sri_lanka: | :sri_lanka: |
:liberia: | :liberia: | :lesotho: | :lesotho: |
:lithuania: | :lithuania: | :luxembourg: | :luxembourg: |
:latvia: | :latvia: | :libya: | :libya: |
:morocco: | :morocco: | :monaco: | :monaco: |
:moldova: | :moldova: | :montenegro: | :montenegro: |
:st_martin: | :st_martin: | :madagascar: | :madagascar: |
:marshall_islands: | :marshall_islands: | :macedonia: | :macedonia: |
:mali: | :mali: | :myanmar: | :myanmar: |
:mongolia: | :mongolia: | :macau: | :macau: |
:northern_mariana_islands: | :northern_mariana_islands: | :martinique: | :martinique: |
:mauritania: | :mauritania: | :montserrat: | :montserrat: |
:malta: | :malta: | :mauritius: | :mauritius: |
:maldives: | :maldives: | :malawi: | :malawi: |
:mexico: | :mexico: | :malaysia: | :malaysia: |
:mozambique: | :mozambique: | :namibia: | :namibia: |
:new_caledonia: | :new_caledonia: | :niger: | :niger: |
:norfolk_island: | :norfolk_island: | :nigeria: | :nigeria: |
:nicaragua: | :nicaragua: | :netherlands: | :netherlands: |
:norway: | :norway: | :nepal: | :nepal: |
:nauru: | :nauru: | :niue: | :niue: |
:new_zealand: | :new_zealand: | :oman: | :oman: |
:panama: | :panama: | :peru: | :peru: |
:french_polynesia: | :french_polynesia: | :papua_new_guinea: | :papua_new_guinea: |
:philippines: | :philippines: | :pakistan: | :pakistan: |
:poland: | :poland: | :st_pierre_miquelon: | :st_pierre_miquelon: |
:pitcairn_islands: | :pitcairn_islands: | :puerto_rico: | :puerto_rico: |
:palestinian_territories: | :palestinian_territories: | :portugal: | :portugal: |
:palau: | :palau: | :paraguay: | :paraguay: |
:qatar: | :qatar: | :reunion: | :reunion: |
:romania: | :romania: | :serbia: | :serbia: |
:ru: | :ru: | :rwanda: | :rwanda: |
:saudi_arabia: | :saudi_arabia: | :solomon_islands: | :solomon_islands: |
:seychelles: | :seychelles: | :sudan: | :sudan: |
:sweden: | :sweden: | :singapore: | :singapore: |
:st_helena: | :st_helena: | :slovenia: | :slovenia: |
:svalbard_jan_mayen: | :svalbard_jan_mayen: | :slovakia: | :slovakia: |
:sierra_leone: | :sierra_leone: | :san_marino: | :san_marino: |
:senegal: | :senegal: | :somalia: | :somalia: |
:suriname: | :suriname: | :south_sudan: | :south_sudan: |
:sao_tome_principe: | :sao_tome_principe: | :el_salvador: | :el_salvador: |
:sint_maarten: | :sint_maarten: | :syria: | :syria: |
:swaziland: | :swaziland: | :tristan_da_cunha: | :tristan_da_cunha: |
:turks_caicos_islands: | :turks_caicos_islands: | :chad: | :chad: |
:french_southern_territories: | :french_southern_territories: | :togo: | :togo: |
:thailand: | :thailand: | :tajikistan: | :tajikistan: |
:tokelau: | :tokelau: | :timor_leste: | :timor_leste: |
:turkmenistan: | :turkmenistan: | :tunisia: | :tunisia: |
:tonga: | :tonga: | :tr: | :tr: |
:trinidad_tobago: | :trinidad_tobago: | :tuvalu: | :tuvalu: |
:taiwan: | :taiwan: | :tanzania: | :tanzania: |
:ukraine: | :ukraine: | :uganda: | :uganda: |
:us_outlying_islands: | :us_outlying_islands: | :united_nations: | :united_nations: |
:us: | :us: | :uruguay: | :uruguay: |
:uzbekistan: | :uzbekistan: | :vatican_city: | :vatican_city: |
:st_vincent_grenadines: | :st_vincent_grenadines: | :venezuela: | :venezuela: |
:british_virgin_islands: | :british_virgin_islands: | :us_virgin_islands: | :us_virgin_islands: |
:vietnam: | :vietnam: | :vanuatu: | :vanuatu: |
:wallis_futuna: | :wallis_futuna: | :samoa: | :samoa: |
:kosovo: | :kosovo: | :yemen: | :yemen: |
:mayotte: | :mayotte: | :south_africa: | :south_africa: |
:zambia: | :zambia: | :zimbabwe: | :zimbabwe: |
emoji | code | emoji | code |
---|---|---|---|
:england: | :england: | :scotland: | :scotland: |
:wales: | :wales: |
It’s pretty cool :sunglasses: to see all these emojis on a single page :page_with_curl:…
Happy emoji :smile: and happy coding :thinking:… :tada:
]]>working Windows/macOS system
a fast SSD drive, the faster the better
wired keyboard and/or mouse (MacBook’s keyboard and touchpad won’t work during Windows installation)
Download the Windows 11 ISO from Microsoft’s official site: https://www.microsoft.com/software-download/windows11.
Download Rufus, a Windows software to create portable Windows installation on external SSD.
On a working Windows system, run Rufus to write Windows installations files to SSD with the following steps:
Choose the SSD device that will hold the Windows system. If the targeted SSD drive is not shown in the list, select the List USB Hard Drives in the Hide advanced drive properties section.
Select the Windows 11 ISO file that just downloaded.
Switch the Image option to Windows To Go mode.
Click START to write files. This will take a while, which depends on the speed of the SSD.
Then back to macOS, download the Windows Support Software (drivers) from Boot Camp Assistant:
It’s okay to copy the downloaded package to the external SSD that just operated with Rufus.
Restart the MacBook, press and hold the command (⌘) + R key combination to start up from the built-in macOS Recovery system.
When you see the macOS Utilities windows, choose Utilities
> Startup Security Utility
from the menu bar.
Then select the No Security
and Allow booting from external or removable media
options:
Now, restart the MacBook again, and press and hold the option (⌥) during startup. Then select the external SSD drive, and follow the guides to install Windows 11. You will need a wired keyboard/mouse as the MacBook’s drivers are not working during this process.
After finishing Windows 11 installation, boot into the Windows system (press and hold the option).
Install the Windows Support Software that got from the Boot Camp Assistant, this will make most of the device drivers (i.e., keyboard, touchpad, bluetooth, and wireless network) work.
For me, even though Windows Support Software was installed, some drivers still did not function well (yellow “!” in Device Manager ). I have to install them manually.
In Device Manager, select the device and right-click to select the Update Driver option. Choose the Browse my computer for drivers option:
The drivers can be found in the downloaded package from Boot Camp Assistant, here I’ve put the files under C:\WindowsSupport
folder. Make sure the Include subfolders
were selected, it will automatically choose the corresponding driver to install/update:
After the above installations, all devices should work as normal. You’d better run Apple Software Update for Windows to get updated software and drivers. Windows Update will help update some required drivers as well.
That’s it. To work on Windows 11, just plug in the SSD drive and boot from it (press and hold the option). The performance is much better than Virtual Machines… :smiley:
]]>sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable
sudo apt update
sudo apt install qbittorrent-nox
qBittorrent-nox (without X) is meant to be controlled via its Web UI which is accessible as a default at http://localhost:8080
. The Web UI access is secured and the default account username is admin
with adminadmin
as default password…
Create a systemd service file for qBittorrent-nox that restart it automatically on system reboot:
sudo nano /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qBittorrent-noxAfter=network.target
[Service]
Type=forkingExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080Restart=on-failure
[Install]
WantedBy=multi-user.target
If there’s another service running on port 8080
, just change to another available port and set the -d --web-port=xxxx
accordingly.
Then run following commands to enable and start this service:
sudo systemctl daemon-reload
sudo systemctl enable qbittorrent-nox
sudo systemctl start qbittorrent-nox
Check its running status by;
sudo systemctl status qbittorrent-nox
Following location directive should enough;
location/{proxy_redirectoff;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection"upgrade";proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_passhttp://localhost:8080;# qBittorrent-nox running port}
You can proxy it to sub locations as well.
Now you can access qBittorrent-nox Web UI with your settings, don’t forget to change the default password in the Web UI… 😎
First clone the git repository:
cd /opt
git clone https://github.com/dracula/qbittorrent.git
chmod-R 777 qbittorrent
Then enable the theme from Web UI: Tools
-> Options
-> Web UI
-> Use alternative Web UI
, in Files locations
bar, you should type /opt/qbittorrent/webui
. 🥷
Before we start, some limitations of the Deta platform need to be noted.
For such a simple pageview counter, all these limitations won’t cause any problems.
Okay, let’s start our journey.
First, install the Deta CLI.
For macOS and Linux:
curl -fsSL https://get.deta.dev/cli.sh | sh
For Windows PowerShell:
iwr https://get.deta.dev/cli.ps1 -useb | iex
This will download the binary which contains the CLI code. It will try to export the deta
command to your path.
Once you have successfully installed the Deta CLI, you’ll need to log in to Deta with your credentials.
From your Terminal:
deta login
Deta Micros (micro servers) are a lightweight but scalable cloud runtime tied to an HTTP endpoint. They are meant to get your apps up and running blazingly fast. Focus on writing your code and Deta will take care of everything else.
To create a Micro, navigate in the Terminal to a parent directory and type:
deta new --node pageview
This will create a new Node.js Micro called pageview
which will contain an index.js
file.
Enter the pageview
directory, and setup the dependencies:
cd pageview
yarn init -y
yarn add express
This initialised the project with the Express.js framework, with the following contents in the index.js
file:
constexpress=require('express');constapp=express();app.get('/',async (req,res)=>{res.send('Hello World')});module.exports=app;
Don’t rename the filename of index.js
and the application name of app
as they’re required by the Deta Micros.
Then, just coding as normal Express app…
After updating the dependencies, use deta deploy
to update the Micro in the cloud:
deta deploy
Well, the starter project is up and running :star2:. We can now visit the endpoint (use deta details
to find the URL).
Currently, only the GET
/
router is implemented, which just returns a string Hello World
.
The workflow is just like this, coding in the index.js
file and then deploying to the cloud with deta deploy
. Of course, you can spread the middlewares, routers, controllers, et al. in different folders and files as usual, here we just condense on the single index.js
file for simplicity.
Deta Base is a fully-managed, fast, scalable and secure NoSQL database with a focus on end-user simplicity. It offers a UI through which you can easily see, query, update and delete records in the database.
Okay, still in the pageview
folder, add the deta
package into our project:
yarn add deta
Since we’re connecting the Base database from the Micros, we don’t need to care about the credentials for the connection, valid keys are pre-set in the Micro’s environment.
To create a database named pageview
, just update the index.js
as:
constexpress=require('express');const{Base}=require('deta');constapp=express();// connect or create a databaseconstpv=Base('pageview');// ...
Here, we’re going to set a POST
router to receive the JSON data, update the database and then return the updated data to the client (the website).
Inside the Base database, we can use the url
string as the unique key
to store and query the data3. But you can also format the url
to MD5 string or anything compatible as the identifying key
, that’s really up to you.
constexpress=require('express');const{Base}=require('deta');constapp=express();// parse json data from request.bodyapp.use(express.json());// CORS...app.use((_req,res,next)=>{// you should know what you're doing here...// more information at// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Originres.set('Access-Control-Allow-Origin','*');res.set('Access-Control-Allow-Methods','GET,PUT,POST,DELETE');next();});// connect to the 'pageview' database in Baseconstpv=Base('pageview');app.post('/',async (req,res)=>{try{const{url,title}=req.body;constkey=url;// check the record is existing in the databaseconstrecord=awaitpv.get(key);// the default counter/hits numberlethits=1;// if the record exits, update the counter on 'hits' propertyif (record){hits=record.hits+1}constdata={title,url,hits};// put updated data to the databaseconstupdatedRecord=awaitpv.put(data,key);// return the updated data as a JSON object// structured as { title, url, hits }returnres.status(200).json(updatedRecord);}catch (err){returnres.status(500).send(err.message);}});// export 'app'module.exports=app;
On the client-side, we can use the Fetch API to send data (the url
and title
) to the endpoint (by deta details
) and get the most updated pageview hits
whenever a visitor hits a page :tada:.
For example:
constdata={url:document.URL,title:document.title};// your deta micro urlconstdetaURL='https://xxxx.deta.dev';fetch(detaURL,{method:'POST',headers:{'Content-Type':'application/json',},body:JSON.stringify(data),}).then(response=>response.json()).then(data=>{console.log('Success:',data);const{hits}=data;// the pageview number here...}).catch((error)=>{console.error('Error:',error);});
That’s all about this simple pageview counter with Deta.sh services. You can add more layers about security and functions with all the free resources.
In the real implementation on this Jekyll site, I’m using RudderStack to capture the pageview events (using Beacon API) and push them to the Deta Base database in the cloud. Thus, on the frontend, just need to GET
the data with a unique id
to retrieve the pageview counts. The id
is generated with url
and marked with MD5:
{{page.url|prepend:site.url|replace:'index.html',''|md5|slice:0,14}}
# output like
# 89a323f52193af
In the Micro, just add a new GET
router like app.get('/:id', ...)
for fetching data. Also, the recent visits are returned from the same GET
request, see it’s live on the sidebar… :point_right:
The Deta.sh platform is great to serve microservices without any charges, just like the one about the pageview counter presented in this post. Don’t hesitate to use these resources to implement your ideas.
]]>原本想用 MongoDB 作为数据库练练手的,但是 Micros 目前不支持连接 MongoDB,只能作罢 :rofl:。
Deta 也提供了 Base 数据库 (NoSQL),并且容量和读写次数都不限 :+1:,在同一平台上运行,理当性能是不错滴。所以也把之前放在 Google Firestore 上的网页访问量数据库也挪到 Deta Base 上来了。
因为懒嘛,没做数据迁移,直接舍弃了之前的数据,从零开始计数了。之前从 LeanCloud 迁移到 Firestore 也没有保留数据,真是懒呀 :sleeping:~
粗略的搭建过程见 Building a pageview counter with Deta.sh Micros and Base database :100:。
此外,我还发现了一个很好用的浏览量统计系统,GoatCounter,免费版提供 100k pageviews/month,支持自定义域名,也有 API 返回统计数据,还支持公开数据统计页面。对博客网站来说,完全可以用来替代 GA4 这些 :+1:。
PPS,https://pixe.la 这个非常适合用来做数据统计嘛,反正也是要在 Micros 中写入数据库的,也顺道把数据推送到 Pixe Graph 中,下面就是实时的 Graph…
最近疫情反反复复,大家注意防护 :mask:, 祝大家安康!:muscle:
]]>If you’re looking for a self-hosted file share and sync platform, then Nextcloud should be a good place to start. I’ll show you how to install and configure Nextcloud on your own Ubuntu server with an Nginx web server and a remote PlanetScale cloud database.
Nextcloud requires a web server to function, and Nginx is my choice. To install Nginx on Ubuntu, run the commands below:
sudo apt update
sudo apt install nginx
Just leave the Nginx installed, we will configure the Nginx in the next sections.
Nginx version consideration:
If you’re preferring the newest mainline version of Nginx, you can install it by following the official guides.
Ubuntu has packages for all required PHP modules, just install them. Here, I’m going to use PHP 8.1 for example.
First, have the PHP FastCGI Process Manager (FPM) installed, other related PHP modules will be installed along with php-fpm
:
sudo apt install php-fpm
Then, install other PHP modules. The required modules for Nextcloud are1:
Check the installed PHP modules by php -m
.
Any missing modules can be installed via apt
. For example, to install the PHP module curl, just run sudo apt install php-curl
.
Probably, you need to further install the following modules:
sudo apt install php-curl php-dom php-gd php-mbstring php-zip
For database connection, we need to install one of the following modules:
Since I’m going to use PlanetScale database (MySQL-compatible serverless database2), just install the php-mysql
module:
sudo apt install php-mysql
Also, Nextcloud has recommended several packages, go ahead to install them.
sudo apt install php-fileinfo php-bz2 php-intl
Except for smbclient
, other modules are easy to configure:
sudo apt install php-ldap php-ftp php-imap php-bcmath php-gmp php-exif
For more details about SMB, please read the Nextcloud docs.
Select one of the following memcaches:
I’m going to use the APCu, configurations will be included in the next optimisation section.
sudo apt install php-apcu
Well, I’m not going to use Office suits in Nextcloud, just ignore them…
sudo apt install php-imagick ffmpeg
PlanetScale provides a free hobby option with the following limits:
5GB storage/mo
1 billion row reads/mo
10 million row writes/mo
Check the pricing page for more details, I’m okay with the free version for personal Nextcloud usage…
First, use the PlanetScale CLI (pscale
) to set up a local proxy for the cloud database, which is available as downloadable binaries from the releases page.
For Ubuntu, download the .deb
file, e.g.:
wget "https://github.com/planetscale/cli/releases/download/v0.91.0/pscale_0.91.0_linux_arm64.deb"
Here, I’m running Ubuntu on an ARM-architecture server, choose the corresponding version of your server.
Then install the pscale
CLI:
sudo dpkg -i ./pscale_0.91.0_linux_arm64.deb
# check it's working
pscale --help# remove the deb file, no longer needed# rm ./pscale_0.91.0_linux_arm64.deb
Also, pscale
requires the MySQL command-line client to function, install it via apt
:
sudo apt install mysql-client
After installing the pscale
CLI, sign in to PlanetScale with this command:
pscale auth login
You can now use pscale
to create a new database:
pscale db create nextcloud-database
Currently, the following regions are supported 3, with their respective slugs:
- US East - Northern Virginia
us-east
- US West - Oregon
us-west
- EU West - Dublin
eu-west
- Asia Pacific - Mumbai
ap-south
- Asia Pacific - Singapore
ap-southeast
- Asia Pacific - Tokyo
ap-northeast
Create new database with specific region,
eu-west
for example:pscale db create <database-name> --region eu-west
Select the region closet to your server to reduce latency.
Connect to the cloud database with the following command:
pscale connect nextcloud-database main
Here, it’s connected to the main
branch of the nextcloud-database
database. For more about the branching features of the PlanetScale database, see Branching.
Make sure it’s running well, and check it’s running on 127.0.0.1:3306
, or other ports if 3306
was already used.
Now, the PlanetScale MySQL database is ready, just treated it as a local running database.
Keep the pscale connect
running, and start a new SSH connection to your server.
Back to the installation of Nextcloud:
Go to the Nextcloud Download Page.
Go to Download Nextcloud Server > Community Projects > Archive, and download either the tar.bz2 or .zip archive. For example:
wget https://download.nextcloud.com/server/releases/latest.zip
This downloads a file named latest.zip
.
Now you can extract the archive contents. Run the appropriate unpacking command for your archive type:
unzip latest.zip
This unpacks a single nextcloud
directory. Move the nextcloud
directory to its final destination. For Nginx:
sudo mv ./nextcloud/ /usr/share/nginx/
# check it's existing# ls -l /usr/share/nginx/
Change the ownership of the nextcloud
directory to the HTTP user (www-data
):
sudo chown-R www-data:www-data /usr/share/nginx/nextcloud/
Use the Nextcloud occ
command to complete the installation:
cd /usr/share/nginx/nextcloud/
sudo-u www-data php occ maintenance:install \ --database"mysql"--database-name"nextcloud-database"\--database-user"root"--database-pass""--database-host"127.0.0.1"\--admin-user"<your-admin-name>"--admin-pass"<your-password>"--admin-email"<your-email>"
This might take several minutes to finish the installation as Nextcloud populates database schema to PlanetScale, please wait. When it’s done, you should see:
Nextcloud was successfully installed
Notes: The database name should be the same as you created with pscale db create
. There’s no need to fill in the database password, leave it blank as ""
. I found that I cannot install with too complicated admin-pass
, so choose a simple password and then change the password in the Nextcloud web interface after installation.
After the Nextcloud was installed, we can leave off the pscale
CLI for proxying the database.
First, create a new password for our database with pscale
CLI, e.g.:
# usage# pscale password create <database> <branch> <name>
pscale password create nextcloud-database main db-admin
Keep a record of the generated credentials, it will only show once.
Now, setting the /usr/share/nginx/nextcloud/config/config.php
file for directly connected to the remote PlanetScale database:
'dbname'=>'nextcloud-database','dbhost'=>'<your-db-host>','dbport'=>'','dbuser'=>'<your-db-user-name>','dbpassword'=>'<your-db-password>','dbdriveroptions'=>array(PDO::MYSQL_ATTR_SSL_CA=>'/etc/ssl/certs/ca-certificates.crt',),
If you’re using other systems, change the root CA cert path correspondingly. See root CA configuration for more details.
Then, check the database connection with sudo -u www-data php /usr/share/nginx/nextcloud/occ status
, should have no error prompts.
Just copied it from Nextcloud’s document, which it’s working well.
For example, create a configuration file as /etc/nginx/conf.d/cloud.example.com.conf
with the following contents:
upstreamphp-handler{serverunix:/var/run/php/php8.1-fpm.sock;}server{listen80;listen[::]:80;server_namecloud.example.com;return301https://$host$request_uri;}server{listen443sslhttp2;listen[::]:443sslhttp2;server_namecloud.example.com;# Path to the root of your installationroot/usr/share/nginx/nextcloud;resolver[2606:4700:4700::1111]9.9.9.91.1.1.1[2620:fe::fe];# Use Mozilla's guidelines for SSL/TLS settings# https://mozilla.github.io/server-side-tls/ssl-config-generator/ssl_certificate<path-to>/fullchain.pem;ssl_certificate_key<path-to>/priv.pem;# OCSP staplingssl_staplingon;ssl_stapling_verifyon;ssl_trusted_certificate<path-to>/fullchain.pem;# SSL cache for returned visitorsssl_session_cacheshared:MozSSL:10m;# about 40000 sessionsssl_session_timeout1d;ssl_session_ticketsoff;# https://ssl-config.mozilla.org# intermediate configurationssl_protocolsTLSv1.2TLSv1.3;ssl_ciphersECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphersoff;access_log/var/log/nginx/access.logmain;error_log/var/log/nginx/error.logerror;# HTTP response headers borrowed from Nextcloud `.htaccess`add_headerReferrer-Policy"no-referrer"always;add_headerX-Content-Type-Options"nosniff"always;add_headerX-Download-Options"noopen"always;add_headerX-Frame-Options"SAMEORIGIN"always;add_headerX-Permitted-Cross-Domain-Policies"none"always;add_headerX-Robots-Tag"none"always;add_headerX-XSS-Protection"1;mode=block"always;add_headerStrict-Transport-Security"max-age=15552001"always;# Remove X-Powered-By, which is an information leakfastcgi_hide_headerX-Powered-By;indexindex.phpindex.html/index.php$request_uri;# set max upload sizeclient_max_body_size256M;fastcgi_buffers644K;# Enable gzip but do not remove ETag headersgzipon;gzip_varyon;gzip_comp_level4;gzip_min_length256;gzip_proxiedexpiredno-cacheno-storeprivateno_last_modifiedno_etagauth;gzip_typesapplication/atom+xmlapplication/javascriptapplication/jsonapplication/ld+jsonapplication/manifest+jsonapplication/rss+xmlapplication/vnd.geo+jsonapplication/vnd.ms-fontobjectapplication/x-font-ttfapplication/x-web-app-manifest+jsonapplication/xhtml+xmlapplication/xmlfont/opentypeimage/bmpimage/svg+xmlimage/x-icontext/cache-manifesttext/csstext/plaintext/vcardtext/vnd.rim.location.xloctext/vtttext/x-componenttext/x-cross-domain-policy;# Rule borrowed from `.htaccess` to handle Microsoft DAV clientslocation=/{if($http_user_agent~^DavClnt){return302/remote.php/webdav/$is_args$args;}}location=/robots.txt{return200'User-agent:*\nDisallow:/\n';access_logoff;}# Make a regex exception for `/.well-known` so that clients can still# access it despite the existence of the regex rule# `location ~ /(\.|autotest|...)` which would otherwise handle requests# for `/.well-known`.location^~/.well-known{# The rules in this block are an adaptation of the rules# in `.htaccess` that concern `/.well-known`.location=/.well-known/carddav{return301/remote.php/dav/;}location=/.well-known/caldav{return301/remote.php/dav/;}location/.well-known/acme-challenge{try_files$uri$uri/=404;}location/.well-known/pki-validation{try_files$uri$uri/=404;}# Let Nextcloud's API for `/.well-known` URIs handle all other# requests by passing them to the front-end controller.return301/index.php$request_uri;}# Rules borrowed from `.htaccess` to hide certain paths from clientslocation~^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/){return404;}location~^/(?:\.|autotest|occ|issue|indie|db_|console){return404;}# Ensure this block, which passes PHP files to the PHP process, is above the blocks# which handle static assets (as seen below). If this block is not declared first,# then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`# to the URI, resulting in a HTTP 500 error response.location~\.php(?:$|/){fastcgi_split_path_info^(.+?\.php)(/.*)$;set$path_info$fastcgi_path_info;try_files$fastcgi_script_name=404;includefastcgi_params;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_paramPATH_INFO$path_info;fastcgi_paramHTTPSon;fastcgi_parammodHeadersAvailabletrue;# Avoid sending the security headers twicefastcgi_paramfront_controller_activetrue;# Enable pretty urlsfastcgi_passphp-handler;fastcgi_intercept_errorson;fastcgi_request_bufferingoff;fastcgi_max_temp_file_size512M;}location~\.(?:css|js|svg|gif|png|jpg|ico)${try_files$uri/index.php$request_uri;expires7d;# Cache-Control policy borrowed from `.htaccess`access_logoff;# Optional: Don't log access to assets}# location ~ \.woff2?$ {# try_files $uri /index.php$request_uri;# expires 7d; # Cache-Control policy borrowed from `.htaccess`# access_log off; # Optional: Don't log access to assets# }# Rule borrowed from `.htaccess`location/remote{return301/remote.php$request_uri;}location/{try_files$uri$uri//index.php$request_uri;}}
Adjust the configuration with your domain name.
Note that we haven’t got SSL certs yet. It’s very easy with acme.sh
, please find my previous post Free ZeroSSL wildcard SSL certificates with acme.sh DNS API to get the cert keys, and replace them with the correct file path of the certs file in the Nginx configuration.
Now, go back to the /usr/share/nginx/nextcloud/config/
folder. The custom domain(s) should be added in the config.php
:
sudo nano /var/www/nextcloud/config/config.php
Adjust the following snippets:
'trusted_domains'=>array(0=>'localhost',1=>'cloud.example.com',2=>'next.example.com',),
Yes, we can add multiple domains, but don’t forget to set the corresponding virtual server(s) in Nginx…
Also, add nginx
to the user group of www-data
that Nginx can access to the unix:/var/run/php/php8.1-fpm.sock
:
sudo usermod -a-G www-data nginx
Restart nginx
and php8.1-fpm
:
sudo systemctl restart nginx
sudo systemctl restart php8.1-fpm
Now, it’s time to visit the Nextcloud instance through the custom domain.
remember to update password if weak password was used during installation
Under https://cloud.example.com/settings/admin/overview/
, several Security & setup warnings might be shown.
Let’s further optimise the php
and nginx
configurations for better security and performance.
Referred to the Nextcloud installation guide.
php.ini
file used by the web server (php-fpm
) is:
/etc/php/8.1/fpm/php.ini
And the php.ini
used by the php-cli and so by the Nextcloud CRON jobs is:
/etc/php/8.1/cli/php.ini
First, go to the web server configuration. In php-fpm
, the system environment variables like PATH
, TPM
, or others are not automatically populated in the same way as when using php-cli
. A PHP call like getenv('PATH')
can therefore return an empty result. Manually configure it in /etc/php/8.1/fpm/pool.d/www.conf
. Usually, you will find some or all of the environment variables already in the file, but commented out like this:
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
Uncomment the appropriate existing entries (remove the leading ;
), and uncommenting this line:
clear_env = no
To increase the maximum upload size, we also need to modify the php-fpm
configuration and increase the upload_max_filesize
and post_max_size
values in /etc/php/8.1/fpm/php.ini
.
post_max_size
: “Sets max size of post data allowed. This setting also affects file upload. To upload large files, this value must be larger thanupload_max_filesize
.”
Update accordingly in the Nginx configuration file for the client_max_body_size
entry.
You will need to restart php-fpm
and Nginx to make these changes to be applied.
sudo systemctl restart php8.1-fpm
sudo systemctl reload nginx
If you’re proxying the Nextcloud by Cloudflare, note that Cloudflare limits the upload size (HTTP POST request size):
- 100MB Free and Pro
- 200MB Business
- 500MB Enterprise by default
To increase the PHP memory limit, edit it in the /etc/php/8.1/fpm/pool.d/www.conf
, like this:
php_admin_value[memory_limit] = 2G
We can significantly improve the Nextcloud server performance with memory caching, where frequently-requested objects are stored in memory for faster retrieval. A memcache is not required and you may safely ignore the warning if you prefer.
Nextcloud supports multiple memory caching backends, so you can choose the type of memcache that best fits your needs. The supported caching backends are:
APCu, APCu 4.0.6 and up required.
A local cache for systems.
Redis, PHP module 2.2.6 and up required.
For local and distributed caching as well as transactional file locking.
For distributed caching.
Memcaches must be explicitly configured in Nextcloud by installing and enabling your desired cache, and then adding the appropriate entry to config.php
(See Configuration Parameters for an overview of all possible config parameters).
Recommended caches are APCu and Redis. Here we go.
APCu is a data cache, and it is available in most Linux distributions. As we already installed the php-apcu
, add this line to the /usr/share/nginx/nextcloud/config/config.php
file:
'memcache.local'=>'\OC\Memcache\APCu',
APCu is disabled by default on CLI which could cause issues with nextcloud’s cron jobs. Please make sure you set the
apc.enable_cli
to1
on yourphp.ini
config file or append--define apc.enable_cli=1
to the cron job call.I’m setting it at
/etc/php/8.1/mods-available/apcu.ini
:extension=apcu.soapc.enable_cli=1
It’s very tricky to set the
apc.enable_cli
, as discussed here: https://github.com/nextcloud/server/issues/27781.
And then check it’s working:
sudo-u www-data php /usr/share/nginx/nextcloud/occ status
The error message looks like this:
OCP\HintException: [0]: Memcache \OC\Memcache\APCu not available for local cache (Is the matching PHP module installed and enabled?)
If no error message is outputted by sudo -u www-data php /usr/share/nginx/nextcloud/occ status
, the APCu is correctly configured.
APCu is faster at local caching than Redis. If you have enough memory, use APCu for Memory Caching and Redis for File Locking. If you are low on memory, use Redis for both.
External storage is disabled by default. Enable it in Apps > Disabled apps
of the Nextcloud web interface. Then add external storage under Settings > Administration > External storage
.
从京东买的国行版,自带固件是没有 play store 的,想想那岂不是白买了 poweramp 么,果断探索新固件~
之前也有小伙伴折腾过:https://lz233.ac.cn/2020/02/10/flash-japanese-firmware-for-sony-a105/,不过官方固件已经更新过好几番了。从索尼中国官网找到了较新的链接:
NW-ZX505, NW-ZX507
https://info.update.sony.net/PA001/NW-ZX500Series_0003/contents/0013/NW-ZX500_0003_V4_04_00_NW_WM_FW.UPG
NW-A105, NW-A105HN, NW-A106HN, NW-A100TPS
https://info.update.sony.net/PA001/NW-A100Series_0003/contents/0013/NW-A100_0003_V4_04_00_NW_WM_FW.UPG
摸索一番,找到了 A105 对应的国际版固件地址:https://info.update.sony.net/PA001/NW-A100Series_0000/contents/0015/NW-A100_0000_V4_06_00_NW_WM_FW.UPG,版本稍稍新一点点。
地址中的两处
0003
替换为0000
,所谓的地区代码。contents
后的数字(0013
,0015
)可能和具体版本有关。
两个固件文件我都下载了,分别是 486MB 和 907MB,国际版的文件还是大不少。
接下来的步骤就差不多了:
将新的 .UPG
固件文件拷贝到播放器文件系统根目录下。
断开网络连接。
进入 设置 -> 系统 -> 高级 -> 系统更新 就可以发现新的固件,点击 开始更新 即可。(貌似需要插着电源才能更新~)
重启,完成设置。
以上。
]]>PS,据说后续更新也需要手动下载文件,通过系统自带的更新程序或 Music Center 更新都会变回国行固件,暂未体验,有了新的更新再说吧🤪。
First install the geoipupdate
package provided by MaxMind.
sudo add-apt-repository ppa:maxmind/ppa
sudo apt update
sudo apt install geoipupdate libmaxminddb0 libmaxminddb-dev mmdb-bin
You need to create an account on the MaxMind website which provides updated GeoIP (GeoLite2 Free version) databases. After registering on the site, you can manage licence keys under your MaxMind account.
In the /etc/GeoIP.conf
file, replace the new AccountId
and LicenseKey
, for instance:
# GeoIP.conf file for `geoipupdate` program, for versions >= 3.1.1.
# Used to update GeoIP databases from https://www.maxmind.com.
# For more information about this config file, visit the docs at
# https://dev.maxmind.com/geoip/updating-databases?lang=en.
# `AccountID` is from your MaxMind account.
AccountID0000000# `LicenseKey` is from your MaxMind account
LicenseKey0000000000000000# `EditionIDs` is from your MaxMind account.
EditionIDsGeoLite2-ASNGeoLite2-CityGeoLite2-Country
You can also download the .conf
file generated by MaxMind in the webpage, then replace the file on the server.
After that, you will be able to update the GeoIP database by running sudo geoipupdate
. It’s better to add new cron job to update the database regularly.
You have the GeoIP2 database updated, now just have to install and enable the GeoIP2 module for Nginx:
sudo apt install libnginx-mod-http-geoip2
This will automatic update a 50-mod-http-geoip2.conf
config file under /etc/nginx/modules-enabled/
.
The following example demonstrates how to restrict access to the Nginx server only from the configured contries1.
In you /etc/nginx/nginx.conf
:
http {
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_iso_codecountryiso_code;
}
map $geoip2_data_country_iso_code $allowed_country {
defaultno;
FRyes; # France
BEyes; # Belgium
DEyes; # Germany
CHyes; # Switzerland
}
server {
# Block forbidden country
if ($allowed_country = no) {
return444;
}
[...]
}
}
The location of the .mmdb
database files can vary depends on your system, e.g./usr/share/GeoIP/
or /var/lib/GeoIP/
.
Visit ZeroSSL official site to register an account. All certificates issued with ACME will be stored in your ZeroSSL account dashboard for easy management (after acme.sh
register).
acme.sh is an ACME protocol client written purely in Shell. It works on any Linux server without special requirements.
Update your Linux repo with latest CA bundle and patches from System Update else some issues will occur when generating your free SSL. Once completed then begin the below procedure.
Now install it from https://get.acme.sh:
curl https://get.acme.sh | sh -semail=<email@exmaple.com>
source ~/.bashrc
# if you're using zsh# source ~/.zshrc
That’s it. For advanced installation, visit [https://github.com/acmesh-official/acme.sh/wiki/How-to-install] for details.
Then, you can register your ZeroSSL account with acme.sh
:
acme.sh --register-account-m <email@example.com> --server zerossl
It’s strongly recommended to enable the auto upgrade acme.sh by:
acme.sh --upgrade--auto-upgrade
Then acme.sh will be kept to the latest release automatically.
Stop auto upgrade by
acme.sh --upgrade --auto-upgrade 0
.
Just use Cloudfare as an example, other DNS providers’ configurations can be found at https://github.com/acmesh-official/acme.sh/wiki/dnsapi.
First, you need to log in to your Cloudflare account to get your API key.
You can narrow the Cloudflare’s API token that is only for writing access to Zone.DNS for a single domain, then update variables in your environment by running the following commands in the shell
(these variables will be saved by acme.sh):
exportCF_Token="xxxxxxxxxxxxxxxxxxxxxxxxxx"exportCF_Account_ID="xxxxxxxxxxxxx"exportCF_Zone_ID="xxxxxxxxxxxxx"
You may not need CF_Zone_ID
if your token is set to edit multiple DNS Zones.
Okay, after these configurations we can now issue certs with:
acme.sh --issue--dns dns_cf -d example.com -d*.example.com
The CF_Token
, CF_Account_ID
, and CF_Zone_ID
will be saved in ~/.acme.sh/account.conf
and will be reused when needed.
We can also get wildcard certs for subdomains, e.g.:
acme.sh --issue--dns dns_cf -d www.example.com -d*.www.example.com
All issued certificates will be stored in ~/.acme.sh/<example.com>/
.
That’s it, for more official support please refer to https://zerossl.com/documentation/acme/.
After the cert is generated, files are stored in ~/.acme.sh/<example.com>/
, but it’s NOT recommended to use the certs file in the ~/.acme.sh/
folder, the folder structure may change in the future.
You’d better copy the certs to the target location, or you can use the following commands to copy the certs:
Nginx example:
acme.sh --install-cert-d example.com \--key-file /path/to/keyfile/in/nginx/key.pem \--fullchain-file /path/to/fullchain/nginx/fullchain.pem \--reloadcmd"sudo systemctl restart nginx"
Apache example:
acme.sh --install-cert-d example.com \--cert-file /path/to/certfile/in/apache/cert.pem \--key-file /path/to/keyfile/in/apache/key.pem \--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \--reloadcmd"sudo service apache2 force-reload"
The ownership and permission info of existing files are preserved. You can pre-create the files to define the ownership and permissions.
The cert will be renewed every 60 days by default. Once the cert is renewed, the Apache/Nginx service will be reloaded automatically by the --reloadcmd
command.
Please take care: The
reloadcmd
is very important. The cert can be automatically renewed, but, without a correct ‘reloadcmd’ the cert may not be flushed to your server(like nginx or apache), then your website will not be able to show renewed cert in 60 days.
Indeed, you don’t need to renew the certs manually, all the certs will be renewed automatically every 60 days.
However, you can also force to renew a cert by:
acme.sh --renew-d example.com --force
To stop the automatic renewal of a cert, you can execute the following to remove the cert from the renewal list:
acme.sh --remove-d example.com
The cert or key files are not removed from the local file system, you can remove these files or respective directories (e.g. ~/.acme.sh/example.com
) by yourself.