<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Idiosyncratic Ruby</title>
  <subtitle>Documenting All Ruby Specialities</subtitle>
  <id>https://idiosyncratic-ruby.com/index/</id>
  <link href="https://idiosyncratic-ruby.com/index/"/>
  <link href="https://idiosyncratic-ruby.com/feed.xml" rel="self"/>
  <updated>2020-08-24T00:00:00Z</updated>
  <author>
    <name>Jan Lelis</name>
  </author>
  <entry>
    <title>Ruby TRICKS of 2018</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/75-ruby-tricks-of-2018.html"/>
    <id>https://idiosyncratic-ruby.com/75-ruby-tricks-of-2018.html</id>
    <published>2020-08-24T00:00:00Z</published>
    <updated>2020-08-24T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby was initially designed to be a successor of the Perl programming language, which also means that it inherited a lot of Perl's expressiveness. To celebrate this, the &lt;a href="https://github.com/tric/trick2018"&gt;TRIC¹ contest&lt;/a&gt; was invented:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Write the most Transcendental, Imbroglio Ruby program!&lt;/li&gt;
  &lt;li&gt;Illustrate some of the subtleties (and design issues) of Ruby!&lt;/li&gt;
  &lt;li&gt;Show the robustness and portability of Ruby interpreters!&lt;/li&gt;
  &lt;li&gt;Stabilize the spec of Ruby by the presence of valuable but unmaintainable code!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best submissions were awarded at the Japanese &lt;strong&gt;Ruby Kaigi&lt;/strong&gt; conference and also &lt;a href="https://github.com/ruby/ruby/tree/master/sample/trick2018"&gt;included in the Ruby source&lt;/a&gt;, for educational purpose. The winning submissions² of 2018 were:&lt;/p&gt;

&lt;p&gt;¹ &lt;em&gt;Transcendental Ruby Imbroglio Contest&lt;/em&gt;&lt;br /&gt;
² &lt;em&gt;All code is MIT licensed, Copyright (c) 2018, TRICK Winners and Judges&lt;/em&gt;&lt;/p&gt;

&lt;h2 id="st-place-gold-most-reserved"&gt;1st Place (Gold): "Most reserved"&lt;/h2&gt;

&lt;p&gt;By kinaba (&lt;a href="https://github.com/tric/trick2018/blob/master/01-kinaba/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias    BEGIN    for      unless   def      class
super    true     or       return   defined? next
break    while    begin    undef    do       end
rescue   then     retry    else     undef    module
nil      ensure   case     if       yield    __LINE__
self     and      redo     elsif    not      __FILE__
alias    END      in       end      when     __ENCODING__
end      until    false    end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above Ruby program does not output anything, but it is 100% valid code. What is noteworthy: It only consists of &lt;a href="https://ruby-doc.org/core-2.5.0/doc/keywords_rdoc.html"&gt;reserved keywords&lt;/a&gt; and makes use of all of them!&lt;/p&gt;

&lt;h2 id="nd-place-silver-best-spiral"&gt;2nd Place (Silver): "Best spiral"&lt;/h2&gt;

&lt;p&gt;By Yusuke Endoh (&lt;a href="https://github.com/tric/trick2018/blob/master/02-mame/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;'';eval(r=%q(-&amp;gt;z{r="'';eval(r=\
%q(#{r}))[%q`#{z}`]";i=-040;30.
times{|n|(15+n%2*15-n/2).times{
r&amp;lt;&amp;lt;r[i+=(1.-n&amp;amp;2)*(32-n%2*31)]}}
i=r[524,0]=?\0;eval(r[479..-1])
c['"']}))[%q`GFEDCBA"+"[e\"'"'t
kE*;;\";"  TRICK2018  ";tb,;{{r
2E0$ob[us@*0)[90,336])_#i\n}s#i
0H}&amp;gt;["t]];};o[1,?\n*8];ex"-}eac
1Hl&amp;lt;1[-1]*2*t=n%2];o[14-n,0)mvk
8M$&amp;lt;4,?\n];15.times{|n|;o[35ie2
!Pss.slice!(0,1)+x;sleep(0.0t;0
'W=%q"&amp;lt;&amp;lt;95&amp;lt;&amp;lt;$s&amp;lt;&amp;lt;95;o=-&amp;gt;n,x{n.'1
;@[2]}|\e../,%@s="'%trick2018!8
eval$s=%q_eval($s.gsub!(/#{%@`]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running the above code returns itself, &lt;a href="https://en.wikipedia.org/wiki/Quine_(computing)"&gt;it is a quine.&lt;/a&gt; And on top of that, instead of returning the result line by line, it prints itself using a &lt;a href="https://showterm.io/75d9ca6ccbda2f65945c4"&gt;spiral animation!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="rd-place-bronze-best-png-viewer"&gt;3rd Place (Bronze): "Best png viewer"&lt;/h2&gt;

&lt;p&gt;By Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/03-tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X=[];class String def-@;replace ?-+self end;def-a;X.reject!{|x|x.
__id__==__id__};a.replace(self+?-+a) end end;at_exit{eval C=(Zlib
.inflate((X*?-).tr(?-,'').tr('q-z','0-9').to_i(26).digits(0x100).
pack'C*'))};def method_missing n;(X&amp;lt;&amp;lt;n.to_s)[-1]end;require'zlib'
fzygtoxyzgntmdmuwvfoffbpmvzojpkhczvjvjdbtscnldwbdoprackddovivvmkz
ponzmosvtjciwkgaslscxxxwudeesmmqpfhislxuxnnypulxstzgobyaekqqhbjcg
mvko------------ddkeys----eivhnccaqyiw---bzyccmt-----------ymtnge
jwhi--------------pjxf------mdarbtumnv---qasda--------------gmwdt
wrtk---qtpzgnce----fsl-------fkgzgtbpp---gwnm----pxkpqkdiw---owga
momz---yjjvpnvar---zeo---v-----duvalwu---nsqt---waofemwakivnyqkjd
fzag---uhvusmkl----kzb---rhc----iutzjr---mqlh---ayijpwativpweaato
xexs--------------rvgv---pjdz-----lkkg---uiaw---lovitupw-----fwmn
kfru------------jvjpgv---jskycf----pal---gbuf---hfdnywog-----iuca
pntn---apmkqroeuzwuwkw---gqnmgof-----b---hlpl---vkkyhfyrqfr--jwrl
kmdb---dhspujhmtgrkccu---uonfummdt-------rqfw----bpiactehwp--fncq
yzvz---gdaxebplhfndran---ytfmviryeh------hqwkl---------------nced
bibu---fnkdthgldhkxxjg---rwnmpudhbqin----gucoyki------------hfura
cqdgqpyzqfzknvdjoxxhpjulwwyebtocxdrvklbuviwwcatlmdosxfvwntzbijguy
iglrvvzlxerflupxvsyujfacuwhrvmnecgtewtqkhtdggcltejiyqcluclkycwvzg
vvxfysvttfbeglvrlngntdngzyhqrmltazwdydxrsvjploembhgxdvfmmhepbschm
brn--iqrcdb--evv----tqp------lg--uein-wzut--mr------wkh------foqz
zsf--srjnjp--ampb--pfio--hgtekx--rrr---fwd--jn--xqkezcz--vsb--nya
khrc--evlr--oioxs--mqce--bqfmag--bwz---xda--qw--jnuzelr--qzi--itx
mdxd--duso--wxbot--nmon--ugnbdpc--a--c--e--hlg--twxndre--tby--rhg
evhbn--zb--dtxmiz--dpia------vie--h--i--t--shh------kfn------owna
ealmt--kb--scxdjy--smvl--dqmgebk--t--s--t--gfd--updcbnc--rh--dwwp
dvpnxb----wpljjdy--kolc--qflyleok---xkv---usbj--jhrawbn--ewx--bgf
eaqwrw----ejwxhet--dice--eoczconm---urz---rqyp--hovvvfc--bskj--el
aocjcts--jtumwxm----mgy------xpaoq-jtwqr-aipay------dhy--iync--hk
sckddmvuvvuhhqstumaykvczaaujrumqbbqsdvdycplyrlkkojlxnkrhbbrmnjxyf
cdtcmpfmjvthwkpzucbblttgumomlxnxwjeypfeagaukfzeokzxjebkpigcvlqnso
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Requires &lt;code&gt;gem install chunky_png&lt;/code&gt;. This program converts a PNG image into ASCII art! It will turn &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/03-tompng/trick.png"&gt;this image&lt;/a&gt; into the following text output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;undef p;X=[];class String def-@;replace ?-+dup end;def-a;X.reject!{|x|x.__id__==__id__};a.replace(self+?-+a) end end;at_exit{eval C=
(Zlib.inflate (X*?-).tr(?-,'').tr('q-z','0-9').to_i(26).digits(256).pack'C*')};def method_missing n;(X&amp;lt;&amp;lt;n.to_s)[-1]end;require'zlib'
gmlztzdculbtzgtjfetuh---k--htf----d-----------------------------------------------------g-b-----s--t-g--------jmuwescmgchftikfjafccs
ivchcveidpvxdabnvwyga-f--v-------xf----------------------------------------------------q-v---l-------q---------liiNeawriayymwooxgxqw
rfosepqsmojseyezmwbhi--------------ew--------------------------------------------------m---k-r-----------vwu--hiotltdmczwyjmlvbyfqwq
uvvykqdjednoqgtcmtfbzs---------f----o--------------------------------------------------t--a------m----x---f-----dldzsakyofetfozfpmrq
geusutariiiNiulkjbwlm-----d------------------------------------------------------------j---------o---------x--j-uitzrgwpupwhvendhyno
uubvnssiywkklwwdufhhi-rw----k---v-------------------------------------------------------sty-----yg---l---c-v----wkffpskpumolqmkeryzg
zrxdaiposwybbzgxdnegh-----g-----ma--n---------------------------------------------------------j----n--b-n-------yqavmscswdogpcgopygt
axiqfswlhzeamvymdnteo---q-q-w--------------------------fhrmj-----------------hkou-----------f-----d----u-o------evcuxxegekfgivzzujan
nslioftsvqvtkeigvfgwr-------------lyco-----------------igyvg-----------------okuk---------m--b-u--d--y------s---dadjrlykfhtermzfyktu
btoxzfpPicxxfligbivvf--------h----yrat---------------------------------------vjwd---------------------d-ki--o--tyqosehopkwttigwwfskp
komzvnyrvkjcjwbmdwdkp----------vxphiNdtawn--xms-saketo--jnld----ezulntdaz----nzna-----vhjwt------h----x--x--o--saxxsrkgktqotaluylbkk
sclegratyaarmgmepheml----------hwgglhlrfcx--znvmpfsgjx-onhju---gtxsmzqprlt---mjzy---frhdk-------------v---mj----dzjujmbgldfwoybgicwu
tfhgnhlzxlwtdtkgzlaca-------------gmex------arlm--------rvmh-ajtgf-----pqal--wcux-zatyi-------------------------xnluwybcugjclmablshn
tnjohqtqzivgmyutrssil-------------lcwq------jrf--------gcaii-maie------------vvnfjfqwo--------------------------filivosyhkxcvuwdibwj
tyxjiopiFqypvwdzoatuq-------------tdln------cnx---------ffuf-ajvq------------tyyypglpzmj------------------------vtqzwewqdsijrbymvpwn
niNffphoehukpvvmzvhyd-------------ahqd------nfr---------jeqk--toap-----mxhyg-tedv---otrwy-----------------------mjxnrktackwxwiajdnuc
kkxhuwbvibpvgvcampadi-------------ebmencqz--obf--------wfprz---qmrotkijiqv---ggfp-----hlzw----------------------kastwdpxiyftmypuxbtu
xetudmwzpomktgnjkcsyc---------------fwpdx---xb----j-----se-k------tllakc-----gjoo-------we------mic---lktk------ubtnrxvrjzuqlrfrsnmf
okdvfvcdbdqkckjialskk---------------------------v---u-------l----------------------------------z--q--qfg--------aaliNbxbjjpxebboneye
kcbkjmdclwnfawtfnwkeq----------------------------------j---y-------------------------------a---jmbyo-sgef--gf---extljbozuoofgyvsilct
xzoqmsqgzjxxpjqwkjkdd------------------------o--------m-------f---------------------------------n--de-ajz-rzv---fhnpbkrwdxoozpxeaxaf
mbcwxuiqdwcmadheiykaa-----------------------q-f------l---i---------------------------------r----zf---k--y---fi--dcnycheytylcgnioauee
yekiNacriqoevtdjerqbp----------------------------w---yy-----my----------------------------ko--mnbpskr--c-----j--ozyqpbfovhbhyoprzgqr
czwtuopxkdbphocfawvbk--------------------------q-s----j--b---------------------------------hd-xsb----bfiNp--w---fmwuvfambdqvxtzldwmh
xysnyrseydlkjcwfbsjnr-------------------------d-d-------------------------------------------f-enpss---qllpwr----almsdidvjwoigvldfqoa
lrpbixjpofxocxlflscpo------------------------------q-fyu--z-------------------------------------kfd-z---n-------bqxurujnxzurrdgcojks
jetyfdkcekckxbyosbfws-------------wdfhgwuvejjmf-----sxjubpvgcsl-------tnmixpv---------eurabjsdvstfv-------------qcyiqhonwoyixqeonfvp
mopPhywsozohitutgmmrb------------zxwtxe--riedeo---mspgpnv--pimlh------jhtzajk--------qqovvq---ldbrh-------------xtooxpayonpcvvtmvpra
vvuyiunpoeagdzqjecsub------------klrw------snrc---rrct------aajom--------nsyk--------peea-------azq-------------iNjefdkfhnagjicqwmsm
mbwwbfgehhbdmvvlflmee---------------------hkejn---jtbo-------jdtje-------jcei---------afyz-----smtc-------------kksvfjyuaqtohxiohhlz
dvfmfrzcmnsfruhqgjuxz------------------dfxdnlk----kkra-------xmmtf-------jwkw----------rdoozxtcho---------------bbwwferxwnnmdzcniicv
mfneisdlyeqwynldjgonj----------------jgrjvc-------uxga-------ghnpr-------sers--------scbknx----gmjo-------------moedtnlbflhtlkjibrqk
gobwqshnpbdcpjmjaeczr--------------iscsxs---------zfpo-------hhfwy-------qbba-------vhlxc-------ntod------------ndwzdomaptumzejiwqbn
snucynymvfpnadyqkzfcv-------------ggze------------kuvfs-----zuhod--------mylo-------jhwyp-----z-pywd------------dqfmpnevmtqcikbrilto
aotyxkipebdkassogpcbl-----------wgackesmvvsrihhd---orzndjndlzpb----------eobf-------kkayixzyotqfafa-w-----------mjjxoomwdglwvccozzut
rthesuszfwycsqqrtxlot-----------ejcqlhriilqbtrys------lwbkzmvp-----------zzwm-------l--qijwfllndzb-ik-----------mmokqomjepdcotnsiNig
nloryyoswwdmefywnnuhph------------------------------------------------------r--r-nd-----h--x--------------------hlgzeqqslwxgtjgghquf
nssngjtiudsrvfuxjzclhjhj----------------------------------------------------------t----------------k-f-mp-------obhyehqebtpjbkeepqzt
ezogzsimfynqmkteaipejo-g-yser-----------------------------------------------e------h-------------i---y----------qpgcqnltivmmsximbbsy
wtjjolwyoselcumgklqwpldkl-ulm-m---------------------------------------------------------------q---u-f--l--------buixfiitufktsqdtnrei
tgrtitcewseetlpeuuujb-osdokjozc------------------------------------------n---d-----f--------g--------q--g-------jyyqtezuzmcxgpcwuwfx
dpPayqmzxrwhbswwalygfurtkruw-u-k---------------------------------------------d---h------i----------c----i-------ulowcddvjbxthqlxjzbe
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Every piece of ASCII art generated also contains the full converter program and can be used to transform another PNG image into ASCII!&lt;/p&gt;

&lt;h2 id="th-place-best-one-liner"&gt;4th Place: "Best one-liner"&lt;/h2&gt;

&lt;p&gt;By Colin Fulton (&lt;a href="https://github.com/tric/trick2018/blob/master/04-colin/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# (c) 2018 Colin Fulton. Available for use under the terms of the MIT License.
$🚀=0;def 🤔 🏷,🤔=0,&amp;amp;b;puts ' '*$🚀+(🤔 ?"":"🚫 ")+🏷;$🚀+=4;b&amp;amp;.[];$🚀-=4;end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What we have here is essentially a testing framework in 68 characters! It uses a method named &lt;code&gt;🤔&lt;/code&gt; as its API. To illustrate its usage, here is an example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$🚀=0;def 🤔 🏷,🤔=0,&amp;amp;b;puts ' '*$🚀+(🤔 ?"":"🚫 ")+🏷;$🚀+=4;b&amp;amp;.[];$🚀-=4;end

🤔 "Math" do
  🤔 "Addition" do
    🤔 "One plus one equals two.",
      1+1 == 2
    🤔 "One plus one equals eleven. (This should fail.)",
      1+1 == 11
  end

  🤔 "Subtraction" do
    🤔 "One minus one equals zero.",
      1-1 == 0
    🤔 "Ten minus one equal nine.",
      10-1 == 9
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Test output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Math
    Addition
        One plus one equals two.
        🚫 One plus one equals eleven. (This should fail.)
    Subtraction
        One minus one equals zero.
        Ten minus one equal nine.
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="th-place-most-three-dimensional"&gt;5th Place: "Most three-dimensional"&lt;/h2&gt;

&lt;p&gt;By Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/05-tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;                                                    X=[];def self.method_missing n;n.to_s.chars;end
                                               l=[];def l.-a;X&amp;lt;&amp;lt;a=[nil,*a];a;end;def l.+a;self-a;end
                                           class Array;def-@;[]-self;end;def-a;replace [*self,nil,*a
                                 ]end;alias +@ -@;alias + -;end;def gen3d f;yield;b=['solid obj'];w,
                 h=X[0].size,X.size;X&amp;lt;&amp;lt;[];a=-&amp;gt;r,z,dr,dz{;r-=w/2.0;z*=2;r2,z2=r+dr,z+dz*2;if r&amp;gt;0||r2&amp;gt;
                 0;r=[0,r].max;r2=[0,r2].max;16.times{|i|m=Math;p=m::PI/8;;c,s=m.cos(t=i*p),m.sin(t)
                 c2,s2=m.cos(t=(i+1)*p),m.sin(t);t-=p/2;[[0,1,2],[0,2,3]].map{|a|b.push [:facet,'n'+
               +                 'ormal',dz*m.cos(t),dz*m.sin(t),-dr]*' ','outer loop',a.map{|i|'v'+
              ++                           "ertex #{[[r*c,r*s,z],[r*c2,r*s2,z],[r2*c2,r2*s2,z2],[r2*
              +c,                              r2*s,z2]][i]*' '}"},:endloop,:endfacet}}end};(0...h).
             map{|                                  y|w.times{|x|[X[y-1][x]||a[x,y,1,0],X[y+1][x]||
           a[x+1,y+
          1,-1,0],X[
         y][x-+1]||a[
        x,y+1,0,-1],X[y
       ][x++1]||a[x+1,y,
       0,1]]if X[y][x]}}
       s=[b,'end'+b[0]]*
        $/;File.write(f,
         s);X.replace(
            []);end

gen3d 'wine_glass.stl' do
  l--ww------------------ww--l
  l--ww------------------ww--l
  l--ww++++++++++++++++++ww--l
  l--ww++++++++++++++++++ww--l
  l--ww++++++++++++++++++ww--l
  l--ww++++++++++++++++++ww--l
  l---ww++++++++++++++++ww---l
  l----www++++++++++++www----l
  l------www++++++++www------l
  l--------wwwwwwwwww--------l
  l-----------wwww-----------l
  l------------ww------------l
  l------------ww------------l
  l------------ww------------l
  l-----------wwww-----------l
  l---------wwwwwwww---------l
  l----wwwwwwwwwwwwwwwwww----l
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running the above Ruby program will create an &lt;a href="https://en.wikipedia.org/wiki/STL_(file_format)"&gt;STL file&lt;/a&gt; with a 3D description of a wine glass, which you could actually print out using a 3D printer. &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/05-tompng/preview_of_output.png"&gt;You can find a preview of the result here.&lt;/a&gt; Changing the shape of the glass in the above code will also change the outputted 3D model!&lt;/p&gt;

&lt;h2 id="th-place-most-reversible-eban-award"&gt;6th Place: "Most reversible" &lt;em&gt;eban award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By Yusuke Endoh (&lt;a href="https://github.com/tric/trick2018/blob/master/06-mame/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a,b=:reverse,:itself;b=b
a=b=:itself;b
 r||=-&amp;gt;s,m=a{s.send(m)};a
 puts r[$&amp;lt;.sort_by(&amp;amp;r),b]
 ;r||=-&amp;gt;s,m=a{s.send(m)};
  a=b=:reverse;0
  b,a=:reverse,:itself#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This program sorts the file given as an argument. The fun starts, when you apply it on the program itself, because it will generate the following, different program:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  a=b=:reverse;0
  b,a=:reverse,:itself#
 ;r||=-&amp;gt;s,m=a{s.send(m)};
 puts r[$&amp;lt;.sort_by(&amp;amp;r),b]
 r||=-&amp;gt;s,m=a{s.send(m)};a
a,b=:reverse,:itself;b=b
a=b=:itself;b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This generated program is also a sorting-program, but it sorts the given file by &lt;em&gt;reverse order&lt;/em&gt;. The fun continues when you use the program to reverse-order itself! This is the result:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a=b=:itself;b
a,b=:reverse,:itself;b=b
 r||=-&amp;gt;s,m=a{s.send(m)};a
 puts r[$&amp;lt;.sort_by(&amp;amp;r),b]
 ;r||=-&amp;gt;s,m=a{s.send(m)};
  b,a=:reverse,:itself#
  a=b=:reverse;0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is even another sorting program, this time it will sort any given file by their last characters on each line. It is a reverse-line sorter! But what if we want to sort by reversed lines in reverse order? No problem, just go one level further and apply the reverse-line sorter program to itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  b,a=:reverse,:itself#
  a=b=:reverse;0
 ;r||=-&amp;gt;s,m=a{s.send(m)};
 puts r[$&amp;lt;.sort_by(&amp;amp;r),b]
 r||=-&amp;gt;s,m=a{s.send(m)};a
a=b=:itself;b
a,b=:reverse,:itself;b=b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The fun ends, when you let this sorter sort itself (again!) which produces the original code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a,b=:reverse,:itself;b=b
a=b=:itself;b
 r||=-&amp;gt;s,m=a{s.send(m)};a
 puts r[$&amp;lt;.sort_by(&amp;amp;r),b]
 ;r||=-&amp;gt;s,m=a{s.send(m)};
  a=b=:reverse;0
  b,a=:reverse,:itself#
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="th-place-best-compiler"&gt;7th Place: "Best compiler"&lt;/h2&gt;

&lt;p&gt;By Colin Fulton (&lt;a href="https://github.com/tric/trick2018/blob/master/07-colin/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$l||=__LINE__;eval q=%q[k =";eval q=%q";
# (c) 2018 Colin Fulton  (MIT License) #
;n=([1]);f=-&amp;gt;s{[0]*(s.size/40)};$c||=-17
$r=[*$r]+[[]]*(($l-$c)/18);$c=$l;(s="");
;;m=-&amp;gt;a,b{8+4*a[b]};$r[ -1]+=f[s]+n;s=%;
;;s&amp;amp;&amp;amp;$r[-1]=f[s]+$r[-1]||(z=44);z=$l=s=z
(y=-&amp;gt;{z=puts(z.map &amp;amp;:rstrip)})&amp;amp;&amp;amp;(s="")&amp;amp;&amp;amp;
e=-&amp;gt;a,b,c{(a+a)[b+c]+a[b-c]};$r||=$r*42;
;h=[1,*8..10];f=-&amp;gt;a,l{a+[0] *(l-a.size)}
(r||=-&amp;gt;{f[$r.flat_map{|a|f[a,9]},81]})&amp;amp;&amp;amp;
c=-&amp;gt;a,d{h.map{|p|e[a,d,p]}.sum};!nil.!||
g=-&amp;gt;a{d=-1;a. map{(m[a,d+=1])[c[a,d]]}};
;x=-&amp;gt;{"$l||=__LINE__"+k+91.chr+q+93.chr}
b=-&amp;gt;{x[].split(?\n).map{|s|s[$t]}}||!$$;
(v=-&amp;gt;i{g[r[]][i]&amp;gt;0?b[]: [" "*40]*18}) &amp;amp;&amp;amp;
w=-&amp;gt;i{z ?z.zip(v[i]) .map(&amp;amp;:join):v[i]};
;$t=/\S.{0,39}/;u=-&amp;gt;i{z=w[i];i%9&amp;gt;7&amp;amp;&amp;amp;y[]}
;at_exit{b=b&amp;amp;&amp;amp;($z||81.times(&amp;amp;u)&amp;amp;&amp;amp;$z=1)}]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above code snippet is meant as a building block to build a pattern for a &lt;a href="https://github.com/tric/trick2018/blob/master/07-colin/demo.rb"&gt;Conway's Game of Life&lt;/a&gt; simulation! You have to take this literally and build up the pattern using the above &lt;strong&gt;code block&lt;/strong&gt;! Executing the pattern with Ruby will generate the next generation. &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/07-colin/demo.rb"&gt;Here is the "glider" start pattern&lt;/a&gt;. Repeat the script multiple times to &lt;a href="https://showterm.io/1a79b93909a07d1273dda"&gt;see it moving!&lt;/a&gt; (zoom out for the best viewing experience)&lt;/p&gt;

&lt;h2 id="th-place-most-composable-shinh-award-leonid-award"&gt;8th Place: "Most composable" &lt;em&gt;shinh award&lt;/em&gt;, &lt;em&gt;leonid award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/08-tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;












































                   (B||=[])&amp;lt;&amp;lt;6;C||=[];C&amp;lt;&amp;lt;%w@0 if@;
             a=?;*2018;C&amp;lt;&amp;lt;%w@2 (e=ARGV[0]);e=File.read@;
          t=-&amp;gt;(i,s){s&amp;amp;&amp;amp;a[i.to_i,s.size]=s};C&amp;lt;&amp;lt;%w@25 (e)if@;
         u=-&amp;gt;{C.map{|i,s|t[i,s]};eval(a)};C&amp;lt;&amp;lt;%w@30 (/^\.+$@;
        at_exit{_,u=u,-&amp;gt;{};_[]};C&amp;lt;&amp;lt;%w@37 /!~e&amp;amp;&amp;amp;File.exist?(@;
       C&amp;lt;&amp;lt;%w@55 e));d='[&amp;gt;&amp;lt;+-,.]';i=32.chr;f=0..79;c=(0..7).m@;
       C&amp;lt;&amp;lt;%w@99 ap{|c|b=['C||=[];','a=?;*2018;','t=-&amp;gt;(i,s){s@;
      C&amp;lt;&amp;lt;%w@143 &amp;amp;&amp;amp;a[i.to_i,s.size]=s};','u=-&amp;gt;{C.map{|i,s|t[i,@;
      C&amp;lt;&amp;lt;%w@188 s]};eval(a)};','at_exit{_,u=u,-&amp;gt;{};_[]};'];o=@;
      C&amp;lt;&amp;lt;%w@233 0;f.map{|f|j=(0..67).map{|r|r-=34;s=f-34;m,n=@;
      C&amp;lt;&amp;lt;%w@278 r.abs,s.abs;h=-&amp;gt;x{m&amp;lt;25&amp;amp;&amp;amp;n&amp;lt;34&amp;amp;&amp;amp;(x&amp;lt;0||n&amp;gt;17)};q=@;
      C&amp;lt;&amp;lt;%w@323 -&amp;gt;x{n&amp;lt;x+34&amp;amp;&amp;amp;x&amp;lt;n&amp;amp;&amp;amp;n&amp;lt;34};[h[r],q[-r],q[r],n&amp;lt;11|@;
      C&amp;lt;&amp;lt;%w@368 |(m&amp;lt;17&amp;amp;&amp;amp;n&amp;lt;34),n&amp;lt;12,r**4*1.6+16*(s-25)**4&amp;lt;8*17@;
      C&amp;lt;&amp;lt;%w@413 **4||(s&amp;gt;37&amp;amp;&amp;amp;s&amp;gt;17-r&amp;amp;&amp;amp;4*s&amp;lt;173-r),r**4+16*(s-25)@;
      C&amp;lt;&amp;lt;%w@458 **4&amp;lt;8*17**4,h[-r]][c]};r,p=j.index(!!0),j.cou@;
      C&amp;lt;&amp;lt;%w@503 nt(!!0);next(i*68)if(!r);k=f==45?'(B||=[])&amp;lt;&amp;lt;'@;
      C&amp;lt;&amp;lt;%w@548 +c.to_s+?;:'';g=b[0];(k+=b.shift)if(g&amp;amp;&amp;amp;g.size@;
      C&amp;lt;&amp;lt;%w@593 &amp;lt;=p-k.size);l=p-k.size-o.to_s.size-9;s=64.chr@;
      C&amp;lt;&amp;lt;%w@638 ;if(l&amp;gt;0);k+=['C&amp;lt;&amp;lt;%w',s,o,i,a[o,l],s,?;]*'';o+@;
      C&amp;lt;&amp;lt;%w@683 =l;end;(i*r)+k+?;*([p-k.size,0].max)+i*(68-r-@;
      C&amp;lt;&amp;lt;%w@728 p)}};(e.chars-(e.chars-d.chars)).each_slice(8@;
      C&amp;lt;&amp;lt;%w@773 ){|l|puts(f.map{|y|l.map{|r|c[d.index(r)][y]}@;
       C&amp;lt;&amp;lt;%w@818 .*(i*17).rstrip});4.times{puts};};else;x,i=@;
       C&amp;lt;&amp;lt;%w@861 Hash.new{0},0;y=%(while(x[i]!=0);i+=1;i-=1;@;
        C&amp;lt;&amp;lt;%w@904 x[i]+=1;x[i]-=1;x[i]=($&amp;lt;.binmode.getc||0)@;
         C&amp;lt;&amp;lt;%w@945 .ord;$&amp;gt;&amp;lt;&amp;lt;(x[i]&amp;amp;0xff).chr;end).split(?;)@;
          C&amp;lt;&amp;lt;%w@984 ;eval(B.map{|a|y[a]}*?;);end;;;;;;;;;@;
             C&amp;lt;&amp;lt;%w@1021 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@;
                   C&amp;lt;&amp;lt;%w@1051 ;;;;;;;;;;;;;;;;;;@;









&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not just another &lt;a href="https://en.wikipedia.org/wiki/Brainfuck"&gt;brainfuck compiler&lt;/a&gt;. Not only does this piece of code convert a &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/08-tompng/sample.bf"&gt;bf source file&lt;/a&gt; into an equivalent Ruby source file. It also formats the resulting Ruby code into huge letters representing the original bf code. As a bonus, the compiler gets embedded into the generated Ruby file and is used when it receives another file as a command-line argument. A demo of all the described features in &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/08-tompng/sample.mp4"&gt;this short video by the author!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="th-place-most-unreadable"&gt;9th Place: "Most (un)readable"&lt;/h2&gt;

&lt;p&gt;By Yutaka Hara&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def method_missing(n);$*&amp;lt;&amp;lt;n.to_s.bytesize
n[-1]=="!" and eval$*.map(&amp;amp;:chr).join;end

＊自己言及的なプログラム.
これは「自己に言及」したQuineプログラムです.
動かすには普通に無引数で実行してください.
MRIの最新の安定版で動作確認を行っています.
＊冒頭の2行が日本語プログラミングのDSLを提供します.
Rubyはピリオドまでの部分がメソッド名であると解釈します.
そのままではNoMethodErrorになります.
それをmethod_missingを使って検知しメソッド名のbytesizeをASCIIコードとして文字にします.
メソッド名が半角の！で終わる場合、記憶した文字たちをjoinしてevalします.
これにより任意のRubyプログラムを日本語により記述することができます.
このプログラムの場合はこのファイルをreadし出力するようになっています.
＊Note：文の長さは注意が必要.
UTF_8の日本語は1文字が3bytes.
端数が丁度になるよう英語を入れる.
以上、自己言及的programでした!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first two lines of this Ruby script enable a "Japanese programming" style. The characters before each &lt;code&gt;.&lt;/code&gt; get converted to ASCII on the basis of their byte size. The embedded example program is &lt;code&gt;$&amp;gt;&amp;lt;&amp;lt;IO.read($0)&lt;/code&gt;: The code reads itself to then output itself.&lt;/p&gt;

&lt;h2 id="th-place-best-double-meaning-matz-award"&gt;10th Place: "Best double meaning" &lt;em&gt;matz award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/10-tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def self.method_missing name, *args
  name.to_s
end

FizzMessage = Fizz()
BuzzMessage = Buzz()

def    fizzbuzz_loop n=100
  n = n.to_i
  return 0 if n == 0
  (1..n).each do |i|
    puts fizzbuzz(i)
  end
  error = get_error_message
  puts error if error
end

def   fizzbuzz n
  set_error 'wrong argument type' if n.nil?
  if n &amp;lt;  0
    n = -n
    retval =  fizzbuzz n
    return       retval
  else
    if mod3(n) == 0 &amp;amp;&amp;amp; mod5(n) == 0
      FizzMessage + BuzzMessage
    elsif mod3(n) == 0
      FizzMessage
    elsif mod5(n) == 0
      BuzzMessage
    else
      int2string n
    end
  end
end

def        int2string n
  if n &amp;lt;  0
    n = -n
    tmp =    int2string n
    return  '-' + tmp
  end
  base =  10
  charcode_offset =   0x30
  n =     n.to_i unless n.is_a? Integer
  chars = n.digits(      base   ).map do |n|
    (n + charcode_offset).chr
  end
     chars.reverse.join
end

def       mod3 n
  if n &amp;lt;  0
    n = -n
    tmp  = mod3 n
    return  -tmp
  end
  return +0 if n % 3 == 0
  return +2 if n % 3 == 2 || n % 3 == -1
  return  +1
end

def   mod5 n
  if n &amp;lt;  0
    n = -n
    tmp = mod5 n
    flip =                  -1
    tmp * flip
  else
    n.modulo 5
  end
end

def     set_error msg
  if  !msg
    msg = 'UnknownError'
    retval  = set_error msg
    return  retval
  end
  $ERROR =
           msg
end

def      get_error_message
  $ERROR
end





eval     'n=100;fizzbuzz_loop(n)'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The program printed above is not the original submission, but it looks very similar to the real entry! When run, it will print out the well-known FizzBuzz sequence:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
…
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, the &lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/10-tompng/entry.rb"&gt;actual competition entry&lt;/a&gt; will print out:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1
2
Ruby
4
Trick
Ruby
7
8
Ruby
Trick
11
Ruby
13
14
RubyTrick
…
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The difference: A bunch of &lt;a href="https://character.construction/blanks"&gt;invisible Unicode characters&lt;/a&gt; sprinkled throughout the code, namely &lt;strong&gt;U+00AB&lt;/strong&gt; (no-break space) and &lt;strong&gt;U+200B&lt;/strong&gt; (zero width space), which drastically change how the code gets interpreted!&lt;/p&gt;

&lt;h2 id="th-place-most-attractive-eto-award"&gt;11th Place: "Most attractive" &lt;em&gt;eto award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/11-tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;                           p,i,u,f,v,q    ,h,x=[],
                         Math,-&amp;gt;x{i.sin x},-&amp;gt;x,y,z{
                       x*=1.2;      r,a,m=(1   -y=y*1.4+0.15)/2+0.1,y+u[3*x+4*y+5*z*=1.2]  /12,x*
                     x+z*z;         l,s,b=     m**0.5,i.atan2(z,x),u[6*a]**2/36+((x*x+z*z)**0.5-r)**
                     2-(1-   a*      a)/2      /500;l-=   (1-y   )/8   *d=  (u[   2*s  +3*3*t   =1-y-
                    l/2]*    u[       3*       s-3*2       *                            t])    **2/(
                     1+i.  exp(       t        *10-   9-  5.5      ));e       =4*l /(   1+(    0.01+
                     (1-a=y-d*    (       1    -y)       /8)**    2)**0.5    -a)*(1-a    *    a+((1-
                      a*a)**2+   0.01   )**    0.5    )** 0.5    ;(i.atan(   (1-0.2*i.         asin(
                      0.98*      u[+   +5.0    *           i.    atan2(y=   3*y-3.4,x         *=3)]
                      ))*(       (0.01+x*x+     y*y      )**    0.5-0.1)    +4*(0.01+z        *z*4
          )**0.5-1)* i.atan(     a*a+e*e-1-10/(1+(40*m)**10+((a+1)*10)**10))-0.01)*b},%w&amp;amp;    MMM##
      TTTQQBKPTVVpQAk5Y7*pgw43v7*pgaor&amp;lt;*"ggau]/~"gau];-~'ga;,,,.'MerryChristmas!&amp;amp;*'',-&amp;gt;x    ,y,z,
    s,m{if(m==    1);g=f   [x+=s/2,y+=s/2,z+=s/2];a,  b,c=f[x+d=0.01,y,z]-g,f[x,y+d,z]-    g,f[x,
   y,z+d]           -g;   p&amp;lt;&amp;lt;[x,y,z,a/d=(a*a+b*b+c    *c)**0.5,b/d,c/d];else;(r=0        ...n=[m,4].min).map{|i|r.map{
  |j|a,    b=[f[   x+k    =s*i/n,y+l=s*j/n,z+s],f   [x+k,y+l,z],f[    x,y+k,z+l],f[x+l,y,z+k],f[x+s,y+k,z+l],f[x+l,y++s,
 z+k]].  minmax;return    8.   times    {     |     i|q[x      +          s     *    i     [0],y+s       *i[1]      ,z+s*
i[2],    s,m/2]}if a*b          &amp;lt;0           &amp;amp;&amp;amp;     s/=    2  }}         ;                 end},         0,1    ..  j=128
(0..7)   .each{|i|q[i[    0]    -z=      1.0,i[1    ]-z     ,i[2]    -z,z,64]         ;    $&amp;gt;&amp;lt;&amp;lt;   v[2   *i+64     ,2]};;;
sleep    1;loop{  r,s    ,m,    l,d,    w=i.cos(   h+=0.02   ),u[   h],i.cos(  m=    u[    2.3    *h    ]/5),u     [++m],
x.map    {[7]*j},  x.    map    {[7]    *j};;p.    each{|     x,y    ,z,a,b,   e|    x,    z=x    *r    +s*z,z     *r-s*
x;y,z     =m*y+   l*z    ,m       *z    -l*y;x,      y=64*    (x+    1  ),64   *(    1-      y     )       ;x&amp;lt;j    &amp;amp;&amp;amp;y&amp;lt;
 j&amp;amp;&amp;amp;z&amp;lt;            d[x    ][     y]&amp;amp;&amp;amp;   (d[x][y]     ,w       [x][      y]=z    ,(    8*     (1           +(      a*r+b+
  e*s)/2)    /2).floor)};32.times{|i|4.times{|x|w[((u[i**3]+u[h/4+i]/4)*j+x[0])%j][(h/2+u[i*i])%1*j+x[1]]=5}};f=[1,1]
      $&amp;gt;&amp;lt;&amp;lt;27.chr+   ?[+f*  ';'+?H+(0..63)     .map{|y|x.map{|x|  v[w[x-=1  ][2*y]*8+w[x][2*y+  1]]}.join}*$/}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run the code next Christmas for &lt;a href="https://showterm.io/e23f90d1917ee2c0b991a"&gt;an animated terminal Christmas tree&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="th-place-minimum-alternative-of-irb-mame-award"&gt;12th Place: "Minimum alternative of irb" &lt;em&gt;mame award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By Jan Lelis (&lt;a href="https://github.com/tric/trick2018/blob/master/12-jan/remarks.markdown"&gt;remarks&lt;/a&gt;), &lt;strong&gt;wait, me on that list? Sure, it's no mistake? Unbelievable!&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;eval      %w?_="";_       _=binding;l
oop(      )do    $&amp;gt;&amp;lt;      &amp;lt;"&amp;gt;       &amp;gt;\s
"if       $/&amp;gt;     _;p     uts        "=&amp;gt;
\s%p      "%[   __.e      val       (_+
=get      s||exit!)       ,_=""];rescu
e(Ex      cep   tio       n);       put
s""+      "\e    [31      m%p        \e[
0m"%      [$!     ,_=     ""]       if/
d\se      |ee      /!~    "#$!"end?*""
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run the code above to get a fully functional &lt;a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop"&gt;REPL&lt;/a&gt; with multi-line support:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; 21 + 21
=&amp;gt; 42

&amp;gt;&amp;gt; 42.succ
=&amp;gt; 43

&amp;gt;&amp;gt; def announce
puts "TRICK 2018"
end
=&amp;gt; :announce

&amp;gt;&amp;gt; announce
TRICK 2018
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For a better usage experience, error messages get displayed in red:&lt;/p&gt;

&lt;pre&gt;&amp;gt;&amp;gt; 1/0
&lt;span style="color:red"&gt;#&amp;lt;ZeroDivisionError: divided by 0&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;h2 id="th-place-most-warned-yhara-award"&gt;13th Place: "Most warned" &lt;em&gt;yhara award&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;By kinaba (&lt;a href="https://github.com/tric/trick2018/blob/master/13-kinaba/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def STDOUT.write (s); syswrite s
 end if def $&amp;gt;.write; end
s = Array.new(){}.map{|s|}
s &amp;lt;&amp;lt; (-"Trick").grapheme_clusters{}        [0] # frozen_string_literal: Trick
s &amp;lt;&amp;lt; ("Ruby".unpack *"ao")                 [0]
s &amp;lt;&amp;lt; "#{10**2018 + 1e2018}"                [0]
s &amp;lt;&amp;lt; "#{1&amp;gt;2&amp;gt;3 rescue $!.class.trust.class}"[0]
s &amp;lt;&amp;lt; "#{true; Kernel.public_class_method}" [0]
s &amp;lt;&amp;lt; ($ruby.object_id.coerce +2018)        [0]
result = puts s*""
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This program of 10 lines does not output anything special, but as soon you run it with warnings enabled (&lt;code&gt;ruby -w&lt;/code&gt;), each line generates two warnings (Ruby 2.5), one at compile-time, and another one at runtime!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kin.rb:1: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
kin.rb:2: warning: mismatched indentations at 'end' with 'def' at 1
kin.rb:3: warning: shadowing outer local variable - s
kin.rb:4: warning: `frozen_string_literal' is ignored after any tokens
kin.rb:5: warning: `*' interpreted as argument prefix
kin.rb:6: warning: Float 1e2018 out of range
kin.rb:7: warning: comparison '&amp;gt;' after comparison
kin.rb:8: warning: unused literal ignored
kin.rb:9: warning: ambiguous first argument; put parentheses or a space even after `+' operator
kin.rb:10: warning: assigned but unused variable - result
kin.rb:1: warning: method redefined; discarding old write
kin.rb:2: warning: previous definition of write was here
kin.rb:3: warning: given block not used
kin.rb:4: warning: passing a block to String#grapheme_clusters is deprecated
kin.rb:4: warning: character class has duplicated range: /\X/
kin.rb:5: warning: unknown unpack directive 'o' in 'ao'
kin.rb:6: warning: Bignum out of Float range
kin.rb:7: warning: trust is deprecated and its behavior is same as untaint
kin.rb:8: warning: public_class_method with no argument is just ignored
kin.rb:9: warning: global variable `$ruby' not initialized
kin.rb:10: warning: #&amp;lt;IO:&amp;lt;STDOUT&amp;gt;&amp;gt;.write is outdated interface which accepts just one argument
TRICK2018
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="honorable-mentions"&gt;Honorable Mentions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/tompng/entry.rb"&gt;"Best monkey"&lt;/a&gt; by Tomoya Ishida (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/tompng/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/shinh/entry.rb"&gt;"Best abuse of lambda"&lt;/a&gt; by Shinichiro Hamaji (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/shinh/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/yugui/entry.rb"&gt;"Best abuse of meta"&lt;/a&gt; by Yuki Yugui Sonoda (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/yugui/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/omoikane/entry.rb"&gt;"Most solvable"&lt;/a&gt; by Don Yang (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/omoikane/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/yhara/entry.rb"&gt;"Best layout"&lt;/a&gt; by Yutaka Hara (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/yhara/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/eregon/entry.rb"&gt;"Best abuse of regexp"&lt;/a&gt; by Benoit Daloze (&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/eregon/example.json"&gt;example.json&lt;/a&gt;, &lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/eregon/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/tamayose/entry.rb"&gt;"Most tolerant"&lt;/a&gt; by Shuichi Tamayose (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/tamayose/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2018/master/honorable-mentions/colin/entry.rb"&gt;"Best applause"&lt;/a&gt; by Colin Fulton (&lt;a href="https://github.com/tric/trick2018/blob/master/honorable-mentions/colin/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/48-ruby-tricks-of-2015.html"&gt;TRIC 2015&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/47-ruby-tricks-of-2013.html"&gt;TRIC 2013&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Super Snakes</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/74-super-snakes.html"/>
    <id>https://idiosyncratic-ruby.com/74-super-snakes.html</id>
    <published>2020-08-17T00:00:00Z</published>
    <updated>2020-08-17T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Have you ever been confused by the &lt;strong&gt;__underscores__&lt;/strong&gt; required by some of &lt;strong&gt;__RUBY__&lt;/strong&gt;'s features? You can get it right with this overview of all of "super snake" keywords and methods.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;There are three different types of underscore-wrapped syntaxes in the Ruby core language:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;keywords&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Object&lt;/strong&gt; methods and&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Kernel&lt;/strong&gt; methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us take a look at each of them, and understand the motivations behind. Or directly jump to:&lt;/p&gt;

&lt;p&gt;&lt;a href="#file"&gt;__FILE__&lt;/a&gt;&lt;a href="#line"&gt;__LINE__&lt;/a&gt;&lt;a href="#encoding"&gt;__ENCODING__&lt;/a&gt;&lt;a href="#end"&gt;__END__&lt;/a&gt;&lt;a href="#method-and-callee"&gt;__method__&lt;/a&gt;&lt;a href="#method-and-callee"&gt;__callee__&lt;/a&gt;&lt;a href="#dir"&gt;__dir__&lt;/a&gt;&lt;a href="#id"&gt;__id__&lt;/a&gt;&lt;a href="#send"&gt;__send__&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="keywords-built-into-ruby-syntax"&gt;Keywords (Built into Ruby Syntax)&lt;/h2&gt;

&lt;p&gt;These are directly translated by the Ruby interpreter: You cannot use meta-programming with these, since they will always return the corresponding value directly:&lt;/p&gt;

&lt;h3 id="file"&gt;__FILE__&lt;/h3&gt;

&lt;p&gt;Returns the current source file's name. Might be special value for unusual invocations:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Context&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;File, directly executed&lt;/td&gt;
      &lt;td&gt;path name, can be relative&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;File, required / loaded&lt;/td&gt;
      &lt;td&gt;absolute path&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;IRB&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"(irb)"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-eval"&gt;eval&lt;/a&gt;'d&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"(eval)"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$ ruby -e&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-e"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Standard Input&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="line"&gt;__LINE__&lt;/h3&gt;

&lt;p&gt;Returns the line number in the current source file. Also works in IRB and with code executed with &lt;code&gt;$ ruby -e&lt;/code&gt;, &lt;strong&gt;STDIN&lt;/strong&gt; or &lt;code&gt;eval&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="encoding"&gt;__ENCODING__&lt;/h3&gt;

&lt;p&gt;Returns the source file's &lt;a href="https://ruby-doc.org/core/Encoding.html"&gt;encoding&lt;/a&gt;, as specified per &lt;a href="/58-magic-instructions.html"&gt;magic comment&lt;/a&gt;. The default source file encoding is UTF-8. The important thing to understand is that this value should correspond to the actual encoding of the source file, so to change the source encoding, it is not enough to just change the magic comment, you will also need to convert the source file.&lt;/p&gt;

&lt;p&gt;You should also note that this is unrelated to some other global encoding configurations, which serve different purposes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Encoding.html#class-Encoding-label-External+encoding"&gt;Encoding.default_external&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Encoding.html#class-Encoding-label-Internal+encoding"&gt;Encoding.default_internal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="end-at-beginning-of-line"&gt;__END__ (at beginning of line)&lt;/h3&gt;

&lt;p&gt;A special syntax which will end the source file earlier and create &lt;a href="/59-big-data-without-end.html"&gt;big data&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="underscore-wrapped-kernel-methods"&gt;Underscore-Wrapped &lt;code&gt;Kernel&lt;/code&gt; Methods&lt;/h2&gt;

&lt;p&gt;These special Kernel methods are lowercased to highlight the fact that they are actually just methods and no built-in keywords.&lt;/p&gt;

&lt;h3 id="method-and-callee"&gt;__method__ and __callee__&lt;/h3&gt;

&lt;p&gt;Both return the current method's name, but they differ in a detail: When using a method alias, &lt;code&gt;__callee__&lt;/code&gt; will return the aliased method name, while &lt;code&gt;__method__&lt;/code&gt; would return the original name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def example!
  p [__method__, __callee__]
end
alias test! example!

example! # =&amp;gt; [:example!, :example!]
test! # =&amp;gt; [:example!, :test!]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Two similar and useful methods are &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-caller"&gt;Kernel#caller&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-caller_locations"&gt;Kernel#caller_locations&lt;/a&gt;, which provide some more context.&lt;/p&gt;

&lt;h3 id="dir"&gt;__dir__&lt;/h3&gt;

&lt;p&gt;Returns &lt;code&gt;File.dirname(File.realpath(__FILE__))&lt;/code&gt;, which is the absolute path of the directory of the current source file.&lt;/p&gt;

&lt;p&gt;While it also works in IRB, it will return &lt;code&gt;nil&lt;/code&gt; in eval, &lt;code&gt;$ ruby -e&lt;/code&gt;, and &lt;strong&gt;STDIN&lt;/strong&gt; contexts.&lt;/p&gt;

&lt;h2 id="underscore-wrapped-basicobject-methods"&gt;Underscore-Wrapped &lt;code&gt;BasicObject&lt;/code&gt; Methods&lt;/h2&gt;

&lt;p&gt;Both of the following methods are so important that every object (even those that inherit from &lt;a href="https://ruby-doc.org/core/BasicObject.html"&gt;BasicObject&lt;/a&gt; directly) should have. This is why they got some underscore companions.&lt;/p&gt;

&lt;h3 id="id"&gt;__id__&lt;/h3&gt;

&lt;p&gt;Returns the object id, just like &lt;a href="https://ruby-doc.org/core/Object.html#method-i-object_id"&gt;Object#object_id&lt;/a&gt;. It mainly exists for historical reasons, most people use &lt;code&gt;object_id&lt;/code&gt; nowadays.&lt;/p&gt;

&lt;h3 id="send"&gt;__send__&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;__send__&lt;/code&gt; method is an alias of the &lt;a href="https://ruby-doc.org/core/Object.html#method-i-send"&gt;Object#send&lt;/a&gt;, which dynamically calls the method given as a symbol argument. Its purpose is that you should still be able to use the &lt;em&gt;send functionality&lt;/em&gt; in case someone redefines the &lt;code&gt;send&lt;/code&gt; method. The interpreter will issue a warning¹ should you try to redefine or remove it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;warning: redefining `__send__' may cause serious problems
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nevertheless, it is probably not a good idea either to redefine non-underscore-wrapped &lt;code&gt;send&lt;/code&gt;, since a lot of meta-programming relies on it…&lt;/p&gt;

&lt;p&gt;¹ This is not true for &lt;code&gt;__id__&lt;/code&gt; - Ruby will not complain if you choose to redefine it. It will complain for &lt;code&gt;object_id&lt;/code&gt; though.&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/5-constant-shadows.html"&gt;Episode 5: Constant Shadows&lt;/a&gt; (even another way Ruby uses underscores)&lt;/li&gt;
  &lt;li&gt;&lt;a href="/19-semantic-symbols.html"&gt;Episode 19: Symbolic Reservations&lt;/a&gt; (in certain cases, symbols with underscores can be special)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many thanks to &lt;a href="https://github.com/janlelis/idiosyncratic-ruby.com/commit/a5268be57200ea7caba0f182de25e4d954df6887#commitcomment-41542806"&gt;Shannon Skipper for pointing out&lt;/a&gt; that &lt;a href="/24-goto-fail.html"&gt;the mysterious &lt;code&gt;SUPPORT_JOKE&lt;/code&gt; compiler option's &lt;code&gt;__goto__&lt;/code&gt; and &lt;code&gt;__label__&lt;/code&gt; also make use of underscores&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Unicode Version Mapping</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/73-unicode-version-mapping.html"/>
    <id>https://idiosyncratic-ruby.com/73-unicode-version-mapping.html</id>
    <published>2020-08-14T00:00:00Z</published>
    <updated>2020-08-14T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;The Ruby core team cares a lot about Unicode, and this is why we have &lt;a href="/66-ruby-has-character.html"&gt;pretty good Unicode support&lt;/a&gt; in the language.&lt;/p&gt;

&lt;p&gt;Even though the Unicode standard evolves constantly - it gets updated at least once a year - Ruby's Unicode support is often only a little bit behind the current version of Unicode. The following tables list which Ruby version supports which version of Unicode / Emoji:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="ruby--unicode"&gt;Ruby / Unicode&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Ruby Version&lt;/th&gt;
      &lt;th&gt;Unicode Version&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.3&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;15.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.2&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;15.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;13.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.1.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.7&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.1.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.6.3+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.1.0&lt;/strong&gt;¹&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.6.2&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.6.1-&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;11.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;10.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.4&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;9.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.3&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;8.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.2&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;7.0.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;6.1.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.0&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;6.1.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;1.9&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;5.2.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Unicode 12.1 &lt;a href="https://unicode.org/versions/Unicode12.1.0/#Summary"&gt;introduced a single character&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting with Ruby 2.4, you can find out your Ruby version's Unicode support with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RbConfig::CONFIG["UNICODE_VERSION"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="ruby--emoji"&gt;Ruby / Emoji&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Ruby Version&lt;/th&gt;
      &lt;th&gt;Emoji Version&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.3&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;15.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.2&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;15.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;13.1&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.1&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.7&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.1&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.6.2+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;12.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.6.1-&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;11.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;5.0&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Starting with Ruby 2.6, you can find out your Ruby version's Emoji support with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RbConfig::CONFIG["UNICODE_EMOJI_VERSION"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-version"&gt;unicode-version&lt;/a&gt;: These tables available as a gem&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-emoji"&gt;unicode-emoji&lt;/a&gt;: Regular Expression for Unicode Emoji&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-x"&gt;unicode-x&lt;/a&gt;: More micro libraries which provide latest Unicode data&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Clear Case of Unclear Casing</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/72-clear-case-of-unclear-casing.html"/>
    <id>https://idiosyncratic-ruby.com/72-clear-case-of-unclear-casing.html</id>
    <published>2020-08-12T00:00:00Z</published>
    <updated>2020-08-12T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Recent Ruby versions allow you to choose from a wide-range of uppercase letters - beyond just ASCII - to start a constant / class name:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Österreich
  # 00D6 ├─ Ö   ├─ LATIN CAPITAL LETTER O WITH DIAERESIS
end
# Syntax OK
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, it is not possible to use just any Unicode character:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ℻
  # 213B ├─ ℻   ├─ FACSIMILE SIGN
end
# SyntaxError
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Only characters of the categories &lt;em&gt;Uppercase_Letter&lt;/em&gt; or &lt;em&gt;Titlecase_Letter&lt;/em&gt; of your &lt;a href="/73-unicode-version-mapping.html"&gt;current Ruby's Unicode version&lt;/a&gt; are allowed. This can be trickier that you might think at first, as illustrated here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class 🅆
  # 1F146 ├─ 🅆    ├─ SQUARED LATIN CAPITAL LETTER W
end
# Syntax OK

class 🅏
  # 1F14F ├─ 🅏    ├─ SQUARED WC
end
# SyntaxError
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or consider this case:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class 𐲄
  # 10C84 ├─ 𐲄    ├─ OLD HUNGARIAN CAPITAL LETTER EC
end
# Syntax OK

class 🡓
  # 1F853 ├─ 🡓    ├─ DOWNWARDS SANS-SERIF ARROW
end
# SyntaxError
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="start-a-class"&gt;Start a Class&lt;/h2&gt;

&lt;p&gt;For reference, this is the list of allowed characters to start a class/constant, as of Ruby 3.0:&lt;/p&gt;

&lt;table class="table-10-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Char&lt;/th&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;A&lt;/td&gt;
      &lt;td&gt;U+0041&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;B&lt;/td&gt;
      &lt;td&gt;U+0042&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;C&lt;/td&gt;
      &lt;td&gt;U+0043&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;D&lt;/td&gt;
      &lt;td&gt;U+0044&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;E&lt;/td&gt;
      &lt;td&gt;U+0045&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;F&lt;/td&gt;
      &lt;td&gt;U+0046&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;G&lt;/td&gt;
      &lt;td&gt;U+0047&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;U+0048&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;I&lt;/td&gt;
      &lt;td&gt;U+0049&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;J&lt;/td&gt;
      &lt;td&gt;U+004A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;K&lt;/td&gt;
      &lt;td&gt;U+004B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;L&lt;/td&gt;
      &lt;td&gt;U+004C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;M&lt;/td&gt;
      &lt;td&gt;U+004D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;N&lt;/td&gt;
      &lt;td&gt;U+004E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;O&lt;/td&gt;
      &lt;td&gt;U+004F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;P&lt;/td&gt;
      &lt;td&gt;U+0050&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Q&lt;/td&gt;
      &lt;td&gt;U+0051&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;R&lt;/td&gt;
      &lt;td&gt;U+0052&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;S&lt;/td&gt;
      &lt;td&gt;U+0053&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T&lt;/td&gt;
      &lt;td&gt;U+0054&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;U&lt;/td&gt;
      &lt;td&gt;U+0055&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;V&lt;/td&gt;
      &lt;td&gt;U+0056&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;W&lt;/td&gt;
      &lt;td&gt;U+0057&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;X&lt;/td&gt;
      &lt;td&gt;U+0058&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Y&lt;/td&gt;
      &lt;td&gt;U+0059&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Z&lt;/td&gt;
      &lt;td&gt;U+005A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;À&lt;/td&gt;
      &lt;td&gt;U+00C0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Á&lt;/td&gt;
      &lt;td&gt;U+00C1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Â&lt;/td&gt;
      &lt;td&gt;U+00C2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ã&lt;/td&gt;
      &lt;td&gt;U+00C3&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ä&lt;/td&gt;
      &lt;td&gt;U+00C4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Å&lt;/td&gt;
      &lt;td&gt;U+00C5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH RING ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Æ&lt;/td&gt;
      &lt;td&gt;U+00C6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ç&lt;/td&gt;
      &lt;td&gt;U+00C7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;È&lt;/td&gt;
      &lt;td&gt;U+00C8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;É&lt;/td&gt;
      &lt;td&gt;U+00C9&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ê&lt;/td&gt;
      &lt;td&gt;U+00CA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ë&lt;/td&gt;
      &lt;td&gt;U+00CB&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ì&lt;/td&gt;
      &lt;td&gt;U+00CC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Í&lt;/td&gt;
      &lt;td&gt;U+00CD&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Î&lt;/td&gt;
      &lt;td&gt;U+00CE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ï&lt;/td&gt;
      &lt;td&gt;U+00CF&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ð&lt;/td&gt;
      &lt;td&gt;U+00D0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ETH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ñ&lt;/td&gt;
      &lt;td&gt;U+00D1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ò&lt;/td&gt;
      &lt;td&gt;U+00D2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ó&lt;/td&gt;
      &lt;td&gt;U+00D3&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ô&lt;/td&gt;
      &lt;td&gt;U+00D4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Õ&lt;/td&gt;
      &lt;td&gt;U+00D5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ö&lt;/td&gt;
      &lt;td&gt;U+00D6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ø&lt;/td&gt;
      &lt;td&gt;U+00D8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ù&lt;/td&gt;
      &lt;td&gt;U+00D9&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ú&lt;/td&gt;
      &lt;td&gt;U+00DA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Û&lt;/td&gt;
      &lt;td&gt;U+00DB&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ü&lt;/td&gt;
      &lt;td&gt;U+00DC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ý&lt;/td&gt;
      &lt;td&gt;U+00DD&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Þ&lt;/td&gt;
      &lt;td&gt;U+00DE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER THORN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ā&lt;/td&gt;
      &lt;td&gt;U+0100&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ă&lt;/td&gt;
      &lt;td&gt;U+0102&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ą&lt;/td&gt;
      &lt;td&gt;U+0104&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH OGONEK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ć&lt;/td&gt;
      &lt;td&gt;U+0106&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĉ&lt;/td&gt;
      &lt;td&gt;U+0108&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ċ&lt;/td&gt;
      &lt;td&gt;U+010A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Č&lt;/td&gt;
      &lt;td&gt;U+010C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ď&lt;/td&gt;
      &lt;td&gt;U+010E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Đ&lt;/td&gt;
      &lt;td&gt;U+0110&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ē&lt;/td&gt;
      &lt;td&gt;U+0112&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĕ&lt;/td&gt;
      &lt;td&gt;U+0114&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ė&lt;/td&gt;
      &lt;td&gt;U+0116&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ę&lt;/td&gt;
      &lt;td&gt;U+0118&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH OGONEK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ě&lt;/td&gt;
      &lt;td&gt;U+011A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĝ&lt;/td&gt;
      &lt;td&gt;U+011C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ğ&lt;/td&gt;
      &lt;td&gt;U+011E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ġ&lt;/td&gt;
      &lt;td&gt;U+0120&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ģ&lt;/td&gt;
      &lt;td&gt;U+0122&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĥ&lt;/td&gt;
      &lt;td&gt;U+0124&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ħ&lt;/td&gt;
      &lt;td&gt;U+0126&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĩ&lt;/td&gt;
      &lt;td&gt;U+0128&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ī&lt;/td&gt;
      &lt;td&gt;U+012A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĭ&lt;/td&gt;
      &lt;td&gt;U+012C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Į&lt;/td&gt;
      &lt;td&gt;U+012E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH OGONEK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;İ&lt;/td&gt;
      &lt;td&gt;U+0130&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĳ&lt;/td&gt;
      &lt;td&gt;U+0132&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LIGATURE IJ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĵ&lt;/td&gt;
      &lt;td&gt;U+0134&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER J WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ķ&lt;/td&gt;
      &lt;td&gt;U+0136&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ĺ&lt;/td&gt;
      &lt;td&gt;U+0139&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ļ&lt;/td&gt;
      &lt;td&gt;U+013B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ľ&lt;/td&gt;
      &lt;td&gt;U+013D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŀ&lt;/td&gt;
      &lt;td&gt;U+013F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH MIDDLE DOT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ł&lt;/td&gt;
      &lt;td&gt;U+0141&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ń&lt;/td&gt;
      &lt;td&gt;U+0143&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ņ&lt;/td&gt;
      &lt;td&gt;U+0145&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ň&lt;/td&gt;
      &lt;td&gt;U+0147&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŋ&lt;/td&gt;
      &lt;td&gt;U+014A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ENG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ō&lt;/td&gt;
      &lt;td&gt;U+014C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŏ&lt;/td&gt;
      &lt;td&gt;U+014E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ő&lt;/td&gt;
      &lt;td&gt;U+0150&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Œ&lt;/td&gt;
      &lt;td&gt;U+0152&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LIGATURE OE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŕ&lt;/td&gt;
      &lt;td&gt;U+0154&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŗ&lt;/td&gt;
      &lt;td&gt;U+0156&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ř&lt;/td&gt;
      &lt;td&gt;U+0158&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ś&lt;/td&gt;
      &lt;td&gt;U+015A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŝ&lt;/td&gt;
      &lt;td&gt;U+015C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ş&lt;/td&gt;
      &lt;td&gt;U+015E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Š&lt;/td&gt;
      &lt;td&gt;U+0160&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ţ&lt;/td&gt;
      &lt;td&gt;U+0162&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ť&lt;/td&gt;
      &lt;td&gt;U+0164&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŧ&lt;/td&gt;
      &lt;td&gt;U+0166&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ũ&lt;/td&gt;
      &lt;td&gt;U+0168&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ū&lt;/td&gt;
      &lt;td&gt;U+016A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŭ&lt;/td&gt;
      &lt;td&gt;U+016C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ů&lt;/td&gt;
      &lt;td&gt;U+016E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH RING ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ű&lt;/td&gt;
      &lt;td&gt;U+0170&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ų&lt;/td&gt;
      &lt;td&gt;U+0172&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH OGONEK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŵ&lt;/td&gt;
      &lt;td&gt;U+0174&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ŷ&lt;/td&gt;
      &lt;td&gt;U+0176&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ÿ&lt;/td&gt;
      &lt;td&gt;U+0178&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ź&lt;/td&gt;
      &lt;td&gt;U+0179&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ż&lt;/td&gt;
      &lt;td&gt;U+017B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ž&lt;/td&gt;
      &lt;td&gt;U+017D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɓ&lt;/td&gt;
      &lt;td&gt;U+0181&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƃ&lt;/td&gt;
      &lt;td&gt;U+0182&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH TOPBAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƅ&lt;/td&gt;
      &lt;td&gt;U+0184&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TONE SIX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɔ&lt;/td&gt;
      &lt;td&gt;U+0186&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OPEN O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƈ&lt;/td&gt;
      &lt;td&gt;U+0187&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɖ&lt;/td&gt;
      &lt;td&gt;U+0189&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AFRICAN D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɗ&lt;/td&gt;
      &lt;td&gt;U+018A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƌ&lt;/td&gt;
      &lt;td&gt;U+018B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH TOPBAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǝ&lt;/td&gt;
      &lt;td&gt;U+018E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER REVERSED E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ə&lt;/td&gt;
      &lt;td&gt;U+018F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SCHWA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɛ&lt;/td&gt;
      &lt;td&gt;U+0190&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OPEN E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƒ&lt;/td&gt;
      &lt;td&gt;U+0191&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER F WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɠ&lt;/td&gt;
      &lt;td&gt;U+0193&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɣ&lt;/td&gt;
      &lt;td&gt;U+0194&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɩ&lt;/td&gt;
      &lt;td&gt;U+0196&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɨ&lt;/td&gt;
      &lt;td&gt;U+0197&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƙ&lt;/td&gt;
      &lt;td&gt;U+0198&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɯ&lt;/td&gt;
      &lt;td&gt;U+019C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɲ&lt;/td&gt;
      &lt;td&gt;U+019D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH LEFT HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɵ&lt;/td&gt;
      &lt;td&gt;U+019F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH MIDDLE TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ơ&lt;/td&gt;
      &lt;td&gt;U+01A0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƣ&lt;/td&gt;
      &lt;td&gt;U+01A2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƥ&lt;/td&gt;
      &lt;td&gt;U+01A4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʀ&lt;/td&gt;
      &lt;td&gt;U+01A6&lt;/td&gt;
      &lt;td&gt;LATIN LETTER YR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƨ&lt;/td&gt;
      &lt;td&gt;U+01A7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TONE TWO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʃ&lt;/td&gt;
      &lt;td&gt;U+01A9&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ESH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƭ&lt;/td&gt;
      &lt;td&gt;U+01AC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʈ&lt;/td&gt;
      &lt;td&gt;U+01AE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ư&lt;/td&gt;
      &lt;td&gt;U+01AF&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʊ&lt;/td&gt;
      &lt;td&gt;U+01B1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʋ&lt;/td&gt;
      &lt;td&gt;U+01B2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER V WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƴ&lt;/td&gt;
      &lt;td&gt;U+01B3&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƶ&lt;/td&gt;
      &lt;td&gt;U+01B5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʒ&lt;/td&gt;
      &lt;td&gt;U+01B7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER EZH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƹ&lt;/td&gt;
      &lt;td&gt;U+01B8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER EZH REVERSED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƽ&lt;/td&gt;
      &lt;td&gt;U+01BC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TONE FIVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǆ&lt;/td&gt;
      &lt;td&gt;U+01C4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER DZ WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ǅ&lt;/td&gt;
      &lt;td&gt;U+01C5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǉ&lt;/td&gt;
      &lt;td&gt;U+01C7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER LJ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ǈ&lt;/td&gt;
      &lt;td&gt;U+01C8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH SMALL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǌ&lt;/td&gt;
      &lt;td&gt;U+01CA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER NJ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ǋ&lt;/td&gt;
      &lt;td&gt;U+01CB&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH SMALL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǎ&lt;/td&gt;
      &lt;td&gt;U+01CD&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǐ&lt;/td&gt;
      &lt;td&gt;U+01CF&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǒ&lt;/td&gt;
      &lt;td&gt;U+01D1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǔ&lt;/td&gt;
      &lt;td&gt;U+01D3&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǖ&lt;/td&gt;
      &lt;td&gt;U+01D5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǘ&lt;/td&gt;
      &lt;td&gt;U+01D7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǚ&lt;/td&gt;
      &lt;td&gt;U+01D9&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǜ&lt;/td&gt;
      &lt;td&gt;U+01DB&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǟ&lt;/td&gt;
      &lt;td&gt;U+01DE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǡ&lt;/td&gt;
      &lt;td&gt;U+01E0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǣ&lt;/td&gt;
      &lt;td&gt;U+01E2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AE WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǥ&lt;/td&gt;
      &lt;td&gt;U+01E4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǧ&lt;/td&gt;
      &lt;td&gt;U+01E6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǩ&lt;/td&gt;
      &lt;td&gt;U+01E8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǫ&lt;/td&gt;
      &lt;td&gt;U+01EA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH OGONEK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǭ&lt;/td&gt;
      &lt;td&gt;U+01EC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǯ&lt;/td&gt;
      &lt;td&gt;U+01EE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER EZH WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǳ&lt;/td&gt;
      &lt;td&gt;U+01F1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER DZ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ǲ&lt;/td&gt;
      &lt;td&gt;U+01F2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH SMALL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǵ&lt;/td&gt;
      &lt;td&gt;U+01F4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƕ&lt;/td&gt;
      &lt;td&gt;U+01F6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER HWAIR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƿ&lt;/td&gt;
      &lt;td&gt;U+01F7&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER WYNN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǹ&lt;/td&gt;
      &lt;td&gt;U+01F8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǻ&lt;/td&gt;
      &lt;td&gt;U+01FA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǽ&lt;/td&gt;
      &lt;td&gt;U+01FC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AE WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ǿ&lt;/td&gt;
      &lt;td&gt;U+01FE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȁ&lt;/td&gt;
      &lt;td&gt;U+0200&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȃ&lt;/td&gt;
      &lt;td&gt;U+0202&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȅ&lt;/td&gt;
      &lt;td&gt;U+0204&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȇ&lt;/td&gt;
      &lt;td&gt;U+0206&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȉ&lt;/td&gt;
      &lt;td&gt;U+0208&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȋ&lt;/td&gt;
      &lt;td&gt;U+020A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȍ&lt;/td&gt;
      &lt;td&gt;U+020C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȏ&lt;/td&gt;
      &lt;td&gt;U+020E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȑ&lt;/td&gt;
      &lt;td&gt;U+0210&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȓ&lt;/td&gt;
      &lt;td&gt;U+0212&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȕ&lt;/td&gt;
      &lt;td&gt;U+0214&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȗ&lt;/td&gt;
      &lt;td&gt;U+0216&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH INVERTED BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ș&lt;/td&gt;
      &lt;td&gt;U+0218&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH COMMA BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ț&lt;/td&gt;
      &lt;td&gt;U+021A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH COMMA BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȝ&lt;/td&gt;
      &lt;td&gt;U+021C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER YOGH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȟ&lt;/td&gt;
      &lt;td&gt;U+021E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH CARON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƞ&lt;/td&gt;
      &lt;td&gt;U+0220&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȣ&lt;/td&gt;
      &lt;td&gt;U+0222&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȥ&lt;/td&gt;
      &lt;td&gt;U+0224&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȧ&lt;/td&gt;
      &lt;td&gt;U+0226&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȩ&lt;/td&gt;
      &lt;td&gt;U+0228&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȫ&lt;/td&gt;
      &lt;td&gt;U+022A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȭ&lt;/td&gt;
      &lt;td&gt;U+022C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH TILDE AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȯ&lt;/td&gt;
      &lt;td&gt;U+022E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȱ&lt;/td&gt;
      &lt;td&gt;U+0230&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȳ&lt;/td&gt;
      &lt;td&gt;U+0232&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱥ&lt;/td&gt;
      &lt;td&gt;U+023A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȼ&lt;/td&gt;
      &lt;td&gt;U+023B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƚ&lt;/td&gt;
      &lt;td&gt;U+023D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH BAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱦ&lt;/td&gt;
      &lt;td&gt;U+023E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɂ&lt;/td&gt;
      &lt;td&gt;U+0241&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER GLOTTAL STOP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ƀ&lt;/td&gt;
      &lt;td&gt;U+0243&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʉ&lt;/td&gt;
      &lt;td&gt;U+0244&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U BAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʌ&lt;/td&gt;
      &lt;td&gt;U+0245&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɇ&lt;/td&gt;
      &lt;td&gt;U+0246&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɉ&lt;/td&gt;
      &lt;td&gt;U+0248&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER J WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɋ&lt;/td&gt;
      &lt;td&gt;U+024A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɍ&lt;/td&gt;
      &lt;td&gt;U+024C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɏ&lt;/td&gt;
      &lt;td&gt;U+024E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͱ&lt;/td&gt;
      &lt;td&gt;U+0370&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER HETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͳ&lt;/td&gt;
      &lt;td&gt;U+0372&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ARCHAIC SAMPI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͷ&lt;/td&gt;
      &lt;td&gt;U+0376&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϳ&lt;/td&gt;
      &lt;td&gt;U+037F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER YOT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ά&lt;/td&gt;
      &lt;td&gt;U+0386&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Έ&lt;/td&gt;
      &lt;td&gt;U+0388&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ή&lt;/td&gt;
      &lt;td&gt;U+0389&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ί&lt;/td&gt;
      &lt;td&gt;U+038A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ό&lt;/td&gt;
      &lt;td&gt;U+038C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ύ&lt;/td&gt;
      &lt;td&gt;U+038E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ώ&lt;/td&gt;
      &lt;td&gt;U+038F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH TONOS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Α&lt;/td&gt;
      &lt;td&gt;U+0391&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Β&lt;/td&gt;
      &lt;td&gt;U+0392&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Γ&lt;/td&gt;
      &lt;td&gt;U+0393&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Δ&lt;/td&gt;
      &lt;td&gt;U+0394&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ε&lt;/td&gt;
      &lt;td&gt;U+0395&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ζ&lt;/td&gt;
      &lt;td&gt;U+0396&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Η&lt;/td&gt;
      &lt;td&gt;U+0397&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Θ&lt;/td&gt;
      &lt;td&gt;U+0398&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ι&lt;/td&gt;
      &lt;td&gt;U+0399&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Κ&lt;/td&gt;
      &lt;td&gt;U+039A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Λ&lt;/td&gt;
      &lt;td&gt;U+039B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Μ&lt;/td&gt;
      &lt;td&gt;U+039C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ν&lt;/td&gt;
      &lt;td&gt;U+039D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ξ&lt;/td&gt;
      &lt;td&gt;U+039E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ο&lt;/td&gt;
      &lt;td&gt;U+039F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Π&lt;/td&gt;
      &lt;td&gt;U+03A0&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ρ&lt;/td&gt;
      &lt;td&gt;U+03A1&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Σ&lt;/td&gt;
      &lt;td&gt;U+03A3&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Τ&lt;/td&gt;
      &lt;td&gt;U+03A4&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Υ&lt;/td&gt;
      &lt;td&gt;U+03A5&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Φ&lt;/td&gt;
      &lt;td&gt;U+03A6&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Χ&lt;/td&gt;
      &lt;td&gt;U+03A7&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ψ&lt;/td&gt;
      &lt;td&gt;U+03A8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ω&lt;/td&gt;
      &lt;td&gt;U+03A9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϊ&lt;/td&gt;
      &lt;td&gt;U+03AA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϋ&lt;/td&gt;
      &lt;td&gt;U+03AB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϗ&lt;/td&gt;
      &lt;td&gt;U+03CF&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL KAI SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ϒ&lt;/td&gt;
      &lt;td&gt;U+03D2&lt;/td&gt;
      &lt;td&gt;GREEK UPSILON WITH HOOK SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ϓ&lt;/td&gt;
      &lt;td&gt;U+03D3&lt;/td&gt;
      &lt;td&gt;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ϔ&lt;/td&gt;
      &lt;td&gt;U+03D4&lt;/td&gt;
      &lt;td&gt;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϙ&lt;/td&gt;
      &lt;td&gt;U+03D8&lt;/td&gt;
      &lt;td&gt;GREEK LETTER ARCHAIC KOPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϛ&lt;/td&gt;
      &lt;td&gt;U+03DA&lt;/td&gt;
      &lt;td&gt;GREEK LETTER STIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϝ&lt;/td&gt;
      &lt;td&gt;U+03DC&lt;/td&gt;
      &lt;td&gt;GREEK LETTER DIGAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϟ&lt;/td&gt;
      &lt;td&gt;U+03DE&lt;/td&gt;
      &lt;td&gt;GREEK LETTER KOPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϡ&lt;/td&gt;
      &lt;td&gt;U+03E0&lt;/td&gt;
      &lt;td&gt;GREEK LETTER SAMPI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϣ&lt;/td&gt;
      &lt;td&gt;U+03E2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER SHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϥ&lt;/td&gt;
      &lt;td&gt;U+03E4&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER FEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϧ&lt;/td&gt;
      &lt;td&gt;U+03E6&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER KHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϩ&lt;/td&gt;
      &lt;td&gt;U+03E8&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER HORI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϫ&lt;/td&gt;
      &lt;td&gt;U+03EA&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER GANGIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϭ&lt;/td&gt;
      &lt;td&gt;U+03EC&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER SHIMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϯ&lt;/td&gt;
      &lt;td&gt;U+03EE&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ϴ&lt;/td&gt;
      &lt;td&gt;U+03F4&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϸ&lt;/td&gt;
      &lt;td&gt;U+03F7&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER SHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϲ&lt;/td&gt;
      &lt;td&gt;U+03F9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LUNATE SIGMA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ϻ&lt;/td&gt;
      &lt;td&gt;U+03FA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER SAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͻ&lt;/td&gt;
      &lt;td&gt;U+03FD&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͼ&lt;/td&gt;
      &lt;td&gt;U+03FE&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ͽ&lt;/td&gt;
      &lt;td&gt;U+03FF&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѐ&lt;/td&gt;
      &lt;td&gt;U+0400&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IE WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ё&lt;/td&gt;
      &lt;td&gt;U+0401&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ђ&lt;/td&gt;
      &lt;td&gt;U+0402&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѓ&lt;/td&gt;
      &lt;td&gt;U+0403&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Є&lt;/td&gt;
      &lt;td&gt;U+0404&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER UKRAINIAN IE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѕ&lt;/td&gt;
      &lt;td&gt;U+0405&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;І&lt;/td&gt;
      &lt;td&gt;U+0406&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ї&lt;/td&gt;
      &lt;td&gt;U+0407&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ј&lt;/td&gt;
      &lt;td&gt;U+0408&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER JE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Љ&lt;/td&gt;
      &lt;td&gt;U+0409&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER LJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Њ&lt;/td&gt;
      &lt;td&gt;U+040A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER NJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ћ&lt;/td&gt;
      &lt;td&gt;U+040B&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TSHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ќ&lt;/td&gt;
      &lt;td&gt;U+040C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѝ&lt;/td&gt;
      &lt;td&gt;U+040D&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER I WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ў&lt;/td&gt;
      &lt;td&gt;U+040E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHORT U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Џ&lt;/td&gt;
      &lt;td&gt;U+040F&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;А&lt;/td&gt;
      &lt;td&gt;U+0410&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Б&lt;/td&gt;
      &lt;td&gt;U+0411&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;В&lt;/td&gt;
      &lt;td&gt;U+0412&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER VE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Г&lt;/td&gt;
      &lt;td&gt;U+0413&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Д&lt;/td&gt;
      &lt;td&gt;U+0414&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Е&lt;/td&gt;
      &lt;td&gt;U+0415&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ж&lt;/td&gt;
      &lt;td&gt;U+0416&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;З&lt;/td&gt;
      &lt;td&gt;U+0417&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;И&lt;/td&gt;
      &lt;td&gt;U+0418&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Й&lt;/td&gt;
      &lt;td&gt;U+0419&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHORT I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;К&lt;/td&gt;
      &lt;td&gt;U+041A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Л&lt;/td&gt;
      &lt;td&gt;U+041B&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;М&lt;/td&gt;
      &lt;td&gt;U+041C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Н&lt;/td&gt;
      &lt;td&gt;U+041D&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;О&lt;/td&gt;
      &lt;td&gt;U+041E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;П&lt;/td&gt;
      &lt;td&gt;U+041F&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER PE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Р&lt;/td&gt;
      &lt;td&gt;U+0420&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;С&lt;/td&gt;
      &lt;td&gt;U+0421&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ES&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Т&lt;/td&gt;
      &lt;td&gt;U+0422&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;У&lt;/td&gt;
      &lt;td&gt;U+0423&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ф&lt;/td&gt;
      &lt;td&gt;U+0424&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Х&lt;/td&gt;
      &lt;td&gt;U+0425&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ц&lt;/td&gt;
      &lt;td&gt;U+0426&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TSE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ч&lt;/td&gt;
      &lt;td&gt;U+0427&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ш&lt;/td&gt;
      &lt;td&gt;U+0428&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Щ&lt;/td&gt;
      &lt;td&gt;U+0429&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHCHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ъ&lt;/td&gt;
      &lt;td&gt;U+042A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HARD SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ы&lt;/td&gt;
      &lt;td&gt;U+042B&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YERU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ь&lt;/td&gt;
      &lt;td&gt;U+042C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SOFT SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Э&lt;/td&gt;
      &lt;td&gt;U+042D&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ю&lt;/td&gt;
      &lt;td&gt;U+042E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Я&lt;/td&gt;
      &lt;td&gt;U+042F&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѡ&lt;/td&gt;
      &lt;td&gt;U+0460&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѣ&lt;/td&gt;
      &lt;td&gt;U+0462&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YAT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѥ&lt;/td&gt;
      &lt;td&gt;U+0464&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѧ&lt;/td&gt;
      &lt;td&gt;U+0466&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER LITTLE YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѩ&lt;/td&gt;
      &lt;td&gt;U+0468&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѫ&lt;/td&gt;
      &lt;td&gt;U+046A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BIG YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѭ&lt;/td&gt;
      &lt;td&gt;U+046C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѯ&lt;/td&gt;
      &lt;td&gt;U+046E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѱ&lt;/td&gt;
      &lt;td&gt;U+0470&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѳ&lt;/td&gt;
      &lt;td&gt;U+0472&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER FITA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѵ&lt;/td&gt;
      &lt;td&gt;U+0474&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IZHITSA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѷ&lt;/td&gt;
      &lt;td&gt;U+0476&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѹ&lt;/td&gt;
      &lt;td&gt;U+0478&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER UK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѻ&lt;/td&gt;
      &lt;td&gt;U+047A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ROUND OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѽ&lt;/td&gt;
      &lt;td&gt;U+047C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ѿ&lt;/td&gt;
      &lt;td&gt;U+047E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER OT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҁ&lt;/td&gt;
      &lt;td&gt;U+0480&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҋ&lt;/td&gt;
      &lt;td&gt;U+048A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҍ&lt;/td&gt;
      &lt;td&gt;U+048C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SEMISOFT SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҏ&lt;/td&gt;
      &lt;td&gt;U+048E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ER WITH TICK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ґ&lt;/td&gt;
      &lt;td&gt;U+0490&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE WITH UPTURN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ғ&lt;/td&gt;
      &lt;td&gt;U+0492&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҕ&lt;/td&gt;
      &lt;td&gt;U+0494&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Җ&lt;/td&gt;
      &lt;td&gt;U+0496&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҙ&lt;/td&gt;
      &lt;td&gt;U+0498&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Қ&lt;/td&gt;
      &lt;td&gt;U+049A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KA WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҝ&lt;/td&gt;
      &lt;td&gt;U+049C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҟ&lt;/td&gt;
      &lt;td&gt;U+049E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KA WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҡ&lt;/td&gt;
      &lt;td&gt;U+04A0&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BASHKIR KA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ң&lt;/td&gt;
      &lt;td&gt;U+04A2&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҥ&lt;/td&gt;
      &lt;td&gt;U+04A4&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LIGATURE EN GHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҧ&lt;/td&gt;
      &lt;td&gt;U+04A6&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҩ&lt;/td&gt;
      &lt;td&gt;U+04A8&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ABKHASIAN HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҫ&lt;/td&gt;
      &lt;td&gt;U+04AA&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ES WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҭ&lt;/td&gt;
      &lt;td&gt;U+04AC&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ү&lt;/td&gt;
      &lt;td&gt;U+04AE&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER STRAIGHT U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ұ&lt;/td&gt;
      &lt;td&gt;U+04B0&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҳ&lt;/td&gt;
      &lt;td&gt;U+04B2&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HA WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҵ&lt;/td&gt;
      &lt;td&gt;U+04B4&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LIGATURE TE TSE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҷ&lt;/td&gt;
      &lt;td&gt;U+04B6&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҹ&lt;/td&gt;
      &lt;td&gt;U+04B8&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Һ&lt;/td&gt;
      &lt;td&gt;U+04BA&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҽ&lt;/td&gt;
      &lt;td&gt;U+04BC&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ABKHASIAN CHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ҿ&lt;/td&gt;
      &lt;td&gt;U+04BE&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӏ&lt;/td&gt;
      &lt;td&gt;U+04C0&lt;/td&gt;
      &lt;td&gt;CYRILLIC LETTER PALOCHKA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӂ&lt;/td&gt;
      &lt;td&gt;U+04C1&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZHE WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӄ&lt;/td&gt;
      &lt;td&gt;U+04C3&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KA WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӆ&lt;/td&gt;
      &lt;td&gt;U+04C5&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EL WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӈ&lt;/td&gt;
      &lt;td&gt;U+04C7&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӊ&lt;/td&gt;
      &lt;td&gt;U+04C9&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӌ&lt;/td&gt;
      &lt;td&gt;U+04CB&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӎ&lt;/td&gt;
      &lt;td&gt;U+04CD&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EM WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӑ&lt;/td&gt;
      &lt;td&gt;U+04D0&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER A WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӓ&lt;/td&gt;
      &lt;td&gt;U+04D2&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER A WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӕ&lt;/td&gt;
      &lt;td&gt;U+04D4&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LIGATURE A IE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӗ&lt;/td&gt;
      &lt;td&gt;U+04D6&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IE WITH BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ә&lt;/td&gt;
      &lt;td&gt;U+04D8&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SCHWA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӛ&lt;/td&gt;
      &lt;td&gt;U+04DA&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӝ&lt;/td&gt;
      &lt;td&gt;U+04DC&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӟ&lt;/td&gt;
      &lt;td&gt;U+04DE&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӡ&lt;/td&gt;
      &lt;td&gt;U+04E0&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ABKHASIAN DZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӣ&lt;/td&gt;
      &lt;td&gt;U+04E2&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER I WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӥ&lt;/td&gt;
      &lt;td&gt;U+04E4&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER I WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӧ&lt;/td&gt;
      &lt;td&gt;U+04E6&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER O WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ө&lt;/td&gt;
      &lt;td&gt;U+04E8&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BARRED O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӫ&lt;/td&gt;
      &lt;td&gt;U+04EA&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӭ&lt;/td&gt;
      &lt;td&gt;U+04EC&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER E WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӯ&lt;/td&gt;
      &lt;td&gt;U+04EE&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER U WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӱ&lt;/td&gt;
      &lt;td&gt;U+04F0&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER U WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӳ&lt;/td&gt;
      &lt;td&gt;U+04F2&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӵ&lt;/td&gt;
      &lt;td&gt;U+04F4&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӷ&lt;/td&gt;
      &lt;td&gt;U+04F6&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӹ&lt;/td&gt;
      &lt;td&gt;U+04F8&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӻ&lt;/td&gt;
      &lt;td&gt;U+04FA&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӽ&lt;/td&gt;
      &lt;td&gt;U+04FC&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HA WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ӿ&lt;/td&gt;
      &lt;td&gt;U+04FE&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HA WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԁ&lt;/td&gt;
      &lt;td&gt;U+0500&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI DE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԃ&lt;/td&gt;
      &lt;td&gt;U+0502&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI DJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԅ&lt;/td&gt;
      &lt;td&gt;U+0504&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI ZJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԇ&lt;/td&gt;
      &lt;td&gt;U+0506&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI DZJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԉ&lt;/td&gt;
      &lt;td&gt;U+0508&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI LJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԋ&lt;/td&gt;
      &lt;td&gt;U+050A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI NJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԍ&lt;/td&gt;
      &lt;td&gt;U+050C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI SJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԏ&lt;/td&gt;
      &lt;td&gt;U+050E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER KOMI TJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԑ&lt;/td&gt;
      &lt;td&gt;U+0510&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER REVERSED ZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԓ&lt;/td&gt;
      &lt;td&gt;U+0512&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EL WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԕ&lt;/td&gt;
      &lt;td&gt;U+0514&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER LHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԗ&lt;/td&gt;
      &lt;td&gt;U+0516&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER RHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԙ&lt;/td&gt;
      &lt;td&gt;U+0518&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YAE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԛ&lt;/td&gt;
      &lt;td&gt;U+051A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER QA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԝ&lt;/td&gt;
      &lt;td&gt;U+051C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER WE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԟ&lt;/td&gt;
      &lt;td&gt;U+051E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ALEUT KA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԡ&lt;/td&gt;
      &lt;td&gt;U+0520&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԣ&lt;/td&gt;
      &lt;td&gt;U+0522&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԥ&lt;/td&gt;
      &lt;td&gt;U+0524&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER PE WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԧ&lt;/td&gt;
      &lt;td&gt;U+0526&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԩ&lt;/td&gt;
      &lt;td&gt;U+0528&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԫ&lt;/td&gt;
      &lt;td&gt;U+052A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԭ&lt;/td&gt;
      &lt;td&gt;U+052C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DCHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ԯ&lt;/td&gt;
      &lt;td&gt;U+052E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER EL WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ա&lt;/td&gt;
      &lt;td&gt;U+0531&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER AYB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Բ&lt;/td&gt;
      &lt;td&gt;U+0532&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER BEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Գ&lt;/td&gt;
      &lt;td&gt;U+0533&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER GIM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Դ&lt;/td&gt;
      &lt;td&gt;U+0534&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER DA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ե&lt;/td&gt;
      &lt;td&gt;U+0535&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER ECH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Զ&lt;/td&gt;
      &lt;td&gt;U+0536&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER ZA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Է&lt;/td&gt;
      &lt;td&gt;U+0537&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER EH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ը&lt;/td&gt;
      &lt;td&gt;U+0538&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER ET&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Թ&lt;/td&gt;
      &lt;td&gt;U+0539&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER TO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ժ&lt;/td&gt;
      &lt;td&gt;U+053A&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER ZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ի&lt;/td&gt;
      &lt;td&gt;U+053B&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER INI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Լ&lt;/td&gt;
      &lt;td&gt;U+053C&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER LIWN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Խ&lt;/td&gt;
      &lt;td&gt;U+053D&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER XEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ծ&lt;/td&gt;
      &lt;td&gt;U+053E&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER CA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Կ&lt;/td&gt;
      &lt;td&gt;U+053F&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER KEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Հ&lt;/td&gt;
      &lt;td&gt;U+0540&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER HO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ձ&lt;/td&gt;
      &lt;td&gt;U+0541&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER JA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ղ&lt;/td&gt;
      &lt;td&gt;U+0542&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER GHAD&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ճ&lt;/td&gt;
      &lt;td&gt;U+0543&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER CHEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Մ&lt;/td&gt;
      &lt;td&gt;U+0544&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER MEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Յ&lt;/td&gt;
      &lt;td&gt;U+0545&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER YI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ն&lt;/td&gt;
      &lt;td&gt;U+0546&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER NOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Շ&lt;/td&gt;
      &lt;td&gt;U+0547&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER SHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ո&lt;/td&gt;
      &lt;td&gt;U+0548&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER VO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Չ&lt;/td&gt;
      &lt;td&gt;U+0549&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER CHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Պ&lt;/td&gt;
      &lt;td&gt;U+054A&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER PEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ջ&lt;/td&gt;
      &lt;td&gt;U+054B&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER JHEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ռ&lt;/td&gt;
      &lt;td&gt;U+054C&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER RA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ս&lt;/td&gt;
      &lt;td&gt;U+054D&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER SEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Վ&lt;/td&gt;
      &lt;td&gt;U+054E&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER VEW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Տ&lt;/td&gt;
      &lt;td&gt;U+054F&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER TIWN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ր&lt;/td&gt;
      &lt;td&gt;U+0550&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER REH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ց&lt;/td&gt;
      &lt;td&gt;U+0551&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER CO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ւ&lt;/td&gt;
      &lt;td&gt;U+0552&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER YIWN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Փ&lt;/td&gt;
      &lt;td&gt;U+0553&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER PIWR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ք&lt;/td&gt;
      &lt;td&gt;U+0554&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER KEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Օ&lt;/td&gt;
      &lt;td&gt;U+0555&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER OH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ֆ&lt;/td&gt;
      &lt;td&gt;U+0556&lt;/td&gt;
      &lt;td&gt;ARMENIAN CAPITAL LETTER FEH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴀ&lt;/td&gt;
      &lt;td&gt;U+10A0&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER AN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴁ&lt;/td&gt;
      &lt;td&gt;U+10A1&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER BAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴂ&lt;/td&gt;
      &lt;td&gt;U+10A2&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER GAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴃ&lt;/td&gt;
      &lt;td&gt;U+10A3&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER DON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴄ&lt;/td&gt;
      &lt;td&gt;U+10A4&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER EN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴅ&lt;/td&gt;
      &lt;td&gt;U+10A5&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER VIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴆ&lt;/td&gt;
      &lt;td&gt;U+10A6&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER ZEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴇ&lt;/td&gt;
      &lt;td&gt;U+10A7&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER TAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴈ&lt;/td&gt;
      &lt;td&gt;U+10A8&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER IN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴉ&lt;/td&gt;
      &lt;td&gt;U+10A9&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER KAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴊ&lt;/td&gt;
      &lt;td&gt;U+10AA&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER LAS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴋ&lt;/td&gt;
      &lt;td&gt;U+10AB&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER MAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴌ&lt;/td&gt;
      &lt;td&gt;U+10AC&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER NAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴍ&lt;/td&gt;
      &lt;td&gt;U+10AD&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER ON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴎ&lt;/td&gt;
      &lt;td&gt;U+10AE&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER PAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴏ&lt;/td&gt;
      &lt;td&gt;U+10AF&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER ZHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴐ&lt;/td&gt;
      &lt;td&gt;U+10B0&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER RAE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴑ&lt;/td&gt;
      &lt;td&gt;U+10B1&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER SAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴒ&lt;/td&gt;
      &lt;td&gt;U+10B2&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER TAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴓ&lt;/td&gt;
      &lt;td&gt;U+10B3&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER UN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴔ&lt;/td&gt;
      &lt;td&gt;U+10B4&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER PHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴕ&lt;/td&gt;
      &lt;td&gt;U+10B5&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER KHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴖ&lt;/td&gt;
      &lt;td&gt;U+10B6&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER GHAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴗ&lt;/td&gt;
      &lt;td&gt;U+10B7&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER QAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴘ&lt;/td&gt;
      &lt;td&gt;U+10B8&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER SHIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴙ&lt;/td&gt;
      &lt;td&gt;U+10B9&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER CHIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴚ&lt;/td&gt;
      &lt;td&gt;U+10BA&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER CAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴛ&lt;/td&gt;
      &lt;td&gt;U+10BB&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER JIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴜ&lt;/td&gt;
      &lt;td&gt;U+10BC&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER CIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴝ&lt;/td&gt;
      &lt;td&gt;U+10BD&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER CHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴞ&lt;/td&gt;
      &lt;td&gt;U+10BE&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER XAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴟ&lt;/td&gt;
      &lt;td&gt;U+10BF&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER JHAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴠ&lt;/td&gt;
      &lt;td&gt;U+10C0&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER HAE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴡ&lt;/td&gt;
      &lt;td&gt;U+10C1&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER HE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴢ&lt;/td&gt;
      &lt;td&gt;U+10C2&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER HIE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴣ&lt;/td&gt;
      &lt;td&gt;U+10C3&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER WE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴤ&lt;/td&gt;
      &lt;td&gt;U+10C4&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER HAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴥ&lt;/td&gt;
      &lt;td&gt;U+10C5&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER HOE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴧ&lt;/td&gt;
      &lt;td&gt;U+10C7&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER YN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⴭ&lt;/td&gt;
      &lt;td&gt;U+10CD&lt;/td&gt;
      &lt;td&gt;GEORGIAN CAPITAL LETTER AEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭰ&lt;/td&gt;
      &lt;td&gt;U+13A0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭱ&lt;/td&gt;
      &lt;td&gt;U+13A1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭲ&lt;/td&gt;
      &lt;td&gt;U+13A2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭳ&lt;/td&gt;
      &lt;td&gt;U+13A3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭴ&lt;/td&gt;
      &lt;td&gt;U+13A4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭵ&lt;/td&gt;
      &lt;td&gt;U+13A5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭶ&lt;/td&gt;
      &lt;td&gt;U+13A6&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭷ&lt;/td&gt;
      &lt;td&gt;U+13A7&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER KA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭸ&lt;/td&gt;
      &lt;td&gt;U+13A8&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭹ&lt;/td&gt;
      &lt;td&gt;U+13A9&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭺ&lt;/td&gt;
      &lt;td&gt;U+13AA&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭻ&lt;/td&gt;
      &lt;td&gt;U+13AB&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭼ&lt;/td&gt;
      &lt;td&gt;U+13AC&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER GV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭽ&lt;/td&gt;
      &lt;td&gt;U+13AD&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭾ&lt;/td&gt;
      &lt;td&gt;U+13AE&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭿ&lt;/td&gt;
      &lt;td&gt;U+13AF&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮀ&lt;/td&gt;
      &lt;td&gt;U+13B0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮁ&lt;/td&gt;
      &lt;td&gt;U+13B1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮂ&lt;/td&gt;
      &lt;td&gt;U+13B2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮃ&lt;/td&gt;
      &lt;td&gt;U+13B3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮄ&lt;/td&gt;
      &lt;td&gt;U+13B4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮅ&lt;/td&gt;
      &lt;td&gt;U+13B5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮆ&lt;/td&gt;
      &lt;td&gt;U+13B6&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮇ&lt;/td&gt;
      &lt;td&gt;U+13B7&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮈ&lt;/td&gt;
      &lt;td&gt;U+13B8&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER LV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮉ&lt;/td&gt;
      &lt;td&gt;U+13B9&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER MA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮊ&lt;/td&gt;
      &lt;td&gt;U+13BA&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER ME&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮋ&lt;/td&gt;
      &lt;td&gt;U+13BB&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER MI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮌ&lt;/td&gt;
      &lt;td&gt;U+13BC&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER MO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮍ&lt;/td&gt;
      &lt;td&gt;U+13BD&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮎ&lt;/td&gt;
      &lt;td&gt;U+13BE&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮏ&lt;/td&gt;
      &lt;td&gt;U+13BF&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER HNA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮐ&lt;/td&gt;
      &lt;td&gt;U+13C0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NAH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮑ&lt;/td&gt;
      &lt;td&gt;U+13C1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮒ&lt;/td&gt;
      &lt;td&gt;U+13C2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮓ&lt;/td&gt;
      &lt;td&gt;U+13C3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮔ&lt;/td&gt;
      &lt;td&gt;U+13C4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮕ&lt;/td&gt;
      &lt;td&gt;U+13C5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER NV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮖ&lt;/td&gt;
      &lt;td&gt;U+13C6&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮗ&lt;/td&gt;
      &lt;td&gt;U+13C7&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮘ&lt;/td&gt;
      &lt;td&gt;U+13C8&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮙ&lt;/td&gt;
      &lt;td&gt;U+13C9&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮚ&lt;/td&gt;
      &lt;td&gt;U+13CA&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮛ&lt;/td&gt;
      &lt;td&gt;U+13CB&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER QUV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮜ&lt;/td&gt;
      &lt;td&gt;U+13CC&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮝ&lt;/td&gt;
      &lt;td&gt;U+13CD&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮞ&lt;/td&gt;
      &lt;td&gt;U+13CE&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮟ&lt;/td&gt;
      &lt;td&gt;U+13CF&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮠ&lt;/td&gt;
      &lt;td&gt;U+13D0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮡ&lt;/td&gt;
      &lt;td&gt;U+13D1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮢ&lt;/td&gt;
      &lt;td&gt;U+13D2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER SV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮣ&lt;/td&gt;
      &lt;td&gt;U+13D3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮤ&lt;/td&gt;
      &lt;td&gt;U+13D4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮥ&lt;/td&gt;
      &lt;td&gt;U+13D5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮦ&lt;/td&gt;
      &lt;td&gt;U+13D6&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮧ&lt;/td&gt;
      &lt;td&gt;U+13D7&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮨ&lt;/td&gt;
      &lt;td&gt;U+13D8&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮩ&lt;/td&gt;
      &lt;td&gt;U+13D9&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮪ&lt;/td&gt;
      &lt;td&gt;U+13DA&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮫ&lt;/td&gt;
      &lt;td&gt;U+13DB&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮬ&lt;/td&gt;
      &lt;td&gt;U+13DC&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER DLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮭ&lt;/td&gt;
      &lt;td&gt;U+13DD&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮮ&lt;/td&gt;
      &lt;td&gt;U+13DE&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮯ&lt;/td&gt;
      &lt;td&gt;U+13DF&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮰ&lt;/td&gt;
      &lt;td&gt;U+13E0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮱ&lt;/td&gt;
      &lt;td&gt;U+13E1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮲ&lt;/td&gt;
      &lt;td&gt;U+13E2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TLV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮳ&lt;/td&gt;
      &lt;td&gt;U+13E3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮴ&lt;/td&gt;
      &lt;td&gt;U+13E4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮵ&lt;/td&gt;
      &lt;td&gt;U+13E5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮶ&lt;/td&gt;
      &lt;td&gt;U+13E6&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮷ&lt;/td&gt;
      &lt;td&gt;U+13E7&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮸ&lt;/td&gt;
      &lt;td&gt;U+13E8&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER TSV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮹ&lt;/td&gt;
      &lt;td&gt;U+13E9&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮺ&lt;/td&gt;
      &lt;td&gt;U+13EA&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮻ&lt;/td&gt;
      &lt;td&gt;U+13EB&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮼ&lt;/td&gt;
      &lt;td&gt;U+13EC&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮽ&lt;/td&gt;
      &lt;td&gt;U+13ED&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮾ&lt;/td&gt;
      &lt;td&gt;U+13EE&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER WV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꮿ&lt;/td&gt;
      &lt;td&gt;U+13EF&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏸ&lt;/td&gt;
      &lt;td&gt;U+13F0&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏹ&lt;/td&gt;
      &lt;td&gt;U+13F1&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏺ&lt;/td&gt;
      &lt;td&gt;U+13F2&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏻ&lt;/td&gt;
      &lt;td&gt;U+13F3&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏼ&lt;/td&gt;
      &lt;td&gt;U+13F4&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER YV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᏽ&lt;/td&gt;
      &lt;td&gt;U+13F5&lt;/td&gt;
      &lt;td&gt;CHEROKEE LETTER MV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ა&lt;/td&gt;
      &lt;td&gt;U+1C90&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER AN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ბ&lt;/td&gt;
      &lt;td&gt;U+1C91&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER BAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Გ&lt;/td&gt;
      &lt;td&gt;U+1C92&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER GAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Დ&lt;/td&gt;
      &lt;td&gt;U+1C93&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER DON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ე&lt;/td&gt;
      &lt;td&gt;U+1C94&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER EN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ვ&lt;/td&gt;
      &lt;td&gt;U+1C95&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER VIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ზ&lt;/td&gt;
      &lt;td&gt;U+1C96&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER ZEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Თ&lt;/td&gt;
      &lt;td&gt;U+1C97&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER TAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ი&lt;/td&gt;
      &lt;td&gt;U+1C98&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER IN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Კ&lt;/td&gt;
      &lt;td&gt;U+1C99&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER KAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ლ&lt;/td&gt;
      &lt;td&gt;U+1C9A&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER LAS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Მ&lt;/td&gt;
      &lt;td&gt;U+1C9B&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER MAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ნ&lt;/td&gt;
      &lt;td&gt;U+1C9C&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER NAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ო&lt;/td&gt;
      &lt;td&gt;U+1C9D&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER ON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Პ&lt;/td&gt;
      &lt;td&gt;U+1C9E&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER PAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჟ&lt;/td&gt;
      &lt;td&gt;U+1C9F&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Რ&lt;/td&gt;
      &lt;td&gt;U+1CA0&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER RAE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ს&lt;/td&gt;
      &lt;td&gt;U+1CA1&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER SAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ტ&lt;/td&gt;
      &lt;td&gt;U+1CA2&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER TAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Უ&lt;/td&gt;
      &lt;td&gt;U+1CA3&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER UN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ფ&lt;/td&gt;
      &lt;td&gt;U+1CA4&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER PHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ქ&lt;/td&gt;
      &lt;td&gt;U+1CA5&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER KHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ღ&lt;/td&gt;
      &lt;td&gt;U+1CA6&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER GHAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ყ&lt;/td&gt;
      &lt;td&gt;U+1CA7&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER QAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Შ&lt;/td&gt;
      &lt;td&gt;U+1CA8&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER SHIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჩ&lt;/td&gt;
      &lt;td&gt;U+1CA9&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER CHIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ც&lt;/td&gt;
      &lt;td&gt;U+1CAA&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER CAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ძ&lt;/td&gt;
      &lt;td&gt;U+1CAB&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER JIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Წ&lt;/td&gt;
      &lt;td&gt;U+1CAC&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER CIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჭ&lt;/td&gt;
      &lt;td&gt;U+1CAD&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER CHAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ხ&lt;/td&gt;
      &lt;td&gt;U+1CAE&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER XAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჯ&lt;/td&gt;
      &lt;td&gt;U+1CAF&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER JHAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჰ&lt;/td&gt;
      &lt;td&gt;U+1CB0&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HAE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჱ&lt;/td&gt;
      &lt;td&gt;U+1CB1&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჲ&lt;/td&gt;
      &lt;td&gt;U+1CB2&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HIE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჳ&lt;/td&gt;
      &lt;td&gt;U+1CB3&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER WE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჴ&lt;/td&gt;
      &lt;td&gt;U+1CB4&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჵ&lt;/td&gt;
      &lt;td&gt;U+1CB5&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HOE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჶ&lt;/td&gt;
      &lt;td&gt;U+1CB6&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER FI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჷ&lt;/td&gt;
      &lt;td&gt;U+1CB7&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER YN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჸ&lt;/td&gt;
      &lt;td&gt;U+1CB8&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჹ&lt;/td&gt;
      &lt;td&gt;U+1CB9&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჺ&lt;/td&gt;
      &lt;td&gt;U+1CBA&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER AIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჽ&lt;/td&gt;
      &lt;td&gt;U+1CBD&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER AEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჾ&lt;/td&gt;
      &lt;td&gt;U+1CBE&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ჿ&lt;/td&gt;
      &lt;td&gt;U+1CBF&lt;/td&gt;
      &lt;td&gt;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḁ&lt;/td&gt;
      &lt;td&gt;U+1E00&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH RING BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḃ&lt;/td&gt;
      &lt;td&gt;U+1E02&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḅ&lt;/td&gt;
      &lt;td&gt;U+1E04&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḇ&lt;/td&gt;
      &lt;td&gt;U+1E06&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḉ&lt;/td&gt;
      &lt;td&gt;U+1E08&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḋ&lt;/td&gt;
      &lt;td&gt;U+1E0A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḍ&lt;/td&gt;
      &lt;td&gt;U+1E0C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḏ&lt;/td&gt;
      &lt;td&gt;U+1E0E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḑ&lt;/td&gt;
      &lt;td&gt;U+1E10&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḓ&lt;/td&gt;
      &lt;td&gt;U+1E12&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḕ&lt;/td&gt;
      &lt;td&gt;U+1E14&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḗ&lt;/td&gt;
      &lt;td&gt;U+1E16&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḙ&lt;/td&gt;
      &lt;td&gt;U+1E18&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḛ&lt;/td&gt;
      &lt;td&gt;U+1E1A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH TILDE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḝ&lt;/td&gt;
      &lt;td&gt;U+1E1C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḟ&lt;/td&gt;
      &lt;td&gt;U+1E1E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER F WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḡ&lt;/td&gt;
      &lt;td&gt;U+1E20&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḣ&lt;/td&gt;
      &lt;td&gt;U+1E22&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḥ&lt;/td&gt;
      &lt;td&gt;U+1E24&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḧ&lt;/td&gt;
      &lt;td&gt;U+1E26&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḩ&lt;/td&gt;
      &lt;td&gt;U+1E28&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH CEDILLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḫ&lt;/td&gt;
      &lt;td&gt;U+1E2A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH BREVE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḭ&lt;/td&gt;
      &lt;td&gt;U+1E2C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH TILDE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḯ&lt;/td&gt;
      &lt;td&gt;U+1E2E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḱ&lt;/td&gt;
      &lt;td&gt;U+1E30&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḳ&lt;/td&gt;
      &lt;td&gt;U+1E32&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḵ&lt;/td&gt;
      &lt;td&gt;U+1E34&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḷ&lt;/td&gt;
      &lt;td&gt;U+1E36&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḹ&lt;/td&gt;
      &lt;td&gt;U+1E38&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḻ&lt;/td&gt;
      &lt;td&gt;U+1E3A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḽ&lt;/td&gt;
      &lt;td&gt;U+1E3C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ḿ&lt;/td&gt;
      &lt;td&gt;U+1E3E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER M WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṁ&lt;/td&gt;
      &lt;td&gt;U+1E40&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER M WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṃ&lt;/td&gt;
      &lt;td&gt;U+1E42&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER M WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṅ&lt;/td&gt;
      &lt;td&gt;U+1E44&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṇ&lt;/td&gt;
      &lt;td&gt;U+1E46&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṉ&lt;/td&gt;
      &lt;td&gt;U+1E48&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṋ&lt;/td&gt;
      &lt;td&gt;U+1E4A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṍ&lt;/td&gt;
      &lt;td&gt;U+1E4C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṏ&lt;/td&gt;
      &lt;td&gt;U+1E4E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṑ&lt;/td&gt;
      &lt;td&gt;U+1E50&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṓ&lt;/td&gt;
      &lt;td&gt;U+1E52&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṕ&lt;/td&gt;
      &lt;td&gt;U+1E54&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṗ&lt;/td&gt;
      &lt;td&gt;U+1E56&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṙ&lt;/td&gt;
      &lt;td&gt;U+1E58&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṛ&lt;/td&gt;
      &lt;td&gt;U+1E5A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṝ&lt;/td&gt;
      &lt;td&gt;U+1E5C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṟ&lt;/td&gt;
      &lt;td&gt;U+1E5E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṡ&lt;/td&gt;
      &lt;td&gt;U+1E60&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṣ&lt;/td&gt;
      &lt;td&gt;U+1E62&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṥ&lt;/td&gt;
      &lt;td&gt;U+1E64&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṧ&lt;/td&gt;
      &lt;td&gt;U+1E66&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṩ&lt;/td&gt;
      &lt;td&gt;U+1E68&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṫ&lt;/td&gt;
      &lt;td&gt;U+1E6A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṭ&lt;/td&gt;
      &lt;td&gt;U+1E6C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṯ&lt;/td&gt;
      &lt;td&gt;U+1E6E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṱ&lt;/td&gt;
      &lt;td&gt;U+1E70&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṳ&lt;/td&gt;
      &lt;td&gt;U+1E72&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṵ&lt;/td&gt;
      &lt;td&gt;U+1E74&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH TILDE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṷ&lt;/td&gt;
      &lt;td&gt;U+1E76&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṹ&lt;/td&gt;
      &lt;td&gt;U+1E78&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṻ&lt;/td&gt;
      &lt;td&gt;U+1E7A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṽ&lt;/td&gt;
      &lt;td&gt;U+1E7C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER V WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ṿ&lt;/td&gt;
      &lt;td&gt;U+1E7E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER V WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẁ&lt;/td&gt;
      &lt;td&gt;U+1E80&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẃ&lt;/td&gt;
      &lt;td&gt;U+1E82&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẅ&lt;/td&gt;
      &lt;td&gt;U+1E84&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẇ&lt;/td&gt;
      &lt;td&gt;U+1E86&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẉ&lt;/td&gt;
      &lt;td&gt;U+1E88&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẋ&lt;/td&gt;
      &lt;td&gt;U+1E8A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER X WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẍ&lt;/td&gt;
      &lt;td&gt;U+1E8C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER X WITH DIAERESIS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẏ&lt;/td&gt;
      &lt;td&gt;U+1E8E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH DOT ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẑ&lt;/td&gt;
      &lt;td&gt;U+1E90&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẓ&lt;/td&gt;
      &lt;td&gt;U+1E92&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẕ&lt;/td&gt;
      &lt;td&gt;U+1E94&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH LINE BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ẞ&lt;/td&gt;
      &lt;td&gt;U+1E9E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SHARP S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ạ&lt;/td&gt;
      &lt;td&gt;U+1EA0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ả&lt;/td&gt;
      &lt;td&gt;U+1EA2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ấ&lt;/td&gt;
      &lt;td&gt;U+1EA4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ầ&lt;/td&gt;
      &lt;td&gt;U+1EA6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẩ&lt;/td&gt;
      &lt;td&gt;U+1EA8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẫ&lt;/td&gt;
      &lt;td&gt;U+1EAA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ậ&lt;/td&gt;
      &lt;td&gt;U+1EAC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ắ&lt;/td&gt;
      &lt;td&gt;U+1EAE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ằ&lt;/td&gt;
      &lt;td&gt;U+1EB0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẳ&lt;/td&gt;
      &lt;td&gt;U+1EB2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẵ&lt;/td&gt;
      &lt;td&gt;U+1EB4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ặ&lt;/td&gt;
      &lt;td&gt;U+1EB6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẹ&lt;/td&gt;
      &lt;td&gt;U+1EB8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẻ&lt;/td&gt;
      &lt;td&gt;U+1EBA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ẽ&lt;/td&gt;
      &lt;td&gt;U+1EBC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ế&lt;/td&gt;
      &lt;td&gt;U+1EBE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ề&lt;/td&gt;
      &lt;td&gt;U+1EC0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ể&lt;/td&gt;
      &lt;td&gt;U+1EC2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ễ&lt;/td&gt;
      &lt;td&gt;U+1EC4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ệ&lt;/td&gt;
      &lt;td&gt;U+1EC6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỉ&lt;/td&gt;
      &lt;td&gt;U+1EC8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ị&lt;/td&gt;
      &lt;td&gt;U+1ECA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER I WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ọ&lt;/td&gt;
      &lt;td&gt;U+1ECC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỏ&lt;/td&gt;
      &lt;td&gt;U+1ECE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ố&lt;/td&gt;
      &lt;td&gt;U+1ED0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ồ&lt;/td&gt;
      &lt;td&gt;U+1ED2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ổ&lt;/td&gt;
      &lt;td&gt;U+1ED4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỗ&lt;/td&gt;
      &lt;td&gt;U+1ED6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ộ&lt;/td&gt;
      &lt;td&gt;U+1ED8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ớ&lt;/td&gt;
      &lt;td&gt;U+1EDA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ờ&lt;/td&gt;
      &lt;td&gt;U+1EDC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ở&lt;/td&gt;
      &lt;td&gt;U+1EDE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỡ&lt;/td&gt;
      &lt;td&gt;U+1EE0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ợ&lt;/td&gt;
      &lt;td&gt;U+1EE2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ụ&lt;/td&gt;
      &lt;td&gt;U+1EE4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ủ&lt;/td&gt;
      &lt;td&gt;U+1EE6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ứ&lt;/td&gt;
      &lt;td&gt;U+1EE8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN AND ACUTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ừ&lt;/td&gt;
      &lt;td&gt;U+1EEA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN AND GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ử&lt;/td&gt;
      &lt;td&gt;U+1EEC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ữ&lt;/td&gt;
      &lt;td&gt;U+1EEE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN AND TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ự&lt;/td&gt;
      &lt;td&gt;U+1EF0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỳ&lt;/td&gt;
      &lt;td&gt;U+1EF2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH GRAVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỵ&lt;/td&gt;
      &lt;td&gt;U+1EF4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH DOT BELOW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỷ&lt;/td&gt;
      &lt;td&gt;U+1EF6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH HOOK ABOVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỹ&lt;/td&gt;
      &lt;td&gt;U+1EF8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỻ&lt;/td&gt;
      &lt;td&gt;U+1EFA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER MIDDLE-WELSH LL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỽ&lt;/td&gt;
      &lt;td&gt;U+1EFC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER MIDDLE-WELSH V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ỿ&lt;/td&gt;
      &lt;td&gt;U+1EFE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Y WITH LOOP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἀ&lt;/td&gt;
      &lt;td&gt;U+1F08&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἁ&lt;/td&gt;
      &lt;td&gt;U+1F09&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἂ&lt;/td&gt;
      &lt;td&gt;U+1F0A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἃ&lt;/td&gt;
      &lt;td&gt;U+1F0B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἄ&lt;/td&gt;
      &lt;td&gt;U+1F0C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἅ&lt;/td&gt;
      &lt;td&gt;U+1F0D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἆ&lt;/td&gt;
      &lt;td&gt;U+1F0E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἇ&lt;/td&gt;
      &lt;td&gt;U+1F0F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἐ&lt;/td&gt;
      &lt;td&gt;U+1F18&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἑ&lt;/td&gt;
      &lt;td&gt;U+1F19&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἒ&lt;/td&gt;
      &lt;td&gt;U+1F1A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἓ&lt;/td&gt;
      &lt;td&gt;U+1F1B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἔ&lt;/td&gt;
      &lt;td&gt;U+1F1C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἕ&lt;/td&gt;
      &lt;td&gt;U+1F1D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἠ&lt;/td&gt;
      &lt;td&gt;U+1F28&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἡ&lt;/td&gt;
      &lt;td&gt;U+1F29&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἢ&lt;/td&gt;
      &lt;td&gt;U+1F2A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἣ&lt;/td&gt;
      &lt;td&gt;U+1F2B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἤ&lt;/td&gt;
      &lt;td&gt;U+1F2C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἥ&lt;/td&gt;
      &lt;td&gt;U+1F2D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἦ&lt;/td&gt;
      &lt;td&gt;U+1F2E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἧ&lt;/td&gt;
      &lt;td&gt;U+1F2F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἰ&lt;/td&gt;
      &lt;td&gt;U+1F38&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἱ&lt;/td&gt;
      &lt;td&gt;U+1F39&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἲ&lt;/td&gt;
      &lt;td&gt;U+1F3A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἳ&lt;/td&gt;
      &lt;td&gt;U+1F3B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἴ&lt;/td&gt;
      &lt;td&gt;U+1F3C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἵ&lt;/td&gt;
      &lt;td&gt;U+1F3D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἶ&lt;/td&gt;
      &lt;td&gt;U+1F3E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ἷ&lt;/td&gt;
      &lt;td&gt;U+1F3F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὀ&lt;/td&gt;
      &lt;td&gt;U+1F48&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὁ&lt;/td&gt;
      &lt;td&gt;U+1F49&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὂ&lt;/td&gt;
      &lt;td&gt;U+1F4A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὃ&lt;/td&gt;
      &lt;td&gt;U+1F4B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὄ&lt;/td&gt;
      &lt;td&gt;U+1F4C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὅ&lt;/td&gt;
      &lt;td&gt;U+1F4D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὑ&lt;/td&gt;
      &lt;td&gt;U+1F59&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὓ&lt;/td&gt;
      &lt;td&gt;U+1F5B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὕ&lt;/td&gt;
      &lt;td&gt;U+1F5D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὗ&lt;/td&gt;
      &lt;td&gt;U+1F5F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὠ&lt;/td&gt;
      &lt;td&gt;U+1F68&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὡ&lt;/td&gt;
      &lt;td&gt;U+1F69&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὢ&lt;/td&gt;
      &lt;td&gt;U+1F6A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὣ&lt;/td&gt;
      &lt;td&gt;U+1F6B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὤ&lt;/td&gt;
      &lt;td&gt;U+1F6C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὥ&lt;/td&gt;
      &lt;td&gt;U+1F6D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὦ&lt;/td&gt;
      &lt;td&gt;U+1F6E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὧ&lt;/td&gt;
      &lt;td&gt;U+1F6F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾈ&lt;/td&gt;
      &lt;td&gt;U+1F88&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾉ&lt;/td&gt;
      &lt;td&gt;U+1F89&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾊ&lt;/td&gt;
      &lt;td&gt;U+1F8A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾋ&lt;/td&gt;
      &lt;td&gt;U+1F8B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾌ&lt;/td&gt;
      &lt;td&gt;U+1F8C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾍ&lt;/td&gt;
      &lt;td&gt;U+1F8D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾎ&lt;/td&gt;
      &lt;td&gt;U+1F8E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾏ&lt;/td&gt;
      &lt;td&gt;U+1F8F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾘ&lt;/td&gt;
      &lt;td&gt;U+1F98&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾙ&lt;/td&gt;
      &lt;td&gt;U+1F99&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾚ&lt;/td&gt;
      &lt;td&gt;U+1F9A&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾛ&lt;/td&gt;
      &lt;td&gt;U+1F9B&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾜ&lt;/td&gt;
      &lt;td&gt;U+1F9C&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾝ&lt;/td&gt;
      &lt;td&gt;U+1F9D&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾞ&lt;/td&gt;
      &lt;td&gt;U+1F9E&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾟ&lt;/td&gt;
      &lt;td&gt;U+1F9F&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾨ&lt;/td&gt;
      &lt;td&gt;U+1FA8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾩ&lt;/td&gt;
      &lt;td&gt;U+1FA9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾪ&lt;/td&gt;
      &lt;td&gt;U+1FAA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾫ&lt;/td&gt;
      &lt;td&gt;U+1FAB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾬ&lt;/td&gt;
      &lt;td&gt;U+1FAC&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾭ&lt;/td&gt;
      &lt;td&gt;U+1FAD&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾮ&lt;/td&gt;
      &lt;td&gt;U+1FAE&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾯ&lt;/td&gt;
      &lt;td&gt;U+1FAF&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᾰ&lt;/td&gt;
      &lt;td&gt;U+1FB8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH VRACHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᾱ&lt;/td&gt;
      &lt;td&gt;U+1FB9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὰ&lt;/td&gt;
      &lt;td&gt;U+1FBA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ά&lt;/td&gt;
      &lt;td&gt;U+1FBB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ᾼ&lt;/td&gt;
      &lt;td&gt;U+1FBC&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὲ&lt;/td&gt;
      &lt;td&gt;U+1FC8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Έ&lt;/td&gt;
      &lt;td&gt;U+1FC9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER EPSILON WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὴ&lt;/td&gt;
      &lt;td&gt;U+1FCA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ή&lt;/td&gt;
      &lt;td&gt;U+1FCB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ῌ&lt;/td&gt;
      &lt;td&gt;U+1FCC&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ῐ&lt;/td&gt;
      &lt;td&gt;U+1FD8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH VRACHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ῑ&lt;/td&gt;
      &lt;td&gt;U+1FD9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὶ&lt;/td&gt;
      &lt;td&gt;U+1FDA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ί&lt;/td&gt;
      &lt;td&gt;U+1FDB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER IOTA WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ῠ&lt;/td&gt;
      &lt;td&gt;U+1FE8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH VRACHY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ῡ&lt;/td&gt;
      &lt;td&gt;U+1FE9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH MACRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὺ&lt;/td&gt;
      &lt;td&gt;U+1FEA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ύ&lt;/td&gt;
      &lt;td&gt;U+1FEB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER UPSILON WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ῥ&lt;/td&gt;
      &lt;td&gt;U+1FEC&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER RHO WITH DASIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὸ&lt;/td&gt;
      &lt;td&gt;U+1FF8&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ό&lt;/td&gt;
      &lt;td&gt;U+1FF9&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMICRON WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ὼ&lt;/td&gt;
      &lt;td&gt;U+1FFA&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH VARIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ώ&lt;/td&gt;
      &lt;td&gt;U+1FFB&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH OXIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ῼ&lt;/td&gt;
      &lt;td&gt;U+1FFC&lt;/td&gt;
      &lt;td&gt;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℂ&lt;/td&gt;
      &lt;td&gt;U+2102&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℇ&lt;/td&gt;
      &lt;td&gt;U+2107&lt;/td&gt;
      &lt;td&gt;EULER CONSTANT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℋ&lt;/td&gt;
      &lt;td&gt;U+210B&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℌ&lt;/td&gt;
      &lt;td&gt;U+210C&lt;/td&gt;
      &lt;td&gt;BLACK-LETTER CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℍ&lt;/td&gt;
      &lt;td&gt;U+210D&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℐ&lt;/td&gt;
      &lt;td&gt;U+2110&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℑ&lt;/td&gt;
      &lt;td&gt;U+2111&lt;/td&gt;
      &lt;td&gt;BLACK-LETTER CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℒ&lt;/td&gt;
      &lt;td&gt;U+2112&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℕ&lt;/td&gt;
      &lt;td&gt;U+2115&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℙ&lt;/td&gt;
      &lt;td&gt;U+2119&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℚ&lt;/td&gt;
      &lt;td&gt;U+211A&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℛ&lt;/td&gt;
      &lt;td&gt;U+211B&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℜ&lt;/td&gt;
      &lt;td&gt;U+211C&lt;/td&gt;
      &lt;td&gt;BLACK-LETTER CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℝ&lt;/td&gt;
      &lt;td&gt;U+211D&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℤ&lt;/td&gt;
      &lt;td&gt;U+2124&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ω&lt;/td&gt;
      &lt;td&gt;U+2126&lt;/td&gt;
      &lt;td&gt;OHM SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℨ&lt;/td&gt;
      &lt;td&gt;U+2128&lt;/td&gt;
      &lt;td&gt;BLACK-LETTER CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;K&lt;/td&gt;
      &lt;td&gt;U+212A&lt;/td&gt;
      &lt;td&gt;KELVIN SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Å&lt;/td&gt;
      &lt;td&gt;U+212B&lt;/td&gt;
      &lt;td&gt;ANGSTROM SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℬ&lt;/td&gt;
      &lt;td&gt;U+212C&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℭ&lt;/td&gt;
      &lt;td&gt;U+212D&lt;/td&gt;
      &lt;td&gt;BLACK-LETTER CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℰ&lt;/td&gt;
      &lt;td&gt;U+2130&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℱ&lt;/td&gt;
      &lt;td&gt;U+2131&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅎ&lt;/td&gt;
      &lt;td&gt;U+2132&lt;/td&gt;
      &lt;td&gt;TURNED CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℳ&lt;/td&gt;
      &lt;td&gt;U+2133&lt;/td&gt;
      &lt;td&gt;SCRIPT CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℾ&lt;/td&gt;
      &lt;td&gt;U+213E&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ℿ&lt;/td&gt;
      &lt;td&gt;U+213F&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ⅅ&lt;/td&gt;
      &lt;td&gt;U+2145&lt;/td&gt;
      &lt;td&gt;DOUBLE-STRUCK ITALIC CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅰ&lt;/td&gt;
      &lt;td&gt;U+2160&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL ONE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅱ&lt;/td&gt;
      &lt;td&gt;U+2161&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL TWO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅲ&lt;/td&gt;
      &lt;td&gt;U+2162&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL THREE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅳ&lt;/td&gt;
      &lt;td&gt;U+2163&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL FOUR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅴ&lt;/td&gt;
      &lt;td&gt;U+2164&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL FIVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅵ&lt;/td&gt;
      &lt;td&gt;U+2165&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL SIX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅶ&lt;/td&gt;
      &lt;td&gt;U+2166&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL SEVEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅷ&lt;/td&gt;
      &lt;td&gt;U+2167&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL EIGHT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅸ&lt;/td&gt;
      &lt;td&gt;U+2168&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL NINE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅹ&lt;/td&gt;
      &lt;td&gt;U+2169&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL TEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅺ&lt;/td&gt;
      &lt;td&gt;U+216A&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL ELEVEN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅻ&lt;/td&gt;
      &lt;td&gt;U+216B&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL TWELVE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅼ&lt;/td&gt;
      &lt;td&gt;U+216C&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL FIFTY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅽ&lt;/td&gt;
      &lt;td&gt;U+216D&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL ONE HUNDRED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅾ&lt;/td&gt;
      &lt;td&gt;U+216E&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL FIVE HUNDRED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⅿ&lt;/td&gt;
      &lt;td&gt;U+216F&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL ONE THOUSAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ↄ&lt;/td&gt;
      &lt;td&gt;U+2183&lt;/td&gt;
      &lt;td&gt;ROMAN NUMERAL REVERSED ONE HUNDRED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓐ&lt;/td&gt;
      &lt;td&gt;U+24B6&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓑ&lt;/td&gt;
      &lt;td&gt;U+24B7&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓒ&lt;/td&gt;
      &lt;td&gt;U+24B8&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓓ&lt;/td&gt;
      &lt;td&gt;U+24B9&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓔ&lt;/td&gt;
      &lt;td&gt;U+24BA&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓕ&lt;/td&gt;
      &lt;td&gt;U+24BB&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓖ&lt;/td&gt;
      &lt;td&gt;U+24BC&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓗ&lt;/td&gt;
      &lt;td&gt;U+24BD&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓘ&lt;/td&gt;
      &lt;td&gt;U+24BE&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓙ&lt;/td&gt;
      &lt;td&gt;U+24BF&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓚ&lt;/td&gt;
      &lt;td&gt;U+24C0&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓛ&lt;/td&gt;
      &lt;td&gt;U+24C1&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓜ&lt;/td&gt;
      &lt;td&gt;U+24C2&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓝ&lt;/td&gt;
      &lt;td&gt;U+24C3&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓞ&lt;/td&gt;
      &lt;td&gt;U+24C4&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓟ&lt;/td&gt;
      &lt;td&gt;U+24C5&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓠ&lt;/td&gt;
      &lt;td&gt;U+24C6&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓡ&lt;/td&gt;
      &lt;td&gt;U+24C7&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓢ&lt;/td&gt;
      &lt;td&gt;U+24C8&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓣ&lt;/td&gt;
      &lt;td&gt;U+24C9&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓤ&lt;/td&gt;
      &lt;td&gt;U+24CA&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓥ&lt;/td&gt;
      &lt;td&gt;U+24CB&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓦ&lt;/td&gt;
      &lt;td&gt;U+24CC&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓧ&lt;/td&gt;
      &lt;td&gt;U+24CD&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓨ&lt;/td&gt;
      &lt;td&gt;U+24CE&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⓩ&lt;/td&gt;
      &lt;td&gt;U+24CF&lt;/td&gt;
      &lt;td&gt;CIRCLED LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰰ&lt;/td&gt;
      &lt;td&gt;U+2C00&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER AZU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰱ&lt;/td&gt;
      &lt;td&gt;U+2C01&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER BUKY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰲ&lt;/td&gt;
      &lt;td&gt;U+2C02&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER VEDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰳ&lt;/td&gt;
      &lt;td&gt;U+2C03&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER GLAGOLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰴ&lt;/td&gt;
      &lt;td&gt;U+2C04&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER DOBRO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰵ&lt;/td&gt;
      &lt;td&gt;U+2C05&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YESTU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰶ&lt;/td&gt;
      &lt;td&gt;U+2C06&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER ZHIVETE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰷ&lt;/td&gt;
      &lt;td&gt;U+2C07&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER DZELO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰸ&lt;/td&gt;
      &lt;td&gt;U+2C08&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER ZEMLJA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰹ&lt;/td&gt;
      &lt;td&gt;U+2C09&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER IZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰺ&lt;/td&gt;
      &lt;td&gt;U+2C0A&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER INITIAL IZHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰻ&lt;/td&gt;
      &lt;td&gt;U+2C0B&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰼ&lt;/td&gt;
      &lt;td&gt;U+2C0C&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER DJERVI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰽ&lt;/td&gt;
      &lt;td&gt;U+2C0D&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER KAKO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰾ&lt;/td&gt;
      &lt;td&gt;U+2C0E&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER LJUDIJE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⰿ&lt;/td&gt;
      &lt;td&gt;U+2C0F&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER MYSLITE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱀ&lt;/td&gt;
      &lt;td&gt;U+2C10&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER NASHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱁ&lt;/td&gt;
      &lt;td&gt;U+2C11&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER ONU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱂ&lt;/td&gt;
      &lt;td&gt;U+2C12&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER POKOJI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱃ&lt;/td&gt;
      &lt;td&gt;U+2C13&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER RITSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱄ&lt;/td&gt;
      &lt;td&gt;U+2C14&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SLOVO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱅ&lt;/td&gt;
      &lt;td&gt;U+2C15&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER TVRIDO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱆ&lt;/td&gt;
      &lt;td&gt;U+2C16&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER UKU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱇ&lt;/td&gt;
      &lt;td&gt;U+2C17&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER FRITU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱈ&lt;/td&gt;
      &lt;td&gt;U+2C18&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER HERU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱉ&lt;/td&gt;
      &lt;td&gt;U+2C19&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER OTU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱊ&lt;/td&gt;
      &lt;td&gt;U+2C1A&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER PE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱋ&lt;/td&gt;
      &lt;td&gt;U+2C1B&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SHTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱌ&lt;/td&gt;
      &lt;td&gt;U+2C1C&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER TSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱍ&lt;/td&gt;
      &lt;td&gt;U+2C1D&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER CHRIVI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱎ&lt;/td&gt;
      &lt;td&gt;U+2C1E&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱏ&lt;/td&gt;
      &lt;td&gt;U+2C1F&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YERU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱐ&lt;/td&gt;
      &lt;td&gt;U+2C20&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YERI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱑ&lt;/td&gt;
      &lt;td&gt;U+2C21&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YATI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱒ&lt;/td&gt;
      &lt;td&gt;U+2C22&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SPIDERY HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱓ&lt;/td&gt;
      &lt;td&gt;U+2C23&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱔ&lt;/td&gt;
      &lt;td&gt;U+2C24&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SMALL YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱕ&lt;/td&gt;
      &lt;td&gt;U+2C25&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱖ&lt;/td&gt;
      &lt;td&gt;U+2C26&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER YO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱗ&lt;/td&gt;
      &lt;td&gt;U+2C27&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱘ&lt;/td&gt;
      &lt;td&gt;U+2C28&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER BIG YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱙ&lt;/td&gt;
      &lt;td&gt;U+2C29&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱚ&lt;/td&gt;
      &lt;td&gt;U+2C2A&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER FITA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱛ&lt;/td&gt;
      &lt;td&gt;U+2C2B&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER IZHITSA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱜ&lt;/td&gt;
      &lt;td&gt;U+2C2C&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER SHTAPIC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱝ&lt;/td&gt;
      &lt;td&gt;U+2C2D&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER TROKUTASTI A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱞ&lt;/td&gt;
      &lt;td&gt;U+2C2E&lt;/td&gt;
      &lt;td&gt;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱡ&lt;/td&gt;
      &lt;td&gt;U+2C60&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH DOUBLE BAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɫ&lt;/td&gt;
      &lt;td&gt;U+2C62&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH MIDDLE TILDE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᵽ&lt;/td&gt;
      &lt;td&gt;U+2C63&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɽ&lt;/td&gt;
      &lt;td&gt;U+2C64&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱨ&lt;/td&gt;
      &lt;td&gt;U+2C67&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱪ&lt;/td&gt;
      &lt;td&gt;U+2C69&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱬ&lt;/td&gt;
      &lt;td&gt;U+2C6B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɑ&lt;/td&gt;
      &lt;td&gt;U+2C6D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɱ&lt;/td&gt;
      &lt;td&gt;U+2C6E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER M WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɐ&lt;/td&gt;
      &lt;td&gt;U+2C6F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɒ&lt;/td&gt;
      &lt;td&gt;U+2C70&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱳ&lt;/td&gt;
      &lt;td&gt;U+2C72&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER W WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⱶ&lt;/td&gt;
      &lt;td&gt;U+2C75&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER HALF H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ȿ&lt;/td&gt;
      &lt;td&gt;U+2C7E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH SWASH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɀ&lt;/td&gt;
      &lt;td&gt;U+2C7F&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH SWASH TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲁ&lt;/td&gt;
      &lt;td&gt;U+2C80&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER ALFA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲃ&lt;/td&gt;
      &lt;td&gt;U+2C82&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER VIDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲅ&lt;/td&gt;
      &lt;td&gt;U+2C84&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲇ&lt;/td&gt;
      &lt;td&gt;U+2C86&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DALDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲉ&lt;/td&gt;
      &lt;td&gt;U+2C88&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER EIE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲋ&lt;/td&gt;
      &lt;td&gt;U+2C8A&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER SOU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲍ&lt;/td&gt;
      &lt;td&gt;U+2C8C&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER ZATA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲏ&lt;/td&gt;
      &lt;td&gt;U+2C8E&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER HATE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲑ&lt;/td&gt;
      &lt;td&gt;U+2C90&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER THETHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲓ&lt;/td&gt;
      &lt;td&gt;U+2C92&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER IAUDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲕ&lt;/td&gt;
      &lt;td&gt;U+2C94&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER KAPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲗ&lt;/td&gt;
      &lt;td&gt;U+2C96&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER LAULA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲙ&lt;/td&gt;
      &lt;td&gt;U+2C98&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER MI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲛ&lt;/td&gt;
      &lt;td&gt;U+2C9A&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER NI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲝ&lt;/td&gt;
      &lt;td&gt;U+2C9C&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER KSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲟ&lt;/td&gt;
      &lt;td&gt;U+2C9E&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲡ&lt;/td&gt;
      &lt;td&gt;U+2CA0&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲣ&lt;/td&gt;
      &lt;td&gt;U+2CA2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER RO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲥ&lt;/td&gt;
      &lt;td&gt;U+2CA4&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER SIMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲧ&lt;/td&gt;
      &lt;td&gt;U+2CA6&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲩ&lt;/td&gt;
      &lt;td&gt;U+2CA8&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER UA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲫ&lt;/td&gt;
      &lt;td&gt;U+2CAA&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER FI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲭ&lt;/td&gt;
      &lt;td&gt;U+2CAC&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER KHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲯ&lt;/td&gt;
      &lt;td&gt;U+2CAE&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲱ&lt;/td&gt;
      &lt;td&gt;U+2CB0&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OOU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲳ&lt;/td&gt;
      &lt;td&gt;U+2CB2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DIALECT-P ALEF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲵ&lt;/td&gt;
      &lt;td&gt;U+2CB4&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC AIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲷ&lt;/td&gt;
      &lt;td&gt;U+2CB6&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲹ&lt;/td&gt;
      &lt;td&gt;U+2CB8&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DIALECT-P KAPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲻ&lt;/td&gt;
      &lt;td&gt;U+2CBA&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DIALECT-P NI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲽ&lt;/td&gt;
      &lt;td&gt;U+2CBC&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⲿ&lt;/td&gt;
      &lt;td&gt;U+2CBE&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC OOU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳁ&lt;/td&gt;
      &lt;td&gt;U+2CC0&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER SAMPI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳃ&lt;/td&gt;
      &lt;td&gt;U+2CC2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER CROSSED SHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳅ&lt;/td&gt;
      &lt;td&gt;U+2CC4&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC SHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳇ&lt;/td&gt;
      &lt;td&gt;U+2CC6&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC ESH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳉ&lt;/td&gt;
      &lt;td&gt;U+2CC8&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER AKHMIMIC KHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳋ&lt;/td&gt;
      &lt;td&gt;U+2CCA&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER DIALECT-P HORI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳍ&lt;/td&gt;
      &lt;td&gt;U+2CCC&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC HORI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳏ&lt;/td&gt;
      &lt;td&gt;U+2CCE&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳑ&lt;/td&gt;
      &lt;td&gt;U+2CD0&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER L-SHAPED HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳓ&lt;/td&gt;
      &lt;td&gt;U+2CD2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC HEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳕ&lt;/td&gt;
      &lt;td&gt;U+2CD4&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC HAT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳗ&lt;/td&gt;
      &lt;td&gt;U+2CD6&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC GANGIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳙ&lt;/td&gt;
      &lt;td&gt;U+2CD8&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC DJA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳛ&lt;/td&gt;
      &lt;td&gt;U+2CDA&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD COPTIC SHIMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳝ&lt;/td&gt;
      &lt;td&gt;U+2CDC&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳟ&lt;/td&gt;
      &lt;td&gt;U+2CDE&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD NUBIAN NGI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳡ&lt;/td&gt;
      &lt;td&gt;U+2CE0&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD NUBIAN NYI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳣ&lt;/td&gt;
      &lt;td&gt;U+2CE2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER OLD NUBIAN WAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳬ&lt;/td&gt;
      &lt;td&gt;U+2CEB&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳮ&lt;/td&gt;
      &lt;td&gt;U+2CED&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ⳳ&lt;/td&gt;
      &lt;td&gt;U+2CF2&lt;/td&gt;
      &lt;td&gt;COPTIC CAPITAL LETTER BOHAIRIC KHEI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙁ&lt;/td&gt;
      &lt;td&gt;U+A640&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZEMLYA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙃ&lt;/td&gt;
      &lt;td&gt;U+A642&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZELO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙅ&lt;/td&gt;
      &lt;td&gt;U+A644&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER REVERSED DZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙇ&lt;/td&gt;
      &lt;td&gt;U+A646&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙉ&lt;/td&gt;
      &lt;td&gt;U+A648&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DJERV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙋ&lt;/td&gt;
      &lt;td&gt;U+A64A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER MONOGRAPH UK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙍ&lt;/td&gt;
      &lt;td&gt;U+A64C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BROAD OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙏ&lt;/td&gt;
      &lt;td&gt;U+A64E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER NEUTRAL YER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙑ&lt;/td&gt;
      &lt;td&gt;U+A650&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YERU WITH BACK YER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙓ&lt;/td&gt;
      &lt;td&gt;U+A652&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED YAT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙕ&lt;/td&gt;
      &lt;td&gt;U+A654&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER REVERSED YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙗ&lt;/td&gt;
      &lt;td&gt;U+A656&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙙ&lt;/td&gt;
      &lt;td&gt;U+A658&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙛ&lt;/td&gt;
      &lt;td&gt;U+A65A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BLENDED YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙝ&lt;/td&gt;
      &lt;td&gt;U+A65C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙟ&lt;/td&gt;
      &lt;td&gt;U+A65E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER YN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙡ&lt;/td&gt;
      &lt;td&gt;U+A660&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER REVERSED TSE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙣ&lt;/td&gt;
      &lt;td&gt;U+A662&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SOFT DE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙥ&lt;/td&gt;
      &lt;td&gt;U+A664&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SOFT EL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙧ&lt;/td&gt;
      &lt;td&gt;U+A666&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SOFT EM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙩ&lt;/td&gt;
      &lt;td&gt;U+A668&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER MONOCULAR O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙫ&lt;/td&gt;
      &lt;td&gt;U+A66A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER BINOCULAR O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꙭ&lt;/td&gt;
      &lt;td&gt;U+A66C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚁ&lt;/td&gt;
      &lt;td&gt;U+A680&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚃ&lt;/td&gt;
      &lt;td&gt;U+A682&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚅ&lt;/td&gt;
      &lt;td&gt;U+A684&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER ZHWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚇ&lt;/td&gt;
      &lt;td&gt;U+A686&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CCHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚉ&lt;/td&gt;
      &lt;td&gt;U+A688&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DZZE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚋ&lt;/td&gt;
      &lt;td&gt;U+A68A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚍ&lt;/td&gt;
      &lt;td&gt;U+A68C&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚏ&lt;/td&gt;
      &lt;td&gt;U+A68E&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TSWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚑ&lt;/td&gt;
      &lt;td&gt;U+A690&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TSSE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚓ&lt;/td&gt;
      &lt;td&gt;U+A692&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER TCHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚕ&lt;/td&gt;
      &lt;td&gt;U+A694&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER HWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚗ&lt;/td&gt;
      &lt;td&gt;U+A696&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER SHWE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚙ&lt;/td&gt;
      &lt;td&gt;U+A698&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER DOUBLE O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꚛ&lt;/td&gt;
      &lt;td&gt;U+A69A&lt;/td&gt;
      &lt;td&gt;CYRILLIC CAPITAL LETTER CROSSED O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜣ&lt;/td&gt;
      &lt;td&gt;U+A722&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜥ&lt;/td&gt;
      &lt;td&gt;U+A724&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜧ&lt;/td&gt;
      &lt;td&gt;U+A726&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER HENG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜩ&lt;/td&gt;
      &lt;td&gt;U+A728&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TZ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜫ&lt;/td&gt;
      &lt;td&gt;U+A72A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TRESILLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜭ&lt;/td&gt;
      &lt;td&gt;U+A72C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER CUATRILLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜯ&lt;/td&gt;
      &lt;td&gt;U+A72E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER CUATRILLO WITH COMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜳ&lt;/td&gt;
      &lt;td&gt;U+A732&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜵ&lt;/td&gt;
      &lt;td&gt;U+A734&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜷ&lt;/td&gt;
      &lt;td&gt;U+A736&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜹ&lt;/td&gt;
      &lt;td&gt;U+A738&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜻ&lt;/td&gt;
      &lt;td&gt;U+A73A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜽ&lt;/td&gt;
      &lt;td&gt;U+A73C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER AY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꜿ&lt;/td&gt;
      &lt;td&gt;U+A73E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER REVERSED C WITH DOT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝁ&lt;/td&gt;
      &lt;td&gt;U+A740&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝃ&lt;/td&gt;
      &lt;td&gt;U+A742&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝅ&lt;/td&gt;
      &lt;td&gt;U+A744&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝇ&lt;/td&gt;
      &lt;td&gt;U+A746&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER BROKEN L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝉ&lt;/td&gt;
      &lt;td&gt;U+A748&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH HIGH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝋ&lt;/td&gt;
      &lt;td&gt;U+A74A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝍ&lt;/td&gt;
      &lt;td&gt;U+A74C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER O WITH LOOP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝏ&lt;/td&gt;
      &lt;td&gt;U+A74E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝑ&lt;/td&gt;
      &lt;td&gt;U+A750&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝓ&lt;/td&gt;
      &lt;td&gt;U+A752&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH FLOURISH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝕ&lt;/td&gt;
      &lt;td&gt;U+A754&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝗ&lt;/td&gt;
      &lt;td&gt;U+A756&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝙ&lt;/td&gt;
      &lt;td&gt;U+A758&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝛ&lt;/td&gt;
      &lt;td&gt;U+A75A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R ROTUNDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝝ&lt;/td&gt;
      &lt;td&gt;U+A75C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER RUM ROTUNDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝟ&lt;/td&gt;
      &lt;td&gt;U+A75E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝡ&lt;/td&gt;
      &lt;td&gt;U+A760&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝣ&lt;/td&gt;
      &lt;td&gt;U+A762&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VISIGOTHIC Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝥ&lt;/td&gt;
      &lt;td&gt;U+A764&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER THORN WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝧ&lt;/td&gt;
      &lt;td&gt;U+A766&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝩ&lt;/td&gt;
      &lt;td&gt;U+A768&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VEND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝫ&lt;/td&gt;
      &lt;td&gt;U+A76A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ET&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝭ&lt;/td&gt;
      &lt;td&gt;U+A76C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER IS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝯ&lt;/td&gt;
      &lt;td&gt;U+A76E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER CON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝺ&lt;/td&gt;
      &lt;td&gt;U+A779&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝼ&lt;/td&gt;
      &lt;td&gt;U+A77B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᵹ&lt;/td&gt;
      &lt;td&gt;U+A77D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꝿ&lt;/td&gt;
      &lt;td&gt;U+A77E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED INSULAR G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞁ&lt;/td&gt;
      &lt;td&gt;U+A780&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞃ&lt;/td&gt;
      &lt;td&gt;U+A782&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞅ&lt;/td&gt;
      &lt;td&gt;U+A784&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞇ&lt;/td&gt;
      &lt;td&gt;U+A786&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER INSULAR T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞌ&lt;/td&gt;
      &lt;td&gt;U+A78B&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SALTILLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɥ&lt;/td&gt;
      &lt;td&gt;U+A78D&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞑ&lt;/td&gt;
      &lt;td&gt;U+A790&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH DESCENDER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞓ&lt;/td&gt;
      &lt;td&gt;U+A792&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH BAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞗ&lt;/td&gt;
      &lt;td&gt;U+A796&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER B WITH FLOURISH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞙ&lt;/td&gt;
      &lt;td&gt;U+A798&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER F WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞛ&lt;/td&gt;
      &lt;td&gt;U+A79A&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VOLAPUK AE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞝ&lt;/td&gt;
      &lt;td&gt;U+A79C&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VOLAPUK OE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞟ&lt;/td&gt;
      &lt;td&gt;U+A79E&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER VOLAPUK UE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞡ&lt;/td&gt;
      &lt;td&gt;U+A7A0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞣ&lt;/td&gt;
      &lt;td&gt;U+A7A2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞥ&lt;/td&gt;
      &lt;td&gt;U+A7A4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞧ&lt;/td&gt;
      &lt;td&gt;U+A7A6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞩ&lt;/td&gt;
      &lt;td&gt;U+A7A8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɦ&lt;/td&gt;
      &lt;td&gt;U+A7AA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER H WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɜ&lt;/td&gt;
      &lt;td&gt;U+A7AB&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER REVERSED OPEN E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɡ&lt;/td&gt;
      &lt;td&gt;U+A7AC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SCRIPT G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɬ&lt;/td&gt;
      &lt;td&gt;U+A7AD&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER L WITH BELT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ɪ&lt;/td&gt;
      &lt;td&gt;U+A7AE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER SMALL CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʞ&lt;/td&gt;
      &lt;td&gt;U+A7B0&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʇ&lt;/td&gt;
      &lt;td&gt;U+A7B1&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER TURNED T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʝ&lt;/td&gt;
      &lt;td&gt;U+A7B2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER J WITH CROSSED-TAIL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꭓ&lt;/td&gt;
      &lt;td&gt;U+A7B3&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞵ&lt;/td&gt;
      &lt;td&gt;U+A7B4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞷ&lt;/td&gt;
      &lt;td&gt;U+A7B6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞹ&lt;/td&gt;
      &lt;td&gt;U+A7B8&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER U WITH STROKE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞻ&lt;/td&gt;
      &lt;td&gt;U+A7BA&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER GLOTTAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞽ&lt;/td&gt;
      &lt;td&gt;U+A7BC&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER GLOTTAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞿ&lt;/td&gt;
      &lt;td&gt;U+A7BE&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER GLOTTAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꟃ&lt;/td&gt;
      &lt;td&gt;U+A7C2&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER ANGLICANA W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ꞔ&lt;/td&gt;
      &lt;td&gt;U+A7C4&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER C WITH PALATAL HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ʂ&lt;/td&gt;
      &lt;td&gt;U+A7C5&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER S WITH HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ᶎ&lt;/td&gt;
      &lt;td&gt;U+A7C6&lt;/td&gt;
      &lt;td&gt;LATIN CAPITAL LETTER Z WITH PALATAL HOOK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ａ&lt;/td&gt;
      &lt;td&gt;U+FF21&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｂ&lt;/td&gt;
      &lt;td&gt;U+FF22&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｃ&lt;/td&gt;
      &lt;td&gt;U+FF23&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｄ&lt;/td&gt;
      &lt;td&gt;U+FF24&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｅ&lt;/td&gt;
      &lt;td&gt;U+FF25&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｆ&lt;/td&gt;
      &lt;td&gt;U+FF26&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｇ&lt;/td&gt;
      &lt;td&gt;U+FF27&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｈ&lt;/td&gt;
      &lt;td&gt;U+FF28&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｉ&lt;/td&gt;
      &lt;td&gt;U+FF29&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｊ&lt;/td&gt;
      &lt;td&gt;U+FF2A&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｋ&lt;/td&gt;
      &lt;td&gt;U+FF2B&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｌ&lt;/td&gt;
      &lt;td&gt;U+FF2C&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｍ&lt;/td&gt;
      &lt;td&gt;U+FF2D&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｎ&lt;/td&gt;
      &lt;td&gt;U+FF2E&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｏ&lt;/td&gt;
      &lt;td&gt;U+FF2F&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｐ&lt;/td&gt;
      &lt;td&gt;U+FF30&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｑ&lt;/td&gt;
      &lt;td&gt;U+FF31&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｒ&lt;/td&gt;
      &lt;td&gt;U+FF32&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｓ&lt;/td&gt;
      &lt;td&gt;U+FF33&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｔ&lt;/td&gt;
      &lt;td&gt;U+FF34&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｕ&lt;/td&gt;
      &lt;td&gt;U+FF35&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｖ&lt;/td&gt;
      &lt;td&gt;U+FF36&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｗ&lt;/td&gt;
      &lt;td&gt;U+FF37&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｘ&lt;/td&gt;
      &lt;td&gt;U+FF38&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｙ&lt;/td&gt;
      &lt;td&gt;U+FF39&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ｚ&lt;/td&gt;
      &lt;td&gt;U+FF3A&lt;/td&gt;
      &lt;td&gt;FULLWIDTH LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐀&lt;/td&gt;
      &lt;td&gt;U+10400&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐁&lt;/td&gt;
      &lt;td&gt;U+10401&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐂&lt;/td&gt;
      &lt;td&gt;U+10402&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐃&lt;/td&gt;
      &lt;td&gt;U+10403&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG AH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐄&lt;/td&gt;
      &lt;td&gt;U+10404&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐅&lt;/td&gt;
      &lt;td&gt;U+10405&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER LONG OO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐆&lt;/td&gt;
      &lt;td&gt;U+10406&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐇&lt;/td&gt;
      &lt;td&gt;U+10407&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐈&lt;/td&gt;
      &lt;td&gt;U+10408&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐉&lt;/td&gt;
      &lt;td&gt;U+10409&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT AH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐊&lt;/td&gt;
      &lt;td&gt;U+1040A&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐋&lt;/td&gt;
      &lt;td&gt;U+1040B&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER SHORT OO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐌&lt;/td&gt;
      &lt;td&gt;U+1040C&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER AY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐍&lt;/td&gt;
      &lt;td&gt;U+1040D&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER OW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐎&lt;/td&gt;
      &lt;td&gt;U+1040E&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER WU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐏&lt;/td&gt;
      &lt;td&gt;U+1040F&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER YEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐐&lt;/td&gt;
      &lt;td&gt;U+10410&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐑&lt;/td&gt;
      &lt;td&gt;U+10411&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER PEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐒&lt;/td&gt;
      &lt;td&gt;U+10412&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER BEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐓&lt;/td&gt;
      &lt;td&gt;U+10413&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER TEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐔&lt;/td&gt;
      &lt;td&gt;U+10414&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER DEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐕&lt;/td&gt;
      &lt;td&gt;U+10415&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER CHEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐖&lt;/td&gt;
      &lt;td&gt;U+10416&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER JEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐗&lt;/td&gt;
      &lt;td&gt;U+10417&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER KAY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐘&lt;/td&gt;
      &lt;td&gt;U+10418&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER GAY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐙&lt;/td&gt;
      &lt;td&gt;U+10419&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER EF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐚&lt;/td&gt;
      &lt;td&gt;U+1041A&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER VEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐛&lt;/td&gt;
      &lt;td&gt;U+1041B&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ETH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐜&lt;/td&gt;
      &lt;td&gt;U+1041C&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER THEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐝&lt;/td&gt;
      &lt;td&gt;U+1041D&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ES&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐞&lt;/td&gt;
      &lt;td&gt;U+1041E&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ZEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐟&lt;/td&gt;
      &lt;td&gt;U+1041F&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ESH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐠&lt;/td&gt;
      &lt;td&gt;U+10420&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ZHEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐡&lt;/td&gt;
      &lt;td&gt;U+10421&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐢&lt;/td&gt;
      &lt;td&gt;U+10422&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER EL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐣&lt;/td&gt;
      &lt;td&gt;U+10423&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER EM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐤&lt;/td&gt;
      &lt;td&gt;U+10424&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER EN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐥&lt;/td&gt;
      &lt;td&gt;U+10425&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER ENG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐦&lt;/td&gt;
      &lt;td&gt;U+10426&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER OI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐐧&lt;/td&gt;
      &lt;td&gt;U+10427&lt;/td&gt;
      &lt;td&gt;DESERET CAPITAL LETTER EW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒰&lt;/td&gt;
      &lt;td&gt;U+104B0&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒱&lt;/td&gt;
      &lt;td&gt;U+104B1&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER AI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒲&lt;/td&gt;
      &lt;td&gt;U+104B2&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER AIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒳&lt;/td&gt;
      &lt;td&gt;U+104B3&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER AH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒴&lt;/td&gt;
      &lt;td&gt;U+104B4&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER BRA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒵&lt;/td&gt;
      &lt;td&gt;U+104B5&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER CHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒶&lt;/td&gt;
      &lt;td&gt;U+104B6&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EHCHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒷&lt;/td&gt;
      &lt;td&gt;U+104B7&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒸&lt;/td&gt;
      &lt;td&gt;U+104B8&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒹&lt;/td&gt;
      &lt;td&gt;U+104B9&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒺&lt;/td&gt;
      &lt;td&gt;U+104BA&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER HYA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒻&lt;/td&gt;
      &lt;td&gt;U+104BB&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒼&lt;/td&gt;
      &lt;td&gt;U+104BC&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER KA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒽&lt;/td&gt;
      &lt;td&gt;U+104BD&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EHKA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒾&lt;/td&gt;
      &lt;td&gt;U+104BE&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER KYA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐒿&lt;/td&gt;
      &lt;td&gt;U+104BF&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER LA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓀&lt;/td&gt;
      &lt;td&gt;U+104C0&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER MA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓁&lt;/td&gt;
      &lt;td&gt;U+104C1&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER NA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓂&lt;/td&gt;
      &lt;td&gt;U+104C2&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓃&lt;/td&gt;
      &lt;td&gt;U+104C3&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER OIN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓄&lt;/td&gt;
      &lt;td&gt;U+104C4&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER PA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓅&lt;/td&gt;
      &lt;td&gt;U+104C5&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EHPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓆&lt;/td&gt;
      &lt;td&gt;U+104C6&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER SA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓇&lt;/td&gt;
      &lt;td&gt;U+104C7&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER SHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓈&lt;/td&gt;
      &lt;td&gt;U+104C8&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER TA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓉&lt;/td&gt;
      &lt;td&gt;U+104C9&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EHTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓊&lt;/td&gt;
      &lt;td&gt;U+104CA&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER TSA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓋&lt;/td&gt;
      &lt;td&gt;U+104CB&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER EHTSA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓌&lt;/td&gt;
      &lt;td&gt;U+104CC&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER TSHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓍&lt;/td&gt;
      &lt;td&gt;U+104CD&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER DHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓎&lt;/td&gt;
      &lt;td&gt;U+104CE&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓏&lt;/td&gt;
      &lt;td&gt;U+104CF&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER WA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓐&lt;/td&gt;
      &lt;td&gt;U+104D0&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER KHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓑&lt;/td&gt;
      &lt;td&gt;U+104D1&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER GHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓒&lt;/td&gt;
      &lt;td&gt;U+104D2&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER ZA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐓓&lt;/td&gt;
      &lt;td&gt;U+104D3&lt;/td&gt;
      &lt;td&gt;OSAGE CAPITAL LETTER ZHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲀&lt;/td&gt;
      &lt;td&gt;U+10C80&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲁&lt;/td&gt;
      &lt;td&gt;U+10C81&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER AA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲂&lt;/td&gt;
      &lt;td&gt;U+10C82&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲃&lt;/td&gt;
      &lt;td&gt;U+10C83&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER AMB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲄&lt;/td&gt;
      &lt;td&gt;U+10C84&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲅&lt;/td&gt;
      &lt;td&gt;U+10C85&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ENC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲆&lt;/td&gt;
      &lt;td&gt;U+10C86&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ECS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲇&lt;/td&gt;
      &lt;td&gt;U+10C87&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲈&lt;/td&gt;
      &lt;td&gt;U+10C88&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER AND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲉&lt;/td&gt;
      &lt;td&gt;U+10C89&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲊&lt;/td&gt;
      &lt;td&gt;U+10C8A&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER CLOSE E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲋&lt;/td&gt;
      &lt;td&gt;U+10C8B&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲌&lt;/td&gt;
      &lt;td&gt;U+10C8C&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲍&lt;/td&gt;
      &lt;td&gt;U+10C8D&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲎&lt;/td&gt;
      &lt;td&gt;U+10C8E&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EGY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲏&lt;/td&gt;
      &lt;td&gt;U+10C8F&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲐&lt;/td&gt;
      &lt;td&gt;U+10C90&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲑&lt;/td&gt;
      &lt;td&gt;U+10C91&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER II&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲒&lt;/td&gt;
      &lt;td&gt;U+10C92&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EJ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲓&lt;/td&gt;
      &lt;td&gt;U+10C93&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲔&lt;/td&gt;
      &lt;td&gt;U+10C94&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER AK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲕&lt;/td&gt;
      &lt;td&gt;U+10C95&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER UNK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲖&lt;/td&gt;
      &lt;td&gt;U+10C96&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲗&lt;/td&gt;
      &lt;td&gt;U+10C97&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ELY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲘&lt;/td&gt;
      &lt;td&gt;U+10C98&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲙&lt;/td&gt;
      &lt;td&gt;U+10C99&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲚&lt;/td&gt;
      &lt;td&gt;U+10C9A&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ENY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲛&lt;/td&gt;
      &lt;td&gt;U+10C9B&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲜&lt;/td&gt;
      &lt;td&gt;U+10C9C&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER OO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲝&lt;/td&gt;
      &lt;td&gt;U+10C9D&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲞&lt;/td&gt;
      &lt;td&gt;U+10C9E&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲟&lt;/td&gt;
      &lt;td&gt;U+10C9F&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER OEE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲠&lt;/td&gt;
      &lt;td&gt;U+10CA0&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲡&lt;/td&gt;
      &lt;td&gt;U+10CA1&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EMP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲢&lt;/td&gt;
      &lt;td&gt;U+10CA2&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲣&lt;/td&gt;
      &lt;td&gt;U+10CA3&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER SHORT ER&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲤&lt;/td&gt;
      &lt;td&gt;U+10CA4&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ES&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲥&lt;/td&gt;
      &lt;td&gt;U+10CA5&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ESZ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲦&lt;/td&gt;
      &lt;td&gt;U+10CA6&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ET&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲧&lt;/td&gt;
      &lt;td&gt;U+10CA7&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ENT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲨&lt;/td&gt;
      &lt;td&gt;U+10CA8&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ETY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲩&lt;/td&gt;
      &lt;td&gt;U+10CA9&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ECH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲪&lt;/td&gt;
      &lt;td&gt;U+10CAA&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲫&lt;/td&gt;
      &lt;td&gt;U+10CAB&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER UU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲬&lt;/td&gt;
      &lt;td&gt;U+10CAC&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲭&lt;/td&gt;
      &lt;td&gt;U+10CAD&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲮&lt;/td&gt;
      &lt;td&gt;U+10CAE&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EV&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲯&lt;/td&gt;
      &lt;td&gt;U+10CAF&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EZ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲰&lt;/td&gt;
      &lt;td&gt;U+10CB0&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER EZS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲱&lt;/td&gt;
      &lt;td&gt;U+10CB1&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𐲲&lt;/td&gt;
      &lt;td&gt;U+10CB2&lt;/td&gt;
      &lt;td&gt;OLD HUNGARIAN CAPITAL LETTER US&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢠&lt;/td&gt;
      &lt;td&gt;U+118A0&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER NGAA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢡&lt;/td&gt;
      &lt;td&gt;U+118A1&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢢&lt;/td&gt;
      &lt;td&gt;U+118A2&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER WI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢣&lt;/td&gt;
      &lt;td&gt;U+118A3&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢤&lt;/td&gt;
      &lt;td&gt;U+118A4&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER YA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢥&lt;/td&gt;
      &lt;td&gt;U+118A5&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER YO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢦&lt;/td&gt;
      &lt;td&gt;U+118A6&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER II&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢧&lt;/td&gt;
      &lt;td&gt;U+118A7&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER UU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢨&lt;/td&gt;
      &lt;td&gt;U+118A8&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢩&lt;/td&gt;
      &lt;td&gt;U+118A9&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢪&lt;/td&gt;
      &lt;td&gt;U+118AA&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER ANG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢫&lt;/td&gt;
      &lt;td&gt;U+118AB&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER GA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢬&lt;/td&gt;
      &lt;td&gt;U+118AC&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER KO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢭&lt;/td&gt;
      &lt;td&gt;U+118AD&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER ENY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢮&lt;/td&gt;
      &lt;td&gt;U+118AE&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER YUJ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢯&lt;/td&gt;
      &lt;td&gt;U+118AF&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER UC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢰&lt;/td&gt;
      &lt;td&gt;U+118B0&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER ENN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢱&lt;/td&gt;
      &lt;td&gt;U+118B1&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER ODD&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢲&lt;/td&gt;
      &lt;td&gt;U+118B2&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER TTE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢳&lt;/td&gt;
      &lt;td&gt;U+118B3&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER NUNG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢴&lt;/td&gt;
      &lt;td&gt;U+118B4&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER DA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢵&lt;/td&gt;
      &lt;td&gt;U+118B5&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER AT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢶&lt;/td&gt;
      &lt;td&gt;U+118B6&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER AM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢷&lt;/td&gt;
      &lt;td&gt;U+118B7&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER BU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢸&lt;/td&gt;
      &lt;td&gt;U+118B8&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER PU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢹&lt;/td&gt;
      &lt;td&gt;U+118B9&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER HIYO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢺&lt;/td&gt;
      &lt;td&gt;U+118BA&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER HOLO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢻&lt;/td&gt;
      &lt;td&gt;U+118BB&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER HORR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢼&lt;/td&gt;
      &lt;td&gt;U+118BC&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER HAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢽&lt;/td&gt;
      &lt;td&gt;U+118BD&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER SSUU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢾&lt;/td&gt;
      &lt;td&gt;U+118BE&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER SII&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𑢿&lt;/td&gt;
      &lt;td&gt;U+118BF&lt;/td&gt;
      &lt;td&gt;WARANG CITI CAPITAL LETTER VIYO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹀&lt;/td&gt;
      &lt;td&gt;U+16E40&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹁&lt;/td&gt;
      &lt;td&gt;U+16E41&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹂&lt;/td&gt;
      &lt;td&gt;U+16E42&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹃&lt;/td&gt;
      &lt;td&gt;U+16E43&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹄&lt;/td&gt;
      &lt;td&gt;U+16E44&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER ATIU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹅&lt;/td&gt;
      &lt;td&gt;U+16E45&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹆&lt;/td&gt;
      &lt;td&gt;U+16E46&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER KP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹇&lt;/td&gt;
      &lt;td&gt;U+16E47&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹈&lt;/td&gt;
      &lt;td&gt;U+16E48&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹉&lt;/td&gt;
      &lt;td&gt;U+16E49&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹊&lt;/td&gt;
      &lt;td&gt;U+16E4A&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹋&lt;/td&gt;
      &lt;td&gt;U+16E4B&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹌&lt;/td&gt;
      &lt;td&gt;U+16E4C&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹍&lt;/td&gt;
      &lt;td&gt;U+16E4D&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹎&lt;/td&gt;
      &lt;td&gt;U+16E4E&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹏&lt;/td&gt;
      &lt;td&gt;U+16E4F&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹐&lt;/td&gt;
      &lt;td&gt;U+16E50&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹑&lt;/td&gt;
      &lt;td&gt;U+16E51&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹒&lt;/td&gt;
      &lt;td&gt;U+16E52&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹓&lt;/td&gt;
      &lt;td&gt;U+16E53&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER YU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹔&lt;/td&gt;
      &lt;td&gt;U+16E54&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹕&lt;/td&gt;
      &lt;td&gt;U+16E55&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹖&lt;/td&gt;
      &lt;td&gt;U+16E56&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER HP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹗&lt;/td&gt;
      &lt;td&gt;U+16E57&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER NY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹘&lt;/td&gt;
      &lt;td&gt;U+16E58&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹙&lt;/td&gt;
      &lt;td&gt;U+16E59&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹚&lt;/td&gt;
      &lt;td&gt;U+16E5A&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER OE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹛&lt;/td&gt;
      &lt;td&gt;U+16E5B&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹜&lt;/td&gt;
      &lt;td&gt;U+16E5C&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹝&lt;/td&gt;
      &lt;td&gt;U+16E5D&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹞&lt;/td&gt;
      &lt;td&gt;U+16E5E&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER AI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𖹟&lt;/td&gt;
      &lt;td&gt;U+16E5F&lt;/td&gt;
      &lt;td&gt;MEDEFAIDRIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐀&lt;/td&gt;
      &lt;td&gt;U+1D400&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐁&lt;/td&gt;
      &lt;td&gt;U+1D401&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐂&lt;/td&gt;
      &lt;td&gt;U+1D402&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐃&lt;/td&gt;
      &lt;td&gt;U+1D403&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐄&lt;/td&gt;
      &lt;td&gt;U+1D404&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐅&lt;/td&gt;
      &lt;td&gt;U+1D405&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐆&lt;/td&gt;
      &lt;td&gt;U+1D406&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐇&lt;/td&gt;
      &lt;td&gt;U+1D407&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐈&lt;/td&gt;
      &lt;td&gt;U+1D408&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐉&lt;/td&gt;
      &lt;td&gt;U+1D409&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐊&lt;/td&gt;
      &lt;td&gt;U+1D40A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐋&lt;/td&gt;
      &lt;td&gt;U+1D40B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐌&lt;/td&gt;
      &lt;td&gt;U+1D40C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐍&lt;/td&gt;
      &lt;td&gt;U+1D40D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐎&lt;/td&gt;
      &lt;td&gt;U+1D40E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐏&lt;/td&gt;
      &lt;td&gt;U+1D40F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐐&lt;/td&gt;
      &lt;td&gt;U+1D410&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐑&lt;/td&gt;
      &lt;td&gt;U+1D411&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐒&lt;/td&gt;
      &lt;td&gt;U+1D412&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐓&lt;/td&gt;
      &lt;td&gt;U+1D413&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐔&lt;/td&gt;
      &lt;td&gt;U+1D414&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐕&lt;/td&gt;
      &lt;td&gt;U+1D415&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐖&lt;/td&gt;
      &lt;td&gt;U+1D416&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐗&lt;/td&gt;
      &lt;td&gt;U+1D417&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐘&lt;/td&gt;
      &lt;td&gt;U+1D418&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐙&lt;/td&gt;
      &lt;td&gt;U+1D419&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐴&lt;/td&gt;
      &lt;td&gt;U+1D434&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐵&lt;/td&gt;
      &lt;td&gt;U+1D435&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐶&lt;/td&gt;
      &lt;td&gt;U+1D436&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐷&lt;/td&gt;
      &lt;td&gt;U+1D437&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐸&lt;/td&gt;
      &lt;td&gt;U+1D438&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐹&lt;/td&gt;
      &lt;td&gt;U+1D439&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐺&lt;/td&gt;
      &lt;td&gt;U+1D43A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐻&lt;/td&gt;
      &lt;td&gt;U+1D43B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐼&lt;/td&gt;
      &lt;td&gt;U+1D43C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐽&lt;/td&gt;
      &lt;td&gt;U+1D43D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐾&lt;/td&gt;
      &lt;td&gt;U+1D43E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝐿&lt;/td&gt;
      &lt;td&gt;U+1D43F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑀&lt;/td&gt;
      &lt;td&gt;U+1D440&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑁&lt;/td&gt;
      &lt;td&gt;U+1D441&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑂&lt;/td&gt;
      &lt;td&gt;U+1D442&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑃&lt;/td&gt;
      &lt;td&gt;U+1D443&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑄&lt;/td&gt;
      &lt;td&gt;U+1D444&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑅&lt;/td&gt;
      &lt;td&gt;U+1D445&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑆&lt;/td&gt;
      &lt;td&gt;U+1D446&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑇&lt;/td&gt;
      &lt;td&gt;U+1D447&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑈&lt;/td&gt;
      &lt;td&gt;U+1D448&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑉&lt;/td&gt;
      &lt;td&gt;U+1D449&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑊&lt;/td&gt;
      &lt;td&gt;U+1D44A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑋&lt;/td&gt;
      &lt;td&gt;U+1D44B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑌&lt;/td&gt;
      &lt;td&gt;U+1D44C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑍&lt;/td&gt;
      &lt;td&gt;U+1D44D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑨&lt;/td&gt;
      &lt;td&gt;U+1D468&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑩&lt;/td&gt;
      &lt;td&gt;U+1D469&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑪&lt;/td&gt;
      &lt;td&gt;U+1D46A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑫&lt;/td&gt;
      &lt;td&gt;U+1D46B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑬&lt;/td&gt;
      &lt;td&gt;U+1D46C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑭&lt;/td&gt;
      &lt;td&gt;U+1D46D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑮&lt;/td&gt;
      &lt;td&gt;U+1D46E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑯&lt;/td&gt;
      &lt;td&gt;U+1D46F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑰&lt;/td&gt;
      &lt;td&gt;U+1D470&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑱&lt;/td&gt;
      &lt;td&gt;U+1D471&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑲&lt;/td&gt;
      &lt;td&gt;U+1D472&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑳&lt;/td&gt;
      &lt;td&gt;U+1D473&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑴&lt;/td&gt;
      &lt;td&gt;U+1D474&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑵&lt;/td&gt;
      &lt;td&gt;U+1D475&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑶&lt;/td&gt;
      &lt;td&gt;U+1D476&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑷&lt;/td&gt;
      &lt;td&gt;U+1D477&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑸&lt;/td&gt;
      &lt;td&gt;U+1D478&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑹&lt;/td&gt;
      &lt;td&gt;U+1D479&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑺&lt;/td&gt;
      &lt;td&gt;U+1D47A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑻&lt;/td&gt;
      &lt;td&gt;U+1D47B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑼&lt;/td&gt;
      &lt;td&gt;U+1D47C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑽&lt;/td&gt;
      &lt;td&gt;U+1D47D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑾&lt;/td&gt;
      &lt;td&gt;U+1D47E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝑿&lt;/td&gt;
      &lt;td&gt;U+1D47F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒀&lt;/td&gt;
      &lt;td&gt;U+1D480&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒁&lt;/td&gt;
      &lt;td&gt;U+1D481&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒜&lt;/td&gt;
      &lt;td&gt;U+1D49C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒞&lt;/td&gt;
      &lt;td&gt;U+1D49E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒟&lt;/td&gt;
      &lt;td&gt;U+1D49F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒢&lt;/td&gt;
      &lt;td&gt;U+1D4A2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒥&lt;/td&gt;
      &lt;td&gt;U+1D4A5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒦&lt;/td&gt;
      &lt;td&gt;U+1D4A6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒩&lt;/td&gt;
      &lt;td&gt;U+1D4A9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒪&lt;/td&gt;
      &lt;td&gt;U+1D4AA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒫&lt;/td&gt;
      &lt;td&gt;U+1D4AB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒬&lt;/td&gt;
      &lt;td&gt;U+1D4AC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒮&lt;/td&gt;
      &lt;td&gt;U+1D4AE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒯&lt;/td&gt;
      &lt;td&gt;U+1D4AF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒰&lt;/td&gt;
      &lt;td&gt;U+1D4B0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒱&lt;/td&gt;
      &lt;td&gt;U+1D4B1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒲&lt;/td&gt;
      &lt;td&gt;U+1D4B2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒳&lt;/td&gt;
      &lt;td&gt;U+1D4B3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒴&lt;/td&gt;
      &lt;td&gt;U+1D4B4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝒵&lt;/td&gt;
      &lt;td&gt;U+1D4B5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SCRIPT CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓐&lt;/td&gt;
      &lt;td&gt;U+1D4D0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓑&lt;/td&gt;
      &lt;td&gt;U+1D4D1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓒&lt;/td&gt;
      &lt;td&gt;U+1D4D2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓓&lt;/td&gt;
      &lt;td&gt;U+1D4D3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓔&lt;/td&gt;
      &lt;td&gt;U+1D4D4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓕&lt;/td&gt;
      &lt;td&gt;U+1D4D5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓖&lt;/td&gt;
      &lt;td&gt;U+1D4D6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓗&lt;/td&gt;
      &lt;td&gt;U+1D4D7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓘&lt;/td&gt;
      &lt;td&gt;U+1D4D8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓙&lt;/td&gt;
      &lt;td&gt;U+1D4D9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓚&lt;/td&gt;
      &lt;td&gt;U+1D4DA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓛&lt;/td&gt;
      &lt;td&gt;U+1D4DB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓜&lt;/td&gt;
      &lt;td&gt;U+1D4DC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓝&lt;/td&gt;
      &lt;td&gt;U+1D4DD&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓞&lt;/td&gt;
      &lt;td&gt;U+1D4DE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓟&lt;/td&gt;
      &lt;td&gt;U+1D4DF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓠&lt;/td&gt;
      &lt;td&gt;U+1D4E0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓡&lt;/td&gt;
      &lt;td&gt;U+1D4E1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓢&lt;/td&gt;
      &lt;td&gt;U+1D4E2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓣&lt;/td&gt;
      &lt;td&gt;U+1D4E3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓤&lt;/td&gt;
      &lt;td&gt;U+1D4E4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓥&lt;/td&gt;
      &lt;td&gt;U+1D4E5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓦&lt;/td&gt;
      &lt;td&gt;U+1D4E6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓧&lt;/td&gt;
      &lt;td&gt;U+1D4E7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓨&lt;/td&gt;
      &lt;td&gt;U+1D4E8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝓩&lt;/td&gt;
      &lt;td&gt;U+1D4E9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD SCRIPT CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔄&lt;/td&gt;
      &lt;td&gt;U+1D504&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔅&lt;/td&gt;
      &lt;td&gt;U+1D505&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔇&lt;/td&gt;
      &lt;td&gt;U+1D507&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔈&lt;/td&gt;
      &lt;td&gt;U+1D508&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔉&lt;/td&gt;
      &lt;td&gt;U+1D509&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔊&lt;/td&gt;
      &lt;td&gt;U+1D50A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔍&lt;/td&gt;
      &lt;td&gt;U+1D50D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔎&lt;/td&gt;
      &lt;td&gt;U+1D50E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔏&lt;/td&gt;
      &lt;td&gt;U+1D50F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔐&lt;/td&gt;
      &lt;td&gt;U+1D510&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔑&lt;/td&gt;
      &lt;td&gt;U+1D511&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔒&lt;/td&gt;
      &lt;td&gt;U+1D512&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔓&lt;/td&gt;
      &lt;td&gt;U+1D513&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔔&lt;/td&gt;
      &lt;td&gt;U+1D514&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔖&lt;/td&gt;
      &lt;td&gt;U+1D516&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔗&lt;/td&gt;
      &lt;td&gt;U+1D517&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔘&lt;/td&gt;
      &lt;td&gt;U+1D518&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔙&lt;/td&gt;
      &lt;td&gt;U+1D519&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔚&lt;/td&gt;
      &lt;td&gt;U+1D51A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔛&lt;/td&gt;
      &lt;td&gt;U+1D51B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔜&lt;/td&gt;
      &lt;td&gt;U+1D51C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL FRAKTUR CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔸&lt;/td&gt;
      &lt;td&gt;U+1D538&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔹&lt;/td&gt;
      &lt;td&gt;U+1D539&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔻&lt;/td&gt;
      &lt;td&gt;U+1D53B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔼&lt;/td&gt;
      &lt;td&gt;U+1D53C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔽&lt;/td&gt;
      &lt;td&gt;U+1D53D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝔾&lt;/td&gt;
      &lt;td&gt;U+1D53E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕀&lt;/td&gt;
      &lt;td&gt;U+1D540&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕁&lt;/td&gt;
      &lt;td&gt;U+1D541&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕂&lt;/td&gt;
      &lt;td&gt;U+1D542&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕃&lt;/td&gt;
      &lt;td&gt;U+1D543&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕄&lt;/td&gt;
      &lt;td&gt;U+1D544&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕆&lt;/td&gt;
      &lt;td&gt;U+1D546&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕊&lt;/td&gt;
      &lt;td&gt;U+1D54A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕋&lt;/td&gt;
      &lt;td&gt;U+1D54B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕌&lt;/td&gt;
      &lt;td&gt;U+1D54C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕍&lt;/td&gt;
      &lt;td&gt;U+1D54D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕎&lt;/td&gt;
      &lt;td&gt;U+1D54E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕏&lt;/td&gt;
      &lt;td&gt;U+1D54F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕐&lt;/td&gt;
      &lt;td&gt;U+1D550&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕬&lt;/td&gt;
      &lt;td&gt;U+1D56C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕭&lt;/td&gt;
      &lt;td&gt;U+1D56D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕮&lt;/td&gt;
      &lt;td&gt;U+1D56E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕯&lt;/td&gt;
      &lt;td&gt;U+1D56F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕰&lt;/td&gt;
      &lt;td&gt;U+1D570&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕱&lt;/td&gt;
      &lt;td&gt;U+1D571&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕲&lt;/td&gt;
      &lt;td&gt;U+1D572&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕳&lt;/td&gt;
      &lt;td&gt;U+1D573&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕴&lt;/td&gt;
      &lt;td&gt;U+1D574&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕵&lt;/td&gt;
      &lt;td&gt;U+1D575&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕶&lt;/td&gt;
      &lt;td&gt;U+1D576&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕷&lt;/td&gt;
      &lt;td&gt;U+1D577&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕸&lt;/td&gt;
      &lt;td&gt;U+1D578&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕹&lt;/td&gt;
      &lt;td&gt;U+1D579&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕺&lt;/td&gt;
      &lt;td&gt;U+1D57A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕻&lt;/td&gt;
      &lt;td&gt;U+1D57B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕼&lt;/td&gt;
      &lt;td&gt;U+1D57C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕽&lt;/td&gt;
      &lt;td&gt;U+1D57D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕾&lt;/td&gt;
      &lt;td&gt;U+1D57E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝕿&lt;/td&gt;
      &lt;td&gt;U+1D57F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖀&lt;/td&gt;
      &lt;td&gt;U+1D580&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖁&lt;/td&gt;
      &lt;td&gt;U+1D581&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖂&lt;/td&gt;
      &lt;td&gt;U+1D582&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖃&lt;/td&gt;
      &lt;td&gt;U+1D583&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖄&lt;/td&gt;
      &lt;td&gt;U+1D584&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖅&lt;/td&gt;
      &lt;td&gt;U+1D585&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD FRAKTUR CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖠&lt;/td&gt;
      &lt;td&gt;U+1D5A0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖡&lt;/td&gt;
      &lt;td&gt;U+1D5A1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖢&lt;/td&gt;
      &lt;td&gt;U+1D5A2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖣&lt;/td&gt;
      &lt;td&gt;U+1D5A3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖤&lt;/td&gt;
      &lt;td&gt;U+1D5A4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖥&lt;/td&gt;
      &lt;td&gt;U+1D5A5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖦&lt;/td&gt;
      &lt;td&gt;U+1D5A6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖧&lt;/td&gt;
      &lt;td&gt;U+1D5A7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖨&lt;/td&gt;
      &lt;td&gt;U+1D5A8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖩&lt;/td&gt;
      &lt;td&gt;U+1D5A9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖪&lt;/td&gt;
      &lt;td&gt;U+1D5AA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖫&lt;/td&gt;
      &lt;td&gt;U+1D5AB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖬&lt;/td&gt;
      &lt;td&gt;U+1D5AC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖭&lt;/td&gt;
      &lt;td&gt;U+1D5AD&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖮&lt;/td&gt;
      &lt;td&gt;U+1D5AE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖯&lt;/td&gt;
      &lt;td&gt;U+1D5AF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖰&lt;/td&gt;
      &lt;td&gt;U+1D5B0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖱&lt;/td&gt;
      &lt;td&gt;U+1D5B1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖲&lt;/td&gt;
      &lt;td&gt;U+1D5B2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖳&lt;/td&gt;
      &lt;td&gt;U+1D5B3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖴&lt;/td&gt;
      &lt;td&gt;U+1D5B4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖵&lt;/td&gt;
      &lt;td&gt;U+1D5B5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖶&lt;/td&gt;
      &lt;td&gt;U+1D5B6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖷&lt;/td&gt;
      &lt;td&gt;U+1D5B7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖸&lt;/td&gt;
      &lt;td&gt;U+1D5B8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝖹&lt;/td&gt;
      &lt;td&gt;U+1D5B9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗔&lt;/td&gt;
      &lt;td&gt;U+1D5D4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗕&lt;/td&gt;
      &lt;td&gt;U+1D5D5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗖&lt;/td&gt;
      &lt;td&gt;U+1D5D6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗗&lt;/td&gt;
      &lt;td&gt;U+1D5D7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗘&lt;/td&gt;
      &lt;td&gt;U+1D5D8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗙&lt;/td&gt;
      &lt;td&gt;U+1D5D9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗚&lt;/td&gt;
      &lt;td&gt;U+1D5DA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗛&lt;/td&gt;
      &lt;td&gt;U+1D5DB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗜&lt;/td&gt;
      &lt;td&gt;U+1D5DC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗝&lt;/td&gt;
      &lt;td&gt;U+1D5DD&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗞&lt;/td&gt;
      &lt;td&gt;U+1D5DE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗟&lt;/td&gt;
      &lt;td&gt;U+1D5DF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗠&lt;/td&gt;
      &lt;td&gt;U+1D5E0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗡&lt;/td&gt;
      &lt;td&gt;U+1D5E1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗢&lt;/td&gt;
      &lt;td&gt;U+1D5E2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗣&lt;/td&gt;
      &lt;td&gt;U+1D5E3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗤&lt;/td&gt;
      &lt;td&gt;U+1D5E4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗥&lt;/td&gt;
      &lt;td&gt;U+1D5E5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗦&lt;/td&gt;
      &lt;td&gt;U+1D5E6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗧&lt;/td&gt;
      &lt;td&gt;U+1D5E7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗨&lt;/td&gt;
      &lt;td&gt;U+1D5E8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗩&lt;/td&gt;
      &lt;td&gt;U+1D5E9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗪&lt;/td&gt;
      &lt;td&gt;U+1D5EA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗫&lt;/td&gt;
      &lt;td&gt;U+1D5EB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗬&lt;/td&gt;
      &lt;td&gt;U+1D5EC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝗭&lt;/td&gt;
      &lt;td&gt;U+1D5ED&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘈&lt;/td&gt;
      &lt;td&gt;U+1D608&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘉&lt;/td&gt;
      &lt;td&gt;U+1D609&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘊&lt;/td&gt;
      &lt;td&gt;U+1D60A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘋&lt;/td&gt;
      &lt;td&gt;U+1D60B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘌&lt;/td&gt;
      &lt;td&gt;U+1D60C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘍&lt;/td&gt;
      &lt;td&gt;U+1D60D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘎&lt;/td&gt;
      &lt;td&gt;U+1D60E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘏&lt;/td&gt;
      &lt;td&gt;U+1D60F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘐&lt;/td&gt;
      &lt;td&gt;U+1D610&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘑&lt;/td&gt;
      &lt;td&gt;U+1D611&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘒&lt;/td&gt;
      &lt;td&gt;U+1D612&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘓&lt;/td&gt;
      &lt;td&gt;U+1D613&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘔&lt;/td&gt;
      &lt;td&gt;U+1D614&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘕&lt;/td&gt;
      &lt;td&gt;U+1D615&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘖&lt;/td&gt;
      &lt;td&gt;U+1D616&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘗&lt;/td&gt;
      &lt;td&gt;U+1D617&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘘&lt;/td&gt;
      &lt;td&gt;U+1D618&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘙&lt;/td&gt;
      &lt;td&gt;U+1D619&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘚&lt;/td&gt;
      &lt;td&gt;U+1D61A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘛&lt;/td&gt;
      &lt;td&gt;U+1D61B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘜&lt;/td&gt;
      &lt;td&gt;U+1D61C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘝&lt;/td&gt;
      &lt;td&gt;U+1D61D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘞&lt;/td&gt;
      &lt;td&gt;U+1D61E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘟&lt;/td&gt;
      &lt;td&gt;U+1D61F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘠&lt;/td&gt;
      &lt;td&gt;U+1D620&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘡&lt;/td&gt;
      &lt;td&gt;U+1D621&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘼&lt;/td&gt;
      &lt;td&gt;U+1D63C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘽&lt;/td&gt;
      &lt;td&gt;U+1D63D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘾&lt;/td&gt;
      &lt;td&gt;U+1D63E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝘿&lt;/td&gt;
      &lt;td&gt;U+1D63F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙀&lt;/td&gt;
      &lt;td&gt;U+1D640&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙁&lt;/td&gt;
      &lt;td&gt;U+1D641&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙂&lt;/td&gt;
      &lt;td&gt;U+1D642&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙃&lt;/td&gt;
      &lt;td&gt;U+1D643&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙄&lt;/td&gt;
      &lt;td&gt;U+1D644&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙅&lt;/td&gt;
      &lt;td&gt;U+1D645&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙆&lt;/td&gt;
      &lt;td&gt;U+1D646&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙇&lt;/td&gt;
      &lt;td&gt;U+1D647&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙈&lt;/td&gt;
      &lt;td&gt;U+1D648&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙉&lt;/td&gt;
      &lt;td&gt;U+1D649&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙊&lt;/td&gt;
      &lt;td&gt;U+1D64A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙋&lt;/td&gt;
      &lt;td&gt;U+1D64B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙌&lt;/td&gt;
      &lt;td&gt;U+1D64C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙍&lt;/td&gt;
      &lt;td&gt;U+1D64D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙎&lt;/td&gt;
      &lt;td&gt;U+1D64E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙏&lt;/td&gt;
      &lt;td&gt;U+1D64F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙐&lt;/td&gt;
      &lt;td&gt;U+1D650&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙑&lt;/td&gt;
      &lt;td&gt;U+1D651&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙒&lt;/td&gt;
      &lt;td&gt;U+1D652&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙓&lt;/td&gt;
      &lt;td&gt;U+1D653&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙔&lt;/td&gt;
      &lt;td&gt;U+1D654&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙕&lt;/td&gt;
      &lt;td&gt;U+1D655&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙰&lt;/td&gt;
      &lt;td&gt;U+1D670&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙱&lt;/td&gt;
      &lt;td&gt;U+1D671&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙲&lt;/td&gt;
      &lt;td&gt;U+1D672&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙳&lt;/td&gt;
      &lt;td&gt;U+1D673&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙴&lt;/td&gt;
      &lt;td&gt;U+1D674&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙵&lt;/td&gt;
      &lt;td&gt;U+1D675&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙶&lt;/td&gt;
      &lt;td&gt;U+1D676&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙷&lt;/td&gt;
      &lt;td&gt;U+1D677&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙸&lt;/td&gt;
      &lt;td&gt;U+1D678&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙹&lt;/td&gt;
      &lt;td&gt;U+1D679&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙺&lt;/td&gt;
      &lt;td&gt;U+1D67A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙻&lt;/td&gt;
      &lt;td&gt;U+1D67B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙼&lt;/td&gt;
      &lt;td&gt;U+1D67C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙽&lt;/td&gt;
      &lt;td&gt;U+1D67D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙾&lt;/td&gt;
      &lt;td&gt;U+1D67E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝙿&lt;/td&gt;
      &lt;td&gt;U+1D67F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚀&lt;/td&gt;
      &lt;td&gt;U+1D680&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚁&lt;/td&gt;
      &lt;td&gt;U+1D681&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚂&lt;/td&gt;
      &lt;td&gt;U+1D682&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚃&lt;/td&gt;
      &lt;td&gt;U+1D683&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚄&lt;/td&gt;
      &lt;td&gt;U+1D684&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚅&lt;/td&gt;
      &lt;td&gt;U+1D685&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚆&lt;/td&gt;
      &lt;td&gt;U+1D686&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚇&lt;/td&gt;
      &lt;td&gt;U+1D687&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚈&lt;/td&gt;
      &lt;td&gt;U+1D688&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚉&lt;/td&gt;
      &lt;td&gt;U+1D689&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL MONOSPACE CAPITAL Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚨&lt;/td&gt;
      &lt;td&gt;U+1D6A8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚩&lt;/td&gt;
      &lt;td&gt;U+1D6A9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚪&lt;/td&gt;
      &lt;td&gt;U+1D6AA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚫&lt;/td&gt;
      &lt;td&gt;U+1D6AB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚬&lt;/td&gt;
      &lt;td&gt;U+1D6AC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚭&lt;/td&gt;
      &lt;td&gt;U+1D6AD&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚮&lt;/td&gt;
      &lt;td&gt;U+1D6AE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚯&lt;/td&gt;
      &lt;td&gt;U+1D6AF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚰&lt;/td&gt;
      &lt;td&gt;U+1D6B0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚱&lt;/td&gt;
      &lt;td&gt;U+1D6B1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚲&lt;/td&gt;
      &lt;td&gt;U+1D6B2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚳&lt;/td&gt;
      &lt;td&gt;U+1D6B3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚴&lt;/td&gt;
      &lt;td&gt;U+1D6B4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚵&lt;/td&gt;
      &lt;td&gt;U+1D6B5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚶&lt;/td&gt;
      &lt;td&gt;U+1D6B6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚷&lt;/td&gt;
      &lt;td&gt;U+1D6B7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚸&lt;/td&gt;
      &lt;td&gt;U+1D6B8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚹&lt;/td&gt;
      &lt;td&gt;U+1D6B9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚺&lt;/td&gt;
      &lt;td&gt;U+1D6BA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚻&lt;/td&gt;
      &lt;td&gt;U+1D6BB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚼&lt;/td&gt;
      &lt;td&gt;U+1D6BC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚽&lt;/td&gt;
      &lt;td&gt;U+1D6BD&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚾&lt;/td&gt;
      &lt;td&gt;U+1D6BE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝚿&lt;/td&gt;
      &lt;td&gt;U+1D6BF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛀&lt;/td&gt;
      &lt;td&gt;U+1D6C0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛢&lt;/td&gt;
      &lt;td&gt;U+1D6E2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛣&lt;/td&gt;
      &lt;td&gt;U+1D6E3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛤&lt;/td&gt;
      &lt;td&gt;U+1D6E4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛥&lt;/td&gt;
      &lt;td&gt;U+1D6E5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛦&lt;/td&gt;
      &lt;td&gt;U+1D6E6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛧&lt;/td&gt;
      &lt;td&gt;U+1D6E7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛨&lt;/td&gt;
      &lt;td&gt;U+1D6E8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛩&lt;/td&gt;
      &lt;td&gt;U+1D6E9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛪&lt;/td&gt;
      &lt;td&gt;U+1D6EA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛫&lt;/td&gt;
      &lt;td&gt;U+1D6EB&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛬&lt;/td&gt;
      &lt;td&gt;U+1D6EC&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛭&lt;/td&gt;
      &lt;td&gt;U+1D6ED&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛮&lt;/td&gt;
      &lt;td&gt;U+1D6EE&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛯&lt;/td&gt;
      &lt;td&gt;U+1D6EF&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛰&lt;/td&gt;
      &lt;td&gt;U+1D6F0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛱&lt;/td&gt;
      &lt;td&gt;U+1D6F1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛲&lt;/td&gt;
      &lt;td&gt;U+1D6F2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛳&lt;/td&gt;
      &lt;td&gt;U+1D6F3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛴&lt;/td&gt;
      &lt;td&gt;U+1D6F4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛵&lt;/td&gt;
      &lt;td&gt;U+1D6F5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛶&lt;/td&gt;
      &lt;td&gt;U+1D6F6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛷&lt;/td&gt;
      &lt;td&gt;U+1D6F7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛸&lt;/td&gt;
      &lt;td&gt;U+1D6F8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛹&lt;/td&gt;
      &lt;td&gt;U+1D6F9&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝛺&lt;/td&gt;
      &lt;td&gt;U+1D6FA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL ITALIC CAPITAL OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜜&lt;/td&gt;
      &lt;td&gt;U+1D71C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜝&lt;/td&gt;
      &lt;td&gt;U+1D71D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜞&lt;/td&gt;
      &lt;td&gt;U+1D71E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜟&lt;/td&gt;
      &lt;td&gt;U+1D71F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜠&lt;/td&gt;
      &lt;td&gt;U+1D720&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜡&lt;/td&gt;
      &lt;td&gt;U+1D721&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜢&lt;/td&gt;
      &lt;td&gt;U+1D722&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜣&lt;/td&gt;
      &lt;td&gt;U+1D723&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜤&lt;/td&gt;
      &lt;td&gt;U+1D724&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜥&lt;/td&gt;
      &lt;td&gt;U+1D725&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜦&lt;/td&gt;
      &lt;td&gt;U+1D726&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜧&lt;/td&gt;
      &lt;td&gt;U+1D727&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜨&lt;/td&gt;
      &lt;td&gt;U+1D728&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜩&lt;/td&gt;
      &lt;td&gt;U+1D729&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜪&lt;/td&gt;
      &lt;td&gt;U+1D72A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜫&lt;/td&gt;
      &lt;td&gt;U+1D72B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜬&lt;/td&gt;
      &lt;td&gt;U+1D72C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜭&lt;/td&gt;
      &lt;td&gt;U+1D72D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜮&lt;/td&gt;
      &lt;td&gt;U+1D72E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜯&lt;/td&gt;
      &lt;td&gt;U+1D72F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜰&lt;/td&gt;
      &lt;td&gt;U+1D730&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜱&lt;/td&gt;
      &lt;td&gt;U+1D731&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜲&lt;/td&gt;
      &lt;td&gt;U+1D732&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜳&lt;/td&gt;
      &lt;td&gt;U+1D733&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝜴&lt;/td&gt;
      &lt;td&gt;U+1D734&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝖&lt;/td&gt;
      &lt;td&gt;U+1D756&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝗&lt;/td&gt;
      &lt;td&gt;U+1D757&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝘&lt;/td&gt;
      &lt;td&gt;U+1D758&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝙&lt;/td&gt;
      &lt;td&gt;U+1D759&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝚&lt;/td&gt;
      &lt;td&gt;U+1D75A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝛&lt;/td&gt;
      &lt;td&gt;U+1D75B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝜&lt;/td&gt;
      &lt;td&gt;U+1D75C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝝&lt;/td&gt;
      &lt;td&gt;U+1D75D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝞&lt;/td&gt;
      &lt;td&gt;U+1D75E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝟&lt;/td&gt;
      &lt;td&gt;U+1D75F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝠&lt;/td&gt;
      &lt;td&gt;U+1D760&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝡&lt;/td&gt;
      &lt;td&gt;U+1D761&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝢&lt;/td&gt;
      &lt;td&gt;U+1D762&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝣&lt;/td&gt;
      &lt;td&gt;U+1D763&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝤&lt;/td&gt;
      &lt;td&gt;U+1D764&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝥&lt;/td&gt;
      &lt;td&gt;U+1D765&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝦&lt;/td&gt;
      &lt;td&gt;U+1D766&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝧&lt;/td&gt;
      &lt;td&gt;U+1D767&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝨&lt;/td&gt;
      &lt;td&gt;U+1D768&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝩&lt;/td&gt;
      &lt;td&gt;U+1D769&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝪&lt;/td&gt;
      &lt;td&gt;U+1D76A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝫&lt;/td&gt;
      &lt;td&gt;U+1D76B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝬&lt;/td&gt;
      &lt;td&gt;U+1D76C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝭&lt;/td&gt;
      &lt;td&gt;U+1D76D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝝮&lt;/td&gt;
      &lt;td&gt;U+1D76E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞐&lt;/td&gt;
      &lt;td&gt;U+1D790&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞑&lt;/td&gt;
      &lt;td&gt;U+1D791&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞒&lt;/td&gt;
      &lt;td&gt;U+1D792&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞓&lt;/td&gt;
      &lt;td&gt;U+1D793&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞔&lt;/td&gt;
      &lt;td&gt;U+1D794&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞕&lt;/td&gt;
      &lt;td&gt;U+1D795&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞖&lt;/td&gt;
      &lt;td&gt;U+1D796&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞗&lt;/td&gt;
      &lt;td&gt;U+1D797&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞘&lt;/td&gt;
      &lt;td&gt;U+1D798&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞙&lt;/td&gt;
      &lt;td&gt;U+1D799&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞚&lt;/td&gt;
      &lt;td&gt;U+1D79A&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞛&lt;/td&gt;
      &lt;td&gt;U+1D79B&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞜&lt;/td&gt;
      &lt;td&gt;U+1D79C&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞝&lt;/td&gt;
      &lt;td&gt;U+1D79D&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞞&lt;/td&gt;
      &lt;td&gt;U+1D79E&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞟&lt;/td&gt;
      &lt;td&gt;U+1D79F&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞠&lt;/td&gt;
      &lt;td&gt;U+1D7A0&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞡&lt;/td&gt;
      &lt;td&gt;U+1D7A1&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞢&lt;/td&gt;
      &lt;td&gt;U+1D7A2&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞣&lt;/td&gt;
      &lt;td&gt;U+1D7A3&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞤&lt;/td&gt;
      &lt;td&gt;U+1D7A4&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞥&lt;/td&gt;
      &lt;td&gt;U+1D7A5&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞦&lt;/td&gt;
      &lt;td&gt;U+1D7A6&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞧&lt;/td&gt;
      &lt;td&gt;U+1D7A7&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝞨&lt;/td&gt;
      &lt;td&gt;U+1D7A8&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𝟊&lt;/td&gt;
      &lt;td&gt;U+1D7CA&lt;/td&gt;
      &lt;td&gt;MATHEMATICAL BOLD CAPITAL DIGAMMA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤀&lt;/td&gt;
      &lt;td&gt;U+1E900&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER ALIF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤁&lt;/td&gt;
      &lt;td&gt;U+1E901&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER DAALI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤂&lt;/td&gt;
      &lt;td&gt;U+1E902&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER LAAM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤃&lt;/td&gt;
      &lt;td&gt;U+1E903&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER MIIM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤄&lt;/td&gt;
      &lt;td&gt;U+1E904&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER BA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤅&lt;/td&gt;
      &lt;td&gt;U+1E905&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER SINNYIIYHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤆&lt;/td&gt;
      &lt;td&gt;U+1E906&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER PE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤇&lt;/td&gt;
      &lt;td&gt;U+1E907&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER BHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤈&lt;/td&gt;
      &lt;td&gt;U+1E908&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER RA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤉&lt;/td&gt;
      &lt;td&gt;U+1E909&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤊&lt;/td&gt;
      &lt;td&gt;U+1E90A&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER FA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤋&lt;/td&gt;
      &lt;td&gt;U+1E90B&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤌&lt;/td&gt;
      &lt;td&gt;U+1E90C&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤍&lt;/td&gt;
      &lt;td&gt;U+1E90D&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER DHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤎&lt;/td&gt;
      &lt;td&gt;U+1E90E&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER YHE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤏&lt;/td&gt;
      &lt;td&gt;U+1E90F&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER WAW&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤐&lt;/td&gt;
      &lt;td&gt;U+1E910&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER NUN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤑&lt;/td&gt;
      &lt;td&gt;U+1E911&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER KAF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤒&lt;/td&gt;
      &lt;td&gt;U+1E912&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER YA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤓&lt;/td&gt;
      &lt;td&gt;U+1E913&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤔&lt;/td&gt;
      &lt;td&gt;U+1E914&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER JIIM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤕&lt;/td&gt;
      &lt;td&gt;U+1E915&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER CHI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤖&lt;/td&gt;
      &lt;td&gt;U+1E916&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER HA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤗&lt;/td&gt;
      &lt;td&gt;U+1E917&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER QAAF&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤘&lt;/td&gt;
      &lt;td&gt;U+1E918&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER GA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤙&lt;/td&gt;
      &lt;td&gt;U+1E919&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER NYA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤚&lt;/td&gt;
      &lt;td&gt;U+1E91A&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER TU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤛&lt;/td&gt;
      &lt;td&gt;U+1E91B&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER NHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤜&lt;/td&gt;
      &lt;td&gt;U+1E91C&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER VA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤝&lt;/td&gt;
      &lt;td&gt;U+1E91D&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER KHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤞&lt;/td&gt;
      &lt;td&gt;U+1E91E&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER GBE&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤟&lt;/td&gt;
      &lt;td&gt;U+1E91F&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER ZAL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤠&lt;/td&gt;
      &lt;td&gt;U+1E920&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER KPO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;𞤡&lt;/td&gt;
      &lt;td&gt;U+1E921&lt;/td&gt;
      &lt;td&gt;ADLAM CAPITAL LETTER SHA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄰&lt;/td&gt;
      &lt;td&gt;U+1F130&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄱&lt;/td&gt;
      &lt;td&gt;U+1F131&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄲&lt;/td&gt;
      &lt;td&gt;U+1F132&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄳&lt;/td&gt;
      &lt;td&gt;U+1F133&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄴&lt;/td&gt;
      &lt;td&gt;U+1F134&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄵&lt;/td&gt;
      &lt;td&gt;U+1F135&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄶&lt;/td&gt;
      &lt;td&gt;U+1F136&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄷&lt;/td&gt;
      &lt;td&gt;U+1F137&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄸&lt;/td&gt;
      &lt;td&gt;U+1F138&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄹&lt;/td&gt;
      &lt;td&gt;U+1F139&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄺&lt;/td&gt;
      &lt;td&gt;U+1F13A&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄻&lt;/td&gt;
      &lt;td&gt;U+1F13B&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄼&lt;/td&gt;
      &lt;td&gt;U+1F13C&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄽&lt;/td&gt;
      &lt;td&gt;U+1F13D&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄾&lt;/td&gt;
      &lt;td&gt;U+1F13E&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🄿&lt;/td&gt;
      &lt;td&gt;U+1F13F&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅀&lt;/td&gt;
      &lt;td&gt;U+1F140&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅁&lt;/td&gt;
      &lt;td&gt;U+1F141&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅂&lt;/td&gt;
      &lt;td&gt;U+1F142&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅃&lt;/td&gt;
      &lt;td&gt;U+1F143&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅄&lt;/td&gt;
      &lt;td&gt;U+1F144&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅅&lt;/td&gt;
      &lt;td&gt;U+1F145&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅆&lt;/td&gt;
      &lt;td&gt;U+1F146&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅇&lt;/td&gt;
      &lt;td&gt;U+1F147&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅈&lt;/td&gt;
      &lt;td&gt;U+1F148&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅉&lt;/td&gt;
      &lt;td&gt;U+1F149&lt;/td&gt;
      &lt;td&gt;SQUARED LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅐&lt;/td&gt;
      &lt;td&gt;U+1F150&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅑&lt;/td&gt;
      &lt;td&gt;U+1F151&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅒&lt;/td&gt;
      &lt;td&gt;U+1F152&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅓&lt;/td&gt;
      &lt;td&gt;U+1F153&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅔&lt;/td&gt;
      &lt;td&gt;U+1F154&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅕&lt;/td&gt;
      &lt;td&gt;U+1F155&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅖&lt;/td&gt;
      &lt;td&gt;U+1F156&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅗&lt;/td&gt;
      &lt;td&gt;U+1F157&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅘&lt;/td&gt;
      &lt;td&gt;U+1F158&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅙&lt;/td&gt;
      &lt;td&gt;U+1F159&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅚&lt;/td&gt;
      &lt;td&gt;U+1F15A&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅛&lt;/td&gt;
      &lt;td&gt;U+1F15B&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅜&lt;/td&gt;
      &lt;td&gt;U+1F15C&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅝&lt;/td&gt;
      &lt;td&gt;U+1F15D&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅞&lt;/td&gt;
      &lt;td&gt;U+1F15E&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅟&lt;/td&gt;
      &lt;td&gt;U+1F15F&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅠&lt;/td&gt;
      &lt;td&gt;U+1F160&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅡&lt;/td&gt;
      &lt;td&gt;U+1F161&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅢&lt;/td&gt;
      &lt;td&gt;U+1F162&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅣&lt;/td&gt;
      &lt;td&gt;U+1F163&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅤&lt;/td&gt;
      &lt;td&gt;U+1F164&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅥&lt;/td&gt;
      &lt;td&gt;U+1F165&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅦&lt;/td&gt;
      &lt;td&gt;U+1F166&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅧&lt;/td&gt;
      &lt;td&gt;U+1F167&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅨&lt;/td&gt;
      &lt;td&gt;U+1F168&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅩&lt;/td&gt;
      &lt;td&gt;U+1F169&lt;/td&gt;
      &lt;td&gt;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅰&lt;/td&gt;
      &lt;td&gt;U+1F170&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅱&lt;/td&gt;
      &lt;td&gt;U+1F171&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER B&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅲&lt;/td&gt;
      &lt;td&gt;U+1F172&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER C&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅳&lt;/td&gt;
      &lt;td&gt;U+1F173&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER D&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅴&lt;/td&gt;
      &lt;td&gt;U+1F174&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER E&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅵&lt;/td&gt;
      &lt;td&gt;U+1F175&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅶&lt;/td&gt;
      &lt;td&gt;U+1F176&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER G&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅷&lt;/td&gt;
      &lt;td&gt;U+1F177&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER H&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅸&lt;/td&gt;
      &lt;td&gt;U+1F178&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER I&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅹&lt;/td&gt;
      &lt;td&gt;U+1F179&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER J&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅺&lt;/td&gt;
      &lt;td&gt;U+1F17A&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER K&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅻&lt;/td&gt;
      &lt;td&gt;U+1F17B&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅼&lt;/td&gt;
      &lt;td&gt;U+1F17C&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅽&lt;/td&gt;
      &lt;td&gt;U+1F17D&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER N&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅾&lt;/td&gt;
      &lt;td&gt;U+1F17E&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER O&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🅿&lt;/td&gt;
      &lt;td&gt;U+1F17F&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER P&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆀&lt;/td&gt;
      &lt;td&gt;U+1F180&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER Q&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆁&lt;/td&gt;
      &lt;td&gt;U+1F181&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆂&lt;/td&gt;
      &lt;td&gt;U+1F182&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER S&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆃&lt;/td&gt;
      &lt;td&gt;U+1F183&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER T&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆄&lt;/td&gt;
      &lt;td&gt;U+1F184&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER U&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆅&lt;/td&gt;
      &lt;td&gt;U+1F185&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆆&lt;/td&gt;
      &lt;td&gt;U+1F186&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER W&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆇&lt;/td&gt;
      &lt;td&gt;U+1F187&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER X&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆈&lt;/td&gt;
      &lt;td&gt;U+1F188&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER Y&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🆉&lt;/td&gt;
      &lt;td&gt;U+1F189&lt;/td&gt;
      &lt;td&gt;NEGATIVE SQUARED LATIN CAPITAL LETTER Z&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/commit/f852af0e59899157ef695edccbe86d51fc04d23b#diff-0cd054d23ed9e02274eaa540fc7e6536"&gt;The Ruby patch which introduced this feature&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/uniscribe"&gt;uniscribe: Utility for Unicode codepoint analysis (used in the examples)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Nothing to Disable</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/71-nothing-to-disable.html"/>
    <id>https://idiosyncratic-ruby.com/71-nothing-to-disable.html</id>
    <published>2020-08-11T00:00:00Z</published>
    <updated>2020-08-11T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's mode of operation can be altered with some &lt;code&gt;--enable-*&lt;/code&gt; / &lt;code&gt;--disable-*&lt;/code&gt; command-line switches.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;By default, all of the following &lt;strong&gt;features&lt;/strong&gt; are activated, except for the frozen strings and the JIT:&lt;/p&gt;

&lt;table class="table-20-35-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Feature&lt;/th&gt;
      &lt;th&gt;CLI Option to Change&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://rubygems.org"&gt;RubyGems&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--disable-gems&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;RubyGems is the package manager of Ruby, which is required to load 3rd party Ruby libraries¹.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBYOPT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--disable-rubyopt&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The RUBYOPT ENV variable lets you define default CLI options for Ruby. This switch tells Ruby to ignore RUBYOPT.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://stdgems.org/did_you_mean"&gt;DidYouMean&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--disable-did-you-mean&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;Improves error messages by suggesting auto-corrected method or module names&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Frozen strings&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--enable-frozen-string-literal&lt;/code&gt;³&lt;/td&gt;
      &lt;td&gt;Freezes all string literals everywhere.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Just-in-time compiler&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--enable-jit&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Shortcut to enable is just &lt;code&gt;--jit&lt;/code&gt;. New compiler architecture, introduced with Ruby 2.6. See &lt;a href="https://medium.com/@k0kubun/jit-development-progress-at-ruby-2-7-d6dd62a8c76a"&gt;@k0kubun's blog&lt;/a&gt; for more details.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;All of the above&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--disable-all&lt;/code&gt; / &lt;code&gt;--enable-all&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ &lt;code&gt;--disable-gems&lt;/code&gt; will also prevent &lt;strong&gt;did_you_mean&lt;/strong&gt; from loading, because it is a &lt;a href="https://stdgems.org"&gt;standard gem&lt;/a&gt;&lt;br /&gt;
² Variants: &lt;code&gt;--disable-did_you_mean&lt;/code&gt;, &lt;code&gt;--disable-did-you_&lt;/code&gt;, &lt;code&gt;--disable-did&lt;/code&gt;, &lt;code&gt;--disable-d&lt;/code&gt; …&lt;br /&gt;
³ Variants: &lt;code&gt;--enable-frozen_string_literal&lt;/code&gt;, &lt;code&gt;--enable-frozen_str&lt;/code&gt;, &lt;code&gt;--enable-frozen&lt;/code&gt;, …&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/58-magic-instructions.html"&gt;Episode 58: Magic Instructions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/53-the-constant-tree.html"&gt;Episode 53: The Constant Tree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/43-new-ruby-startup.html"&gt;Episode 43: New Ruby Startup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Nothing to Escape</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/70-nothing-to-escape.html"/>
    <id>https://idiosyncratic-ruby.com/70-nothing-to-escape.html</id>
    <published>2020-08-10T00:00:00Z</published>
    <updated>2020-08-10T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;What is your wild guess: How many different ways does Ruby provide for inserting a &lt;strong&gt;NULL&lt;/strong&gt; byte into a double-quoted string?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;There are exactly &lt;strong&gt;43&lt;/strong&gt; options¹! Here is the list, put together with some ideas from &lt;a href="/61-meta-escape-control.html"&gt;Episode 61: Meta Escape Control&lt;/a&gt;:&lt;/p&gt;

&lt;table class="table-huge-font"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Directly embedded NULL byte&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\x00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\x0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u0000"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{0000}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{000}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{00}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{0}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{00000}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\u{000000}"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\000"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\x00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\x0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\000"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-@"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\x40"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\100"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-`"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\x60"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\140"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C- "&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\s"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\x20"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\C-\40"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\x00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\x0"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\000"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\00"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c@"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\x40"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\100"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c`"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\x60"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\140"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c "&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\s"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\x20"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;"\c\40"&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;# =&amp;gt; "\u0000"&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ And this is just in the context of double-width strings without interpolation: Another fun NULL byte is &lt;code&gt;0.chr&lt;/code&gt;, &lt;a href="https://github.com/janlelis/idiosyncratic-ruby.com/commit/0698caf6b5b0c67404d664eed10f68e58002bcf8#commitcomment-41344279"&gt;as noted by @cremno&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/61-meta-escape-control.html"&gt;Meta Escape Control&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/15-207-ways-to-rome.html"&gt;210 Ways to Rome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Nothing to Compare</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/69-nothing-to-compare.html"/>
    <id>https://idiosyncratic-ruby.com/69-nothing-to-compare.html</id>
    <published>2020-08-06T00:00:00Z</published>
    <updated>2020-08-06T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;How does nothing (as in &lt;em&gt;nil&lt;/em&gt;, &lt;em&gt;null&lt;/em&gt;, or &lt;em&gt;nan&lt;/em&gt;) compare to nothing?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="equality-equality"&gt;Equality Equality&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;==&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;NaN&lt;/code&gt;¹&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Get a reference to &lt;code&gt;NaN&lt;/code&gt; via &lt;code&gt;Float::NAN&lt;/code&gt; or by executing &lt;code&gt;0.0/0&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="take-aways"&gt;Take Aways&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;0&lt;/code&gt; == &lt;code&gt;0.0&lt;/code&gt; == &lt;code&gt;0i&lt;/code&gt; == &lt;code&gt;0r&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;NaN&lt;/code&gt; != &lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="fancy-equality"&gt;Fancy Equality&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;===&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="take-away"&gt;Take Away&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Same as &lt;code&gt;==&lt;/code&gt; for null values&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="hash-key-equality"&gt;Hash Key Equality&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;.eql?&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="take-away-1"&gt;Take Away&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Different types of &lt;code&gt;0&lt;/code&gt;s do not &lt;code&gt;.eql?&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="object-identity"&gt;Object Identity&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;.equal?&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0.0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;false&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="take-away-2"&gt;Take Away&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;NaN&lt;/code&gt; is the same Object as &lt;code&gt;NaN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/55-struggling-four-equality.html"&gt;Episode 55: Struggling Four Equality&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Assignments In-Style</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/68-assignments-in-style.html"/>
    <id>https://idiosyncratic-ruby.com/68-assignments-in-style.html</id>
    <published>2020-08-04T00:00:00Z</published>
    <updated>2020-08-04T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;The introduction of &lt;em&gt;pattern matching&lt;/em&gt; in Ruby 2.7 brought us a new style of multi-assigning local variables: The &lt;strong&gt;pattern assignment&lt;/strong&gt;, or, how you could also call it, the &lt;strong&gt;assignment in-style&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;After you have &lt;a href="/67-warning-the-experiment.html"&gt;deactivated the warnings for experimental features&lt;/a&gt;, try the following piece of code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[1, 2, 3, 4] in [first, second, *other]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Think:&lt;/strong&gt; Put &lt;code&gt;[1, 2, 3, 4]&lt;/code&gt; into &lt;code&gt;[first, second, *other]&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;first # =&amp;gt; 1
second # =&amp;gt; 2
other # =&amp;gt; [3,4]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is a great addition to the &lt;a href="/14-meeting-some-locals.html"&gt;previous two and a half ways of assigning local variables&lt;/a&gt;. Let's see some more examples, starting with the most basic one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0 in a # =&amp;gt; nil
a # =&amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When assigning multiple values, be sure to supply exactly the number of expected values:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cities = %w[Berlin Potsdam Magdeburg]
cities in [a,b] # NoMatchingPatternError
cities in [x,y,z]
x #=&amp;gt; Berlin
y #=&amp;gt; Potsdam
z #=&amp;gt; Magdeburg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If your array is of unknown length, use an asterisk, like in the introductory example.&lt;/p&gt;

&lt;p&gt;Pattern assignments also have type checks built in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cities = %w[Berlin Potsdam Magdeburg]
cities in [Integer =&amp;gt; c_1, *c_other] # NoMatchingPatternError
cities in [String =&amp;gt; c_1, *c_other]
c_other # =&amp;gt; ["Potsdam", "Magdeburg"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which, of course, also work for single assignments:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0 in Float =&amp;gt; a # NoMatchingPatternError
0 in Integer =&amp;gt; a
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since hashes are also supported, we can finally have JavaScript-like object destructuring¹:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  verb: "CREATE",
  endpoint: "/syntax",
  authed: true,
} in { verb:, endpoint: }

verb #=&amp;gt; "CREATE"
endpoint #=&amp;gt; "/syntax"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ Differently from arrays, there is no need to specify all hash keys of the given hash object&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/quiz/2020/january/#/1"&gt;More examples and info at the Idiosyncratic Ruby Quiz 2020&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7"&gt;Pattern matching explained by its author&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://rubyreferences.github.io/rubyref/language/pattern-matching.html"&gt;Pattern matching documented at the Ruby Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Warning: The Experiment</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/67-warning-the-experiment.html"/>
    <id>https://idiosyncratic-ruby.com/67-warning-the-experiment.html</id>
    <published>2020-08-03T00:00:00Z</published>
    <updated>2020-08-03T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's &lt;a href="https://ruby-doc.org/core/Warning.html"&gt;&lt;strong&gt;Warning&lt;/strong&gt; module&lt;/a&gt; learned some new tricks in Ruby 2.7:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Support for muting different categories of compile warnings has been introduced. This is a mechanism on top of the warning level reflected by the &lt;a href="/3-ruby-can-you-speak-louder.html#command-line-options-for-debug-modes"&gt;&lt;strong&gt;$VERBOSE&lt;/strong&gt; variable&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can now silence &lt;strong&gt;deprecation warnings:&lt;/strong&gt; These are aspects of the language which will be removed or changed in a future version of Ruby. One example is the infamous: &lt;code&gt;warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call&lt;/code&gt;. Since Ruby 3.0, deprecation warnings are &lt;em&gt;not shown&lt;/em&gt; by default, so you will need to explicitly turn them on.&lt;/p&gt;

&lt;p&gt;It is also possible to mute &lt;strong&gt;experimental features warnings:&lt;/strong&gt; These are new features of Ruby, which might not have a stable API yet, like the &lt;a href="/68-assignments-in-style.html"&gt;new pattern matching&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="per-ruby"&gt;Per Ruby&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;Warning[:experimental] = false
Warning[:deprecated] = true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="per-cli"&gt;Per CLI&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -W:no-experimental
$ ruby -W:deprecated
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="per-env-variable"&gt;Per ENV Variable&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ RUBYOPT="-W:no-experimental" ruby
$ RUBYOPT="-W:deprecated" ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/65-warning-the-module.html"&gt;Warning: The Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby has Character</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/66-ruby-has-character.html"/>
    <id>https://idiosyncratic-ruby.com/66-ruby-has-character.html</id>
    <published>2018-05-31T00:00:00Z</published>
    <updated>2018-05-31T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby comes with good support for Unicode-related features. Read on if you want to learn more about important Unicode fundamentals and how to use them in Ruby…&lt;/p&gt;

&lt;p&gt;…or just watch my talk from RubyConf 2017:&lt;br /&gt;
&lt;span style="font-size: 140%"&gt;
&lt;a href="https://www.youtube.com/watch?v=hlryzsdGtZo"&gt;⑩ Unicode Characters You Should Know About as a 👩‍💻&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="ruby--unicode"&gt;Ruby ♡ Unicode&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="#characters-in-unicode"&gt;Characters in Unicode&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="#codepoints--encodings"&gt;Codepoints &amp;amp; Encodings&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#grapheme-clusters"&gt;Grapheme Clusters&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="#normalization"&gt;Normalization&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="#special-case-visual-confusable-characters"&gt;Confusables&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="#case-mapping"&gt;Case-Mapping&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="#special-case-case-folding"&gt;Case-Folding&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="#regex-unicode-property-matching"&gt;Regex Unicode Properties&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="#special-case-emoji-matching"&gt;Emoji Regex&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="#monospace-display-width"&gt;Monospace Display Width&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#unicode-special-codepoints"&gt;Unicode Special Codepoints&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="#invalid-codepoints"&gt;Invalid Codepoints&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#unstandardized-codepoints"&gt;Unstandardized Codepoints&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#control-characters"&gt;Control Characters&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#ignorable-codepoints"&gt;Ignorable Codepoints&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="#cli-tools-for-codepoint-analysis"&gt;CLI Tools for Codepoint Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;script src="/javascripts/d3.v4.min.js"&gt;&lt;/script&gt;

&lt;script&gt;
  var dataCodepointsAssignment = {
    "name": "Codepoints",
    "children": [
      { "name": "Reserved", "size": 837775 },
      { "name": "Assigned",
        "children": [
          { "name": "Standardized", "size": 138869 },
          { "name": "Private Use", "size": 137468 }
        ]
      }
    ]
  }

  window.renderDiagram = function(data, domId){
    var svg = d3.select("#" + domId),
        width = +svg.attr("width"),
        height = +svg.attr("height");

    var fader = function(color) { return d3.interpolateRgb(color, "#fff")(0.2); },
        color = d3.scaleOrdinal(d3.schemeCategory20.map(fader)),
        format = d3.format(",d");

    var treemap = d3.treemap()
        .tile(d3.treemapResquarify)
        .size([width, height])
        .round(true)
        .paddingInner(6);

      var root = d3.hierarchy(data)
          .eachBefore(function(d) { d.data.id = (d.parent ? d.parent.data.id + "." : "") + d.data.name; })
          .sum(sumBySize)
          .sort(function(b, a) { return b.height - a.height || b.value - a.value; });

      treemap(root);

      var cell = svg.selectAll("g")
        .data(root.leaves())
        .enter().append("g")
          .attr("transform", function(d) { return "translate(" + d.x0 + "," + d.y0 + ")"; });

      cell.append("rect")
          .attr("id", function(d) { return d.data.id; })
          .attr("width", function(d) { return d.x1 - d.x0; })
          .attr("height", function(d) { return d.y1 - d.y0; })
          .attr("fill", function(d) { return color(d.parent.data.id); });

      cell.append("text")
          .attr("clip-path", function(d) { return "url(#clip-" + d.data.id + ")"; })
        .selectAll("tspan")
          .data(function(d) { return [d.data.name, d.data.size] })
        .enter().append("tspan")
          .attr("x", 8)
          .attr("y", function(d, i) { return 30 + i * 30; })
          .text(function(d) { return d; });

    function sumBySize(d) {
      return d.size;
    }
  }
&lt;/script&gt;

&lt;h2 id="characters-in-unicode"&gt;Characters in Unicode&lt;/h2&gt;

&lt;p&gt;Unicode has come a long way and is now available in version 13.0 (&lt;a href="https://www.unicode.org/versions/Unicode13.0.0/UnicodeStandard-13.0.pdf"&gt;core specification&lt;/a&gt;). The standard defines a lot of things related to characters, however, it is not always easy to grasp what a &lt;em&gt;character&lt;/em&gt; actually is. Is &lt;em&gt;Ǆ&lt;/em&gt; a single character or not? What about non-Latin languages?&lt;/p&gt;

&lt;p&gt;We will need some more fine-grained concepts to distinguish and talk about characters in Unicode:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Codepoint:&lt;/em&gt;&lt;/strong&gt; A base unit to construct &lt;em&gt;characters&lt;/em&gt; from. Often this maps directly to a single &lt;em&gt;character&lt;/em&gt;. Depending on the encoding, a codepoint might require multiple bytes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Grapheme cluster:&lt;/em&gt;&lt;/strong&gt; Smallest linguistic unit, a user-perceived &lt;em&gt;character&lt;/em&gt;, constructed out of one or multiple codepoints.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Glyph:&lt;/em&gt;&lt;/strong&gt; The actual rendered shape which represents the grapheme cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="codepoints--encodings"&gt;Codepoints &amp;amp; Encodings&lt;/h3&gt;

&lt;p&gt;Codepoints are the base unit of Unicode: It is a number mapped to some meaning. Often this resolves to a single character:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u{41}" # =&amp;gt; "A"
"\u{ABCD}" # =&amp;gt; "ꯍ"
"\u{1F6A1}" # =&amp;gt; "🚡"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are 1114112 (in hexadecimal: 0x110000) different codepoints. On byte-level, a codepoint can be represented in different ways, which depends on the &lt;em&gt;encoding&lt;/em&gt; used. Popular encodings for Unicode are &lt;strong&gt;&lt;em&gt;UTF-8&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;UTF-16&lt;/em&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;em&gt;UTF-32&lt;/em&gt;&lt;/strong&gt;, which all have different mechanisms of representing codepoints:&lt;/p&gt;

&lt;table class="table-15-15-10-20-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Decimal&lt;/th&gt;
      &lt;th&gt;Glyph&lt;/th&gt;
      &lt;th&gt;Bytes UTF-8&lt;/th&gt;
      &lt;th&gt;Bytes UTF-16LE&lt;/th&gt;
      &lt;th&gt;Bytes UTF-32LE&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0041&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;65&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;41&lt;/td&gt;
      &lt;td&gt;41 00&lt;/td&gt;
      &lt;td&gt;41 00 00 00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+ABCD&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;43981&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;ꯍ&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;EA AF 8D&lt;/td&gt;
      &lt;td&gt;CD AB&lt;/td&gt;
      &lt;td&gt;CD AB 00 00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+1F6A1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;128673&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;🚡&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;F0 9F 9A A1&lt;/td&gt;
      &lt;td&gt;3D D8 A1 DE&lt;/td&gt;
      &lt;td&gt;A1 F6 01 00&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Here is an overview, without going into too much detail:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;UTF-8&lt;/em&gt;&lt;/strong&gt; uses a dynamic number of bytes: While &lt;a href="/56-us-ascii-8bit.html"&gt;ASCII characters&lt;/a&gt; fit into a single byte, it can use up to 4 bytes for higher codepoints.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;UTF-16&lt;/em&gt;&lt;/strong&gt; uses 2 bytes, if possible, but has a 4 byte mechanism to represent higher codepoints.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;UTF-32&lt;/em&gt;&lt;/strong&gt; is a direct representation of the codepoint and always uses 4 bytes, no logic is involved. It is also a little lavish, because even the largest codepoint &lt;strong&gt;U+10FFFF&lt;/strong&gt; only uses 21 bit of information. As a consequence the last byte is always &lt;code&gt;00&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can visualize and learn about encodings on the command-line with the &lt;a href="https://github.com/janlelis/unibits/"&gt;unibits CLI utility&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rest of this blog post will not deal with encodings and byte representations, but use codepoints as the smallest unit.&lt;/p&gt;

&lt;h3 id="grapheme-clusters"&gt;Grapheme Clusters&lt;/h3&gt;

&lt;p&gt;A user-perceived character might be constructed out of multiple codepoints. There are a lot of &lt;em&gt;enclosing characters&lt;/em&gt; (like &lt;a href="https://en.wikipedia.org/wiki/Diacritic"&gt;diacritics&lt;/a&gt;) which get combined with the previous character to form a new one:&lt;/p&gt;

&lt;p&gt;"Ä" = &lt;strong&gt;U+0041&lt;/strong&gt; "A" + &lt;strong&gt;U+0308&lt;/strong&gt; "◌̈"&lt;/p&gt;

&lt;p&gt;An example from the Thai language:&lt;/p&gt;

&lt;p&gt;"กำ" = &lt;strong&gt;U+0E01&lt;/strong&gt; "ก" + &lt;strong&gt;U+0E33&lt;/strong&gt; " ำ"&lt;/p&gt;

&lt;p&gt;Emoji are another example of grapheme clusters that require multiple codepoints:&lt;/p&gt;

&lt;p&gt;"👨🏻‍🍳"¹ = &lt;strong&gt;U+1F468&lt;/strong&gt; "👨" + &lt;strong&gt;U+1F3FB&lt;/strong&gt; "🏻" + &lt;strong&gt;U+0200D&lt;/strong&gt; "‍" + &lt;strong&gt;U+1F373&lt;/strong&gt; "🍳"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bugs.ruby-lang.org/issues/13780"&gt;Ruby 2.5 introduced a convenient way&lt;/a&gt; to iterate through all grapheme clusters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"abกำcd".grapheme_clusters # =&amp;gt; ["a", "b", "กำ", "c", "d"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is also &lt;code&gt;/\X/&lt;/code&gt;², a regex feature that you can use instead of the default &lt;code&gt;/./&lt;/code&gt; to match for grapheme clusters instead of codepoints:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"abกำcd".scan(/./) # =&amp;gt; ["a", "b", "ก", "ำ", "c", "d"]
"abกำcd".scan(/\X/) # =&amp;gt; ["a", "b", "กำ", "c", "d"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ Depending on the recentness of your rendering software, this is displayed as a single male cook&lt;br /&gt;
² This regex matcher was already introduced in earlier versions of Ruby&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr29/"&gt;Unicode® Standard Annex #29: Unicode Text Segmentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-i-each_grapheme_cluster"&gt;RDoc: Grapheme clusters&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/k-takata/Onigmo/blob/b8c3321cfdd5638c136ecff1fd139de24616a6aa/doc/RE#L117-L124"&gt;Onigmo documentation: &lt;code&gt;\X&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="normalization"&gt;Normalization&lt;/h2&gt;

&lt;p&gt;&lt;img src="images/keyboard.jpg" style="border: 1px solid #555; filter: grayscale(60%);" /&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, the Unicode standard defines multiple ways to describe the same (or a very similar) glyph. Let us revisit the example from above: the German letter "Ä", which is a "A" with two dots above. It is defined as codepoint &lt;strong&gt;U+00C4&lt;/strong&gt;. At the same time, there is a mechanism to put two dots above just any letter using the &lt;em&gt;combining codepoint&lt;/em&gt; &lt;strong&gt;U+0308&lt;/strong&gt;. Combine it with "A" and you get "Ä" - A different representation, although semantically, it is the same character.&lt;/p&gt;

&lt;p&gt;However, sometimes you need one canonical representation of a string. This is why the Unicode consortium came up with a normalization algorithm. It is &lt;a href="https://stdgems.org/libraries/"&gt;included in Ruby's standard library&lt;/a&gt; and required automatically. There are several types of normalization forms:&lt;/p&gt;

&lt;table class="table-10-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Form&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;&lt;em&gt;NFC&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Default. The &lt;strong&gt;&lt;em&gt;C&lt;/em&gt;&lt;/strong&gt; stands for &lt;em&gt;composed&lt;/em&gt;, it uses the composed format for graphemes (if available).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;&lt;em&gt;NFD&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The &lt;strong&gt;&lt;em&gt;D&lt;/em&gt;&lt;/strong&gt; stands for &lt;em&gt;decomposed&lt;/em&gt;, it uses separate codepoints for such graphemes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;&lt;em&gt;NFKC&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Like &lt;strong&gt;&lt;em&gt;NFC&lt;/em&gt;&lt;/strong&gt;, but uses compatibility mode, instead of canonical mode&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;&lt;em&gt;NFKD&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Like &lt;strong&gt;&lt;em&gt;NFD&lt;/em&gt;&lt;/strong&gt;, but uses compatibility mode, instead of canonical mode&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;NFC&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+00C4"]
"Ä".unicode_normalize.codepoints.map{|c| "U+%04X"%c }
# =&amp;gt; ["U+00C4"]

"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+0308"]
"Ä".unicode_normalize.codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+00C4"]

"A²".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+00B2"]
"A²".unicode_normalize.codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt;  ["U+0041", "U+00B2"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;NFD&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+00C4"]
"Ä".unicode_normalize(:nfd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+0041", "U+0308"]

"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+0308"]
"Ä".unicode_normalize(:nfd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+0041", "U+0308"]

"A²".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+00B2"]
"A²".unicode_normalize(:nfd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt;  ["U+0041", "U+00B2"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;NFKC&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+00C4"]
"Ä".unicode_normalize(:nfkc).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+00C4"]

"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+0308"]
"Ä".unicode_normalize(:nfkc).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+00C4"]

"A²".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+00B2"]
"A²".unicode_normalize(:nfkc).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt;  ["U+0041", "U+0032"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;NFKD&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+00C4"]
"Ä".unicode_normalize(:nfkd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+0041", "U+0308"]

"Ä".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+0308"]
"Ä".unicode_normalize(:nfkd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt; ["U+0041", "U+0308"]

"A²".codepoints.map{ |c| "U+%04X"%c } # =&amp;gt; ["U+0041", "U+00B2"]
"A²".unicode_normalize(:nfkd).codepoints.map{ |c| "U+%04X"%c }
# =&amp;gt;  ["U+0041", "U+0032"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the standard and documentation for more details, including the differences between the normalization forms:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://unicode.org/reports/tr15/"&gt;Unicode® Standard Annex #15: Unicode Normalization Forms&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core-2.5.1/String.html#method-i-unicode_normalize"&gt;RDoc: unicode_normalize&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Unicode_equivalence"&gt;Wikipedia: Unicode equivalence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="special-case-visual-confusable-characters"&gt;Special Case: Visual Confusable Characters&lt;/h3&gt;

&lt;p&gt;Even in normalization form, there are characters which look very similar (sometimes even identical):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Codepoints A&lt;/th&gt;
      &lt;th&gt;String A&lt;/th&gt;
      &lt;th&gt;String B&lt;/th&gt;
      &lt;th&gt;Codepoints B&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+003F&lt;/strong&gt; + &lt;strong&gt;U+003F&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;??&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;⁇&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;U+2047&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0043&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;С&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;U+0421&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0031&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;U+006C&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The record holder is &lt;strong&gt;LATIN SMALL LETTER O&lt;/strong&gt; which is currently linked to 75 other characters that it could be confused with:&lt;/p&gt;

&lt;div style="font-size: 130%; margin-bottom: 1em"&gt;
ం ಂ ം ං ० ੦ ૦ ௦ ౦ ೦ ൦ ๐ ໐ ၀ ‎٥‎ ۵ ｏ ℴ 𝐨 𝑜 𝒐
𝓸 𝔬 𝕠 𝖔 𝗈 𝗼 𝘰 𝙤 𝚘 ᴏ ᴑ ꬽ ο 𝛐 𝜊 𝝄 𝝾 𝞸 σ 𝛔 𝜎 𝝈 𝞂 𝞼
ⲟ о ჿ օ ‎ס‎ ‎ه‎ ‎𞸤‎ ‎𞹤‎ ‎𞺄‎ ‎ﻫ‎ ‎ﻬ‎ ﻪ‎ ‎ﻩ‎ ‎ھ‎ ‎ﮬ‎ ‎ﮭ‎ ‎ﮫ‎ ‎ﮪ‎ ‎ہ‎ ‎ﮨ‎ ‎ﮩ‎ ‎ﮧ‎ ‎ﮦ‎
‎ە‎ ഠ ဝ 𐓪 𑣈 𑣗 𐐬
&lt;/div&gt;

&lt;p&gt;Detecting confusable characters is not built-in, it is possible with some gem support from &lt;strong&gt;unicode-confusable&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "unicode/confusable"
Unicode::Confusable.confusable? "ℜ𝘂ᖯʏ", "Ruby" # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://unicode.org/reports/tr39/"&gt;Unicode® Technical Standard #39: Unicode Security Mechanisms&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-confusable"&gt;Gem: unicode-confusable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="case-mapping"&gt;Case-Mapping&lt;/h2&gt;

&lt;p&gt;Another Unicode topic is converting a word from lowercase to uppercase or vice versa. Up until Ruby 2.3, string methods like &lt;code&gt;#upcase&lt;/code&gt;,&lt;code&gt;#capitalize&lt;/code&gt;, &lt;code&gt;#downcase&lt;/code&gt;, or &lt;code&gt;#swapcase&lt;/code&gt; would just not work with non-ASCII characters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ä".upcase # =&amp;gt; "ä" # Ruby 2.3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This has been fixed and more recent versions of Ruby are able to do this out of the box:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ä".upcase # =&amp;gt; "Ä"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The old, ASCII-only behavior can be achieved by passing the &lt;code&gt;:ascii&lt;/code&gt; option:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ä".upcase(:ascii) # =&amp;gt; "ä"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is already much better than before, however, keep in mind that &lt;strong&gt;case-mapping is a locale-dependent operation!&lt;/strong&gt; Not all languages use the same rules for converting between lower- and uppercase. For example, in most languages, the uppercase version of letter &lt;strong&gt;i&lt;/strong&gt; is &lt;strong&gt;I&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"i".upcase # =&amp;gt; "I"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, in Turkic languages, it's the letter &lt;code&gt;İ&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"i".upcase(:turkic) # =&amp;gt; "İ"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Although Ruby supports special local case mapping rules, as of Ruby 2.5.1, only &lt;code&gt;:turkic&lt;/code&gt; is supported. More options might be supported in the future.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://unicode.org/reports/tr44/#Casemapping"&gt;Unicode® Standard Annex #44: Unicode Character Database / Section 5.6&lt;/a&gt; (overview, see the respective sections in the &lt;a href="https://www.unicode.org/versions/Unicode10.0.0/UnicodeStandard-10.0.pdf"&gt;Unicode standard&lt;/a&gt; itself)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-i-downcase"&gt;RDoc: String#downcase&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="special-case-case-folding"&gt;Special Case: Case-Folding&lt;/h3&gt;

&lt;p&gt;There is another special option that you can pass to the &lt;code&gt;String#downcase&lt;/code&gt; method: The &lt;code&gt;:fold&lt;/code&gt; symbol. It will turn on case-folding, which should be used instead of the default case-mapping behavior if you are interested in comparing/ordering strings. The case-folding algorithm might produce a different output than the case-mapping one. Fer example, the German letter &lt;em&gt;sharp s&lt;/em&gt; should be treated like two normal &lt;em&gt;s&lt;/em&gt; letters in comparisons:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ẞ".downcase # =&amp;gt; "ß"
"ẞ".downcase(:fold) # =&amp;gt; "ss"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is another String method in Ruby core which makes use of case-folding: &lt;a href="https://ruby-doc.org/core/String.html#method-i-casecmp-3F"&gt;String#casecmp?&lt;/a&gt;¹ which compares two strings ignoring their case:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; "A".casecmp? "a" # =&amp;gt; true
 "ẞ".casecmp? "ss" # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ You should pay attention that its sister method &lt;a href="https://ruby-doc.org/core/String.html#method-i-casecmp"&gt;String#casecmp&lt;/a&gt; only uses ASCII, despite the similar naming.&lt;/p&gt;

&lt;h2 id="regex-unicode-property-matching"&gt;Regex Unicode Property Matching&lt;/h2&gt;

&lt;p&gt;Ruby's regex engine supports matching of Unicode characteristics, like a characters general purpose (&lt;em&gt;general category&lt;/em&gt;), its script, or in which codepoint range it is defined (&lt;em&gt;block&lt;/em&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String, with: punctuation.".scan(/\p{P}/) # =&amp;gt; [",", ":", "."]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See my previous articles for more details:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/41-proper-unicoding.html"&gt;Episode 41: Proper Unicoding&lt;/a&gt; - More about the Unicode property syntax&lt;/li&gt;
  &lt;li&gt;&lt;a href="/30-regex-with-class.html"&gt;Episode 30: Regex with Class&lt;/a&gt; - Unicode behavior of regex matchers &amp;amp; POSIX-style character classes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="special-case-emoji-matching"&gt;Special Case: Emoji Matching&lt;/h3&gt;

&lt;p&gt;Detecting emoji is especially complicated, because there are multiple mechanisms to build up the final emoji glyph. You can use the &lt;strong&gt;unicode-emoji&lt;/strong&gt; gem to find all kinds of emoji:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "unicode/emoji"
"😴 🛌🏽 🇵🇹 🤾🏽‍♀️".scan(Unicode::Emoji::REGEX) # =&amp;gt; ["😴", "🛌🏽", "🇵🇹", "🤾🏽‍♀️"]
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr51/"&gt;Unicode® Technical Standard #51: Unicode Emoji&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-emoji"&gt;Gem: unicode-emoji&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="monospace-display-width"&gt;Monospace Display-Width&lt;/h2&gt;

&lt;p&gt;Sometimes, you might find yourself in a situation where you would like to know the width of a character. But this is not easily possible, because the character width is just not defined! This, of course, leads to problems in fixed-width environments like terminals.&lt;/p&gt;

&lt;p&gt;If you don't believe me, here are some wide characters for you to checkout:&lt;/p&gt;

&lt;table class="table-15-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Glyph&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+1242B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;𒐫&lt;/td&gt;
      &lt;td&gt;CUNEIFORM NUMERIC SIGN NINE SHAR2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+12219&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;𒈙&lt;/td&gt;
      &lt;td&gt;CUNEIFORM SIGN LUGAL OPPOSING LUGAL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+A9C4&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;꧄&lt;/td&gt;
      &lt;td&gt;JAVANESE PADA MADYA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+2E3B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;⸻&lt;/td&gt;
      &lt;td&gt;THREE-EM DASH&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+2031&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;‱&lt;/td&gt;
      &lt;td&gt;PER TEN THOUSAND SIGN&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;To complicate things further, some Asian characters are marked as &lt;em&gt;ambiguous&lt;/em&gt; and get displayed wide or narrow, depending on the software displaying them. The &lt;strong&gt;unicode-display_width&lt;/strong&gt; can help:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "unicode/display_width"

Unicode::DisplayWidth.of("⚀") # =&amp;gt; 1
Unicode::DisplayWidth.of("一") # =&amp;gt; 2

# Ambiguous example
Unicode::DisplayWidth.of("·", 1) # =&amp;gt; 1
Unicode::DisplayWidth.of("·", 2) # =&amp;gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr11/tr11-33.html"&gt;Unicode® Standard Annex #11: East Asian Width&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicode-display_width"&gt;Gem: unicode-display_width&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="unicode-special-codepoints"&gt;Unicode Special Codepoints&lt;/h2&gt;

&lt;p&gt;The last section will put the focus on four types of codepoints that require some attention. This is just a selection, there are many more notable codepoints and a good starting point to dig deeper is the &lt;a href="https://github.com/Codepoints/awesome-codepoints"&gt;Awesome Codepoints&lt;/a&gt; list!&lt;/p&gt;

&lt;h3 id="invalid-codepoints"&gt;Invalid Codepoints&lt;/h3&gt;

&lt;p&gt;There are two kinds of codepoints which are invalid. If you have these in your data, the data is invalid and &lt;a href="https://ruby-doc.org/core/String.html#method-i-valid_encoding-3F"&gt;String#valid_encoding?&lt;/a&gt; will return false. Both of them are encoding-related:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UTF-16 Surrogates&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The four byte mechanism that &lt;strong&gt;&lt;em&gt;UTF-16&lt;/em&gt;&lt;/strong&gt; uses to represent codepoints higher than &lt;strong&gt;U+FFFF&lt;/strong&gt; (= 65 535) needs auxiliary codepoints. These are &lt;strong&gt;U+D800..U+DFFF&lt;/strong&gt; and they are strictly forbidden in &lt;strong&gt;&lt;em&gt;UTF-8&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;UTF-32&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Too Large Codepoints&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Any codepoint above &lt;strong&gt;U+10FFFF&lt;/strong&gt; (= 1 114 111) is not allowed. The theoretical &lt;strong&gt;UTF-32&lt;/strong&gt; maximum is &lt;strong&gt;U+FFFFFFFF&lt;/strong&gt; (= 4 294 967 295) and four byte &lt;strong&gt;UTF-8&lt;/strong&gt; could represent codepoints upto &lt;strong&gt;U+1FFFFF&lt;/strong&gt; (= 2 097 151).&lt;/p&gt;

&lt;p&gt;Ruby does not let you create these from literals:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u{D800}" # =&amp;gt; SyntaxError: (irb):52: invalid Unicode codepoint
"\u{110000}" # =&amp;gt; SyntaxError: (irb):54: invalid Unicode codepoint (too large)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But, if you really need to…, you can &lt;a href="/4-what-the-pack.html"&gt;use Array#pack&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[0xD800].pack("U") # =&amp;gt; "\xED\xA0\x80"
[0x110000].pack("U") # =&amp;gt; "\xF4\x90\x80\x80"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ruby also includes a useful method that removes all invalid bytes, for example, surrogates:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"a\xED\xA0\x80b" # =&amp;gt; "a\xED\xA0\x80b"
"a\xED\xA0\x80b".scrub # =&amp;gt; "a���b"
"a\xED\xA0\x80b".scrub("") # =&amp;gt; "ab"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="unstandardized-codepoints"&gt;Unstandardized Codepoints&lt;/h3&gt;

&lt;p&gt;Another group of codepoints that require extra care are the unstandardized ones. When you look at the following diagram, you will see that a lot of codepoints actually do not have a meaning assigned by the consortium (yet):&lt;/p&gt;

&lt;h4 id="codepoint-distribution-as-of-unicode-10"&gt;Codepoint Distribution as of Unicode 10&lt;/h4&gt;

&lt;svg id="codepoints" style="margin-bottom: 1em; max-width: 100%" width="670" height="397" viewBox="0 0 670 397" preserveAspectRatio="none" onload="renderDiagram(dataCodepointsAssignment, 'codepoints')"&gt;&lt;/svg&gt;

&lt;h4 id="types-of-unstandardized-codepoints"&gt;Types of Unstandardized Codepoints&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Private-Use Codepoints:&lt;/strong&gt; Meant for custom allocations by anyone. You will find vendor logos here, for example, &lt;strong&gt;U+F8FF&lt;/strong&gt; for the Apple logo "" and &lt;strong&gt;U+F200&lt;/strong&gt; for the ubuntu logo "". Both may only display correctly on the respective operating system with a proper font). Other uses of the private plane include assigning codepoints to fantasy languages like &lt;a href="http://www.evertype.com/standards/csur/"&gt;Tengwar by J.R.R. Tolkien&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Non-Characters:&lt;/strong&gt; A handful of codepoints that will never be assigned. Different than invalid codepoints, they are allowed to be used in your data. But they have no meaning.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reserved Codepoints:&lt;/strong&gt; Will (or might) be assigned in a later version of Unicode&lt;/li&gt;
&lt;/ul&gt;

&lt;table class="table-15-15-30-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Count&lt;/th&gt;
      &lt;th&gt;Codepoints&lt;/th&gt;
      &lt;th&gt;Ruby Regex&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Private-Use&lt;/td&gt;
      &lt;td&gt;137 468¹&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;U+E000..U+F8FF&lt;/strong&gt;, &lt;strong&gt;U+F0000..U+FFFFD&lt;/strong&gt;, &lt;strong&gt;U+100000..U+10FFFD&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;/\p{private use}&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Non-Characters&lt;/td&gt;
      &lt;td&gt;66&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;U+FDD0..U+FDEF&lt;/strong&gt; and the last two codepoints of each plane: &lt;strong&gt;U+XFFFE&lt;/strong&gt;, &lt;strong&gt;U+XFFFF&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;/\p{nchar}/&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reserved&lt;/td&gt;
      &lt;td&gt;837 775&lt;/td&gt;
      &lt;td&gt;(not yet assigned)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;/\p{unassigned}(?&amp;lt;!\p{nchar})/&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Two additional private-use codepoints are &lt;strong&gt;U+0091&lt;/strong&gt; and &lt;strong&gt;U+0092&lt;/strong&gt;, but they are counted as control characters (see next section)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/faq/private_use.html"&gt;Unicode: Private-Use Characters, Noncharacters &amp;amp; Sentinels FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="control-characters"&gt;Control Characters&lt;/h3&gt;

&lt;p&gt;For historical reasons Unicode includes a set of 65 control codepoints. They were not defined by the Unicode Consortium and a lot of them are not universally standardized. However, some of them are extremely common, such as &lt;strong&gt;U+0009&lt;/strong&gt;, the &lt;a href="https://en.wikipedia.org/wiki/Tab_stop"&gt;tab-stop character&lt;/a&gt;. It also contains the newline characters &lt;strong&gt;U+0010&lt;/strong&gt; "\n" and &lt;strong&gt;U+0013&lt;/strong&gt; "\r"; depending on your operating system, use one or both of them for &lt;a href="https://en.wikipedia.org/wiki/Newline"&gt;a newline&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Control characters are divided into the two sections &lt;strong&gt;&lt;em&gt;C0&lt;/em&gt;&lt;/strong&gt;, covering &lt;strong&gt;U+0000..U+001F&lt;/strong&gt;, and &lt;strong&gt;&lt;em&gt;C1&lt;/em&gt;&lt;/strong&gt;, covering &lt;strong&gt;U+0080..U+009F&lt;/strong&gt;. Furthermore, the &lt;a href="https://en.wikipedia.org/wiki/Delete_character"&gt;delete character&lt;/a&gt; &lt;strong&gt;U+007F&lt;/strong&gt; ␡ is also considered to be a control character.&lt;/p&gt;

&lt;p&gt;In regexes, you can match for control characters with &lt;code&gt;\p{control}&lt;/code&gt; or just &lt;code&gt;\p{cc}&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id="list-of-c0-control-codepoints"&gt;List of C0 Control Codepoints&lt;/h4&gt;

&lt;table class="table-20-15-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Symbol&lt;/th&gt;
      &lt;th&gt;Ruby Escape&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0000&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␀ NUL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;NULL&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0001&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␁ SOH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;START OF HEADING&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0002&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␂ STX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{2}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;START OF TEXT&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0003&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␃ ETX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{3}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF TEXT&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0004&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␄ EOT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{4}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF TRANSMISSION&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0005&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␅ ENQ&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{5}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ENQUIRY&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0006&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␆ ACK&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{6}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ACKNOWLEDGE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0007&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␇ BEL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\a&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ALERT&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0008&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␈ BS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\b&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;BACKSPACE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0009&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␉ HT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CHARACTER TABULATION&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000A&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␊ LF&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\n&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;LINE FEED&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␋ VT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\v&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;LINE TABULATION&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000C&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␌ FF&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\f&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;FORM FEED&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000D&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␍ CR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CARRIAGE RETURN&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000E&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␎ SS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{e}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SHIFT OUT&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+000F&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␏ SI&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{f}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SHIFT IN&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0010&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␐ DLE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{10}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DATA LINK ESCAPE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0011&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␑ DC1&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{11}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DEVICE CONTROL ONE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0012&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␒ DC2&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{12}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DEVICE CONTROL TWO&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0013&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␓ DC3&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{13}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DEVICE CONTROL THREE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0014&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␔ DC4&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{14}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DEVICE CONTROL FOUR&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0015&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␕ NAK&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{15}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;NEGATIVE ACKNOWLEDGE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0016&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␖ SYN&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{16}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SYNCHRONOUS IDLE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0017&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␗ ETB&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{17}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF TRANSMISSION BLOCK&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0018&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␘ CAN&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{18}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CANCEL&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0019&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␙ EM&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{19}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF MEDIUM&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001A&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␚ SUB&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1a}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SUBSTITUTE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␛ ESC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\e&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ESCAPE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001C&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␜ FS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1c}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;INFORMATION SEPARATOR FOUR&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001D&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␝ GS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1d}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;INFORMATION SEPARATOR THREE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001E&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␞ RS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1e}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;INFORMATION SEPARATOR TWO&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+001F&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;␟ US&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{1f}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;INFORMATION SEPARATOR ONE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id="list-of-c1-control-codepoints"&gt;List of C1 Control Codepoints&lt;/h4&gt;

&lt;table class="table-20-15-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Codepoint&lt;/th&gt;
      &lt;th&gt;Symbol&lt;/th&gt;
      &lt;th&gt;Ruby Escape&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0080&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PAD&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{80}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PADDING CHARACTER&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0081&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;HOP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{81}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;HIGH OCTET PRESET&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0082&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;BPH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{82}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;BREAK PERMITTED HERE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0083&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;NBH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{83}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;NO BREAK HERE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0084&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;IND&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{84}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;INDEX&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0085&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;NEL¹&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{85}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;NEXT LINE&lt;/em&gt;¹&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0086&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SSA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{86}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;START OF SELECTED AREA&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0087&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;ESA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{87}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF SELECTED AREA&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0088&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;HTS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{88}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CHARACTER TABULATION SET&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0089&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;HTJ&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{89}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CHARACTER TABULATION WITH JUSTIFICATION&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008A&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;VTS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8a}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;LINE TABULATION SET&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PLD&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8b}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PARTIAL LINE FORWARD&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008C&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PLU&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8c}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PARTIAL LINE BACKWARD&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008D&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;RI&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8d}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;REVERSE LINE FEED&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008E&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SS2&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8e}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SINGLE SHIFT TWO&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+008F&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SS3&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{8f}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SINGLE SHIFT THREE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0090&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;DCS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{90}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;DEVICE CONTROL STRING&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0091&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PU1&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{91}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PRIVATE USE ONE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0092&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PU2&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{92}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PRIVATE USE TWO&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0093&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;STS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{93}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SET TRANSMIT STATE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0094&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;CCH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{94}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CANCEL CHARACTER&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0095&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;MW&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{95}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;MESSAGE WAITING&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0096&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SPA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{96}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;START OF GUARDED AREA&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0097&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;EPA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{97}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;END OF GUARDED AREA&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0098&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SOS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{98}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;START OF STRING&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+0099&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SGC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{99}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SINGLE GRAPHIC CHARACTER INTRODUCER&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009A&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SCI&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9a}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;SINGLE CHARACTER INTRODUCER&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009B&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;CSI&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9b}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;CONTROL SEQUENCE INTRODUCER&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009C&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;ST&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9c}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;STRING TERMINATOR&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009D&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;OSC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9d}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;OPERATING SYSTEM COMMAND&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009E&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;PM&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9e}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;PRIVACY MESSAGE&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;U+009F&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;APC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\u{9f}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;APPLICATION PROGRAM COMMAND&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ The &lt;em&gt;NEXT LINE&lt;/em&gt; control character was introduced to have an universal codepoint for &lt;a href="https://en.wikipedia.org/wiki/Newline"&gt;newlines&lt;/a&gt;. This goal was not reached. Still, on some systems (for example, my ubuntu machine), it will actually create a newline!&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;characteristics&lt;/strong&gt; gem lets you check if a codepoint belongs to a specific control group:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Characteristics.create("\u{80}").c0? # =&amp;gt; false
Characteristics.create("\u{80}").c1? # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/C0_and_C1_control_codes"&gt;Wikipedia has more info on every control codepoint&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/characteristics"&gt;Gem: characteristics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="ignorable-codepoints"&gt;Ignorable Codepoints&lt;/h3&gt;

&lt;p&gt;My last example of special codepoints are the so called ignorable codepoints. Their meaning varies, but most of them are invisible and they are often not treated as a whitespace by Unicode. They are ignorable in the sense that if your Unicode rendering engine does not know how to display it, it should &lt;em&gt;just display nothing&lt;/em&gt;. The ignorable property is even given to some ranges of &lt;em&gt;unassigned&lt;/em&gt; codepoints¹ (which is usually not done).&lt;/p&gt;

&lt;p&gt;You can check for ignorable codepoints using the &lt;code&gt;/\p{default ignorable code point}/&lt;/code&gt; (or its shorthand &lt;code&gt;\p{di}&lt;/code&gt;) regex.&lt;/p&gt;

&lt;p&gt;For example, the following piece of code is made out of &lt;a href="https://en.wikipedia.org/wiki/Tags_(Unicode_block)"&gt;tag characters&lt;/a&gt;, which resemble all &lt;a href="/56-us-ascii-8bit.html"&gt;ASCII characters&lt;/a&gt;, but as ignorable characters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;eval "󠁰󠁵󠁴󠁳󠀠󠀧󠁉󠁤󠁩󠁯󠁳󠁹󠁮󠁣󠁲󠁡󠁴󠁩󠁣󠀠󠁕󠁮󠁩󠁣󠁯󠁤󠁥󠀧".codepoints.map{ |c| c - 0xE0000 }.pack("U*")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This program will output &lt;code&gt;Idiosyncratic Unicode&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;¹ The whole range of &lt;strong&gt;E0000..E0FFF&lt;/strong&gt; is ignorable!&lt;/p&gt;

&lt;h2 id="cli-tools-for-codepoint-analysis"&gt;CLI Tools for Codepoint Analysis&lt;/h2&gt;

&lt;p&gt;I hope that you are now ready to closely inspect your own Unicode data! To help you do so, I made a few command-line tools, I hope you like them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/uniscribe"&gt;uniscribe&lt;/a&gt; for codepoint analysis&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unibits"&gt;unibits&lt;/a&gt; for encoding analysis, also supports a lot of non-Unicode encodings&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/unicopy"&gt;unicopy&lt;/a&gt; for converting &amp;amp; copying codepoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://character.construction"&gt;character.construction&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Warning: The Module</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/65-warning-the-module.html"/>
    <id>https://idiosyncratic-ruby.com/65-warning-the-module.html</id>
    <published>2018-05-15T00:00:00Z</published>
    <updated>2018-05-15T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Starting with Ruby 2.5¹ it is possible to customize the behavior of &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-warn"&gt;Kernel#warn&lt;/a&gt; through the &lt;a href="https://ruby-doc.org/core/Warning.html"&gt;&lt;strong&gt;Warning&lt;/strong&gt; module&lt;/a&gt;. Here is how:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def Warning.warn(w)
  # super calls the original behavior, which is printing to $stderr
  super "\e[31;1mRUBY WARNING: \e[22m#{w.sub(/warning: /, '')}\e[0m"
end

# # #
# examples

warn "test"
# =&amp;gt; RUBY WARNING: test

{ a: 1, a: 2 }
# =&amp;gt; RUBY WARNING: (irb):4: key :a is duplicated and overwritten on line 4

$VERBOSE = true # shows level 2 warnings
def a() end
def a() end
# =&amp;gt; RUBY WARNING: (irb):8: method redefined; discarding old a
# =&amp;gt; RUBY WARNING: (irb):6: previous definition of a was here
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can unlock some more &lt;strong&gt;warning&lt;/strong&gt; features by using &lt;a href="https://github.com/jeremyevans/ruby-warning/"&gt;Jeremy Evans' warning gem&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "warning"

Warning.ignore /duplicated and overwritten/
{ a: 1, a: 2 }
# =&amp;gt; nothing

$VERBOSE = true
Warning.ignore :method_redefined
def a() end
def a() end
# =&amp;gt; nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ Although the &lt;strong&gt;Warning&lt;/strong&gt; module existed in Ruby 2.4 already, &lt;strong&gt;Kernel#warn&lt;/strong&gt; did not make use of it yet&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/3-ruby-can-you-speak-louder.html#command-line-options-for-debug-modes"&gt;Ruby's verbosity and debug modes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>What the Regex?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/64-what-the-regex.html"/>
    <id>https://idiosyncratic-ruby.com/64-what-the-regex.html</id>
    <published>2018-05-07T00:00:00Z</published>
    <updated>2018-05-07T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Regexes, the go-to-mechanism for string matching, must not only be written, but also need to be applied. This episode acts as a reference with some style advice for working with regular expressions in Ruby. If you are looking for resources on writing the actual regexes, take a look at the &lt;a href="#regex-resources"&gt;link collection at the bottom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="what-do-you-want-to-achieve"&gt;What do you Want to Achieve?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="#task-check-if-regex-matches"&gt;1 - Task: Check if Regex Matches&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#task-find-singlefirst-occurrence"&gt;2 - Task: Find Single/First Occurrence&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#task-find-all-occurrences"&gt;3 - Task: Find All Occurrences&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#task-replace"&gt;4 - Task: Replace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#special-task-split-string-into-array"&gt;Special Task: Split String Into Array&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#special-task-filter-array-of-strings"&gt;Special Task: Filter Array of Strings&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#special-task-partition-string"&gt;Special Task: Partition String&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="task-check-if-regex-matches"&gt;1 - Task: Check if Regex Matches&lt;/h2&gt;

&lt;h3 id="a-match"&gt;1a) &lt;code&gt;match?&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;This is the preferred way to check for a match since Ruby 2.4. It only returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, but does not store any match data to get more performance:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"string".match? /1.3/ # =&amp;gt; false
"123".match? /1.3/ # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b-"&gt;1b) &lt;code&gt;=~&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;This method is baked into Ruby's syntax, although its return value is rather special: It is the codepoint index in the string where the match occurred or &lt;code&gt;nil&lt;/code&gt; otherwise. However, it is a wise choice to only use it for its &lt;em&gt;truthy&lt;/em&gt;/&lt;em&gt;falsey&lt;/em&gt; value and use the more self-explaining &lt;a href="https://ruby-doc.org/core/String.html#method-i-index"&gt;String#index method&lt;/a&gt; otherwise. Other than with the previous' &lt;code&gt;match?&lt;/code&gt; approach, match data is set accordingly (this is the case with all other ways of matching) - see next section "&lt;a href="#task-find-singlefirst-occurrence"&gt;Find First Occurrence&lt;/a&gt;" for ways to do so. Here is the example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"string" =~ /1.3/ # =&amp;gt; false
"123" =~ /1.3/ # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The match operator's sibling is &lt;code&gt;!~&lt;/code&gt; which negates the match result:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"string" !~ /1.3/ # =&amp;gt; true
"123" !~ /1.3/ # =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;More complicated matching can involve capture groups. Depending on the reference style (named or numbered), the way you can access it differs:&lt;/p&gt;

&lt;h4 id="numbered-1-9"&gt;Numbered: &lt;code&gt;$1-$9&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;The &lt;a href="/9-globalization.html#list-of-all-special-global-variables"&gt;Perlish special variables&lt;/a&gt; contain &lt;a href="/60-escape-back-referencing.html#special-regex-variables--back-references"&gt;the matches&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things" =~ /(\d+) things/
$1 # =&amp;gt; "42"
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="named-"&gt;Named: &lt;code&gt;$~&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;The match data object contains the matches:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things" =~ /(?&amp;lt;thing_count&amp;gt;\d+) things/
$~[:thing_count] # =&amp;gt; "42"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that regex matching with named captures can &lt;a href="/14-meeting-some-locals.html#implicit-local-variables-through-regex-matching"&gt;implicitly create local variables&lt;/a&gt;. This is extremely confusing and you should rather use the above syntax which is clearer, yet still maintains conciseness.&lt;/p&gt;

&lt;h3 id="c-case-compare"&gt;1c) Case Compare&lt;/h3&gt;

&lt;p&gt;Regex' &lt;code&gt;===&lt;/code&gt; operator is also mapped to matching strings (returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;). However, although it should not be used directly¹, it allows you to write very expressive and readable case statements²:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;case variable = "string or number"
when /\A\d+\z/
  variable.to_i
when /\A\d+\.\d+\z/
  variable.to_f
else
  variable.to_s
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ The reason: It depends on the order of both operands, regex must be first, which is rather unintuitive. String's &lt;code&gt;===&lt;/code&gt; operator has a different semantic of just comparing two strings&lt;br /&gt;
² For more general documentation about equalness in Ruby, checkout &lt;a href="/55-struggling-four-equality.html"&gt;Episode 55: Struggling Four Equality&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="task-find-singlefirst-occurrence"&gt;2 - Task: Find Single/First Occurrence&lt;/h2&gt;

&lt;h3 id="a-string"&gt;2a) String#[]&lt;/h3&gt;

&lt;p&gt;A very readable way to to return the match result of the string is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things"[/\d\d/] # =&amp;gt; "42"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also use capture groups here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things"[/\d(\d)/, 1] # =&amp;gt; "2"
"String with 42 things"[/(?&amp;lt;first&amp;gt;\d)\d/, :first] # =&amp;gt; "4"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b---"&gt;2b) &lt;code&gt;=~&lt;/code&gt; + &lt;code&gt;$&amp;amp;&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;If you prefer the &lt;code&gt;=~&lt;/code&gt; syntax, you can retrieve the matched string with the special variable &lt;code&gt;$&amp;amp;&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things" =~ /\d+/
$&amp;amp; # =&amp;gt; "42"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="c-stringrindex"&gt;2c) String#rindex&lt;/h3&gt;

&lt;p&gt;Worth mentioning is the special behavior of &lt;a href="https://ruby-doc.org/core/String.html#method-i-rindex"&gt;String.rindex&lt;/a&gt;. It will start the match process on the right side of string and return the first index, where a match is possible:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; "String with 42, sorry with 23 things".rindex /\d+/
 $&amp;amp; # =&amp;gt; "3"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that it &lt;em&gt;does not&lt;/em&gt; match &lt;code&gt;"23"&lt;/code&gt;, but &lt;code&gt;"3"&lt;/code&gt;. If you want to match an expression in relation to the end of the string you could use a positive-lookahead in combination with &lt;code&gt;\z&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42, sorry with 23 things" =~ /\d+(?=\D*\z)/
$&amp;amp; # =&amp;gt; "23"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="task-find-all-occurrences"&gt;3 - Task: Find All Occurrences&lt;/h2&gt;

&lt;h3 id="stringscan"&gt;3) String#scan&lt;/h3&gt;

&lt;p&gt;Your friend is the &lt;a href="https://ruby-doc.org/core/String.html#method-i-scan"&gt;scan method&lt;/a&gt; which returns an array of all results:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42, sorry with 23 things".scan /\d+/ # =&amp;gt; ["42", "23"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="task-replace"&gt;4 - Task: Replace&lt;/h2&gt;

&lt;p&gt;The usual string replacement tool is &lt;strong&gt;gsub&lt;/strong&gt; (&lt;strong&gt;g&lt;/strong&gt;lobal &lt;strong&gt;sub&lt;/strong&gt;stitution) which replaces all matching occurrences of the regex. Should you only want to replace the first occurrence, use the &lt;strong&gt;sub&lt;/strong&gt; method instead.&lt;/p&gt;

&lt;h3 id="a-stringgsub-with-string-argument"&gt;4a) String#gsub with String Argument&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things".gsub /\d+/, "23" # =&amp;gt; "String with 23 things"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can use &lt;a href="/60-escape-back-referencing.html"&gt;back references&lt;/a&gt; in the replacement string.&lt;/p&gt;

&lt;h3 id="b-stringgsub-with-block"&gt;4b) String#gsub with Block&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things".gsub /\d+/ do
  $&amp;amp;.to_i + 1
end # =&amp;gt; "String with 43 things"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can use &lt;a href="/60-escape-back-referencing.html"&gt;Perl-style regex globals&lt;/a&gt; in the replacement block.&lt;/p&gt;

&lt;h2 id="special-task-split-string-into-array"&gt;Special Task: Split String Into Array&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-i-split"&gt;Splitting a string&lt;/a&gt; along a separator is the main way of converting it into a useful array:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;array = "String with     42\nthings".split(/\s+/)
# =&amp;gt; ["String", "with", "42", "things"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="special-task-filter-array-of-strings"&gt;Special Task: Filter Array of Strings&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://ruby-doc.org/core/Enumerable.html#method-i-grep"&gt;Enumerable#grep&lt;/a&gt; method allows you to do so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["String", "with", "42", "things"].grep(/\d/) # =&amp;gt; ["42"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ther is also &lt;a href="https://ruby-doc.org/core/Enumerable.html#method-i-grep_v"&gt;Enumerable#grep_v&lt;/a&gt; which returns all elements that do not match (think #reject):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["String", "with", "42", "things"].grep_v(/\d/) # =&amp;gt; ["String", "with", "things"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="special-task-partition-string"&gt;Special Task: Partition String&lt;/h2&gt;

&lt;p&gt;Ruby's &lt;a href="https://ruby-doc.org/core/String.html#method-i-partition"&gt;String#partition&lt;/a&gt; divides a string into an array consisting of three elements:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;parts = "String with 42 things".partition(/\d+/)
parts # =&amp;gt; ["String with ", "42", " things"]
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;The string before regex match&lt;/li&gt;
  &lt;li&gt;The regex match&lt;/li&gt;
  &lt;li&gt;The string after the regex match&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that you can get to the same result using &lt;a href="/60-escape-back-referencing.html#special-regex-variables--back-references"&gt;the special &lt;em&gt;pre-&lt;/em&gt; and &lt;em&gt;post match&lt;/em&gt; variables&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"String with 42 things" =~ /\d+/
parts = [$`, $&amp;amp;, $'] # =&amp;gt; ["String with ", "42", " things"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="regex-resources"&gt;Regex Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/doc/regexp_rdoc.html"&gt;RDoc: Regular expressions&lt;/a&gt; - Ruby regex documentation&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html"&gt;RDoc: Regexp&lt;/a&gt; - Class docs (overlaps with general regex docs)&lt;/li&gt;
  &lt;li&gt;&lt;a href="/11-regular-extremism.html"&gt;Episode 11: Regular Extremism&lt;/a&gt; - Collection of advanced regex syntaxes&lt;/li&gt;
  &lt;li&gt;&lt;a href="/21-uniform-resource-matching.html"&gt;Episode 21: Uniform Resource Matching&lt;/a&gt; - URL regex included in Ruby's standard library&lt;/li&gt;
  &lt;li&gt;&lt;a href="/30-regex-with-class.html"&gt;Episode 30: Regex with Class&lt;/a&gt; - Overview of Unicode and POSIX-style character classes&lt;/li&gt;
  &lt;li&gt;&lt;a href="/41-proper-unicoding.html"&gt;Episode 41: Proper Unicoding&lt;/a&gt; - Regex Unicode Property syntax (&lt;code&gt;\p{}&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/debugging#restring-regex-groups--nil"&gt;&lt;code&gt;re&lt;/code&gt; method (part of irb.tools)&lt;/a&gt; - Displays first match (including capture groups) in the terminal&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://rubular.com/"&gt;Rubular&lt;/a&gt; - Online regex testing&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/k-takata/Onigmo/blob/master/doc/RE"&gt;Onigmo&lt;/a&gt; - Upstream repository of Ruby's regex engine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/4-what-the-pack.html"&gt;What the Pack?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/49-what-the-format.html"&gt;What the Format?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/57-what-the-time.html"&gt;What the Time?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>idiosyncratic_eval</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/63-instance-eval.html"/>
    <id>https://idiosyncratic-ruby.com/63-instance-eval.html</id>
    <published>2018-05-02T00:00:00Z</published>
    <updated>2018-05-02T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;When you get farther upwards the steep hill that is Ruby mastery, you will come across some powerful, yet slightly evil methods: &lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-instance_eval"&gt;instance_eval&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/Module.html#method-i-class_eval"&gt;class_eval&lt;/a&gt;¹. They allow you to execute code and define methods tied to a specific class, at the same time giving you access to outer scope variables through the Ruby block syntax. Their exact behavior varies, depending on the context they are used in. So what is the difference between all the evals?&lt;/p&gt;

&lt;p&gt;¹ Also aliased as &lt;code&gt;module_eval&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="eval--method-definition-comparison"&gt;Eval / Method Definition Comparison&lt;/h2&gt;

&lt;p&gt;In the following tables, you will find all combinations of defining a method and executing it in a different class context:&lt;/p&gt;

&lt;h3 id="class-scope"&gt;Class Scope&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Definition Method&lt;/th&gt;
      &lt;th&gt;No &lt;code&gt;eval&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;class_eval&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;instance_eval&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;def&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--def"&gt;instance&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--classeval--def"&gt;instance&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;&lt;a href="#class--instanceeval--def"&gt;class&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;define_method&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--definemethod"&gt;instance&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--classeval--definemethod"&gt;instance&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--instanceeval--definemethod"&gt;instance&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;def self.&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--def-self"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--classeval--def-self"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--instanceeval--def-self"&gt;class&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--definesingletonmethod"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--classeval--definesingletonmethod"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class--instanceeval--definesingletonmethod"&gt;class&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="class-class-scope-class--self"&gt;Class-Class Scope (&lt;code&gt;class &amp;lt;&amp;lt; self&lt;/code&gt;)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Definition Method&lt;/th&gt;
      &lt;th&gt;No &lt;code&gt;eval&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;class_eval&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;instance_eval&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;def&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--def"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--classeval--def"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;&lt;a href="#class-class--instanceeval--def"&gt;class-class&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;define_method&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--definemethod"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--classeval--definemethod"&gt;class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--instanceeval--definemethod"&gt;class&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;def self.&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--def-self"&gt;class-class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--classeval--def-self"&gt;class-class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--instanceeval--def-self"&gt;class-class&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--definesingletonmethod"&gt;class-class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--classeval--definesingletonmethod"&gt;class-class&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="#class-class--instanceeval--definesingletonmethod"&gt;class-class&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="observations"&gt;Observations&lt;/h2&gt;

&lt;p&gt;While &lt;code&gt;class_eval&lt;/code&gt; behaves exactly as if it was in no eval-context at all, &lt;code&gt;instance_eval&lt;/code&gt; features a notable difference:
&lt;strong&gt;&lt;span class="action-color"&gt;def inside instance_eval will define methods one class-level higher&lt;/span&gt;&lt;/strong&gt;. So when &lt;code&gt;instance_eval&lt;/code&gt; is executed on instances, &lt;code&gt;def&lt;/code&gt; will create instance methods instead of singleton methods. And when it is run on classes, &lt;code&gt;def&lt;/code&gt; will create class methods instead of instance methods.&lt;/p&gt;

&lt;p&gt;Another difference is that while &lt;a href="https://ruby-doc.org/core/Module.html#method-i-class_eval"&gt;&lt;code&gt;class_eval&lt;/code&gt; is defined on Module&lt;/a&gt;, &lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-instance_eval"&gt;&lt;code&gt;instance_eval&lt;/code&gt; lives in BasicObject&lt;/a&gt; allowing you to use it on any object, not only modules and classes. However, there is a simple way to use &lt;code&gt;class_eval&lt;/code&gt; for instances, too. You can explicitly use the object's singleton class (&lt;code&gt;class &amp;lt;&amp;lt; self&lt;/code&gt;), which is a module:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;o = Object.new # =&amp;gt; #&amp;lt;Object:0x000055b6fdabf1f8&amp;gt;
o.singleton_class.class_eval do
  def m
    p self
  end
end

o.m # =&amp;gt; #&amp;lt;Object:0x000055b6fdabf1f8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="best-practice"&gt;Best Practice&lt;/h3&gt;

&lt;p&gt;Overall, the behavior of &lt;code&gt;instance_eval&lt;/code&gt; is rather confusing and my recommendation is to avoid it and always use &lt;code&gt;class_eval&lt;/code&gt;. If you do not need closure access, consider using no eval at all.&lt;/p&gt;

&lt;h2 id="reference--examples-class-level-scope"&gt;Reference / Examples: Class-Level Scope&lt;/h2&gt;

&lt;p&gt;For reference, what follows is a list of snippets illustrating each &lt;em&gt;eval-define&lt;/em&gt; combination.&lt;/p&gt;

&lt;h3 id="class--def"&gt;Class / &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;instance&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  def m
    p self
  end
end

C.new.m # =&amp;gt; #&amp;lt;C:0x0000556efd3eb1a8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--classeval--def"&gt;Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;instance&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class_eval{
    def m
      p self
    end
  }
end

C.new.m # =&amp;gt; #&amp;lt;C:0x0000556efd3eb1a8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--instanceeval--def"&gt;Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;&lt;span class="action-color"&gt;class&lt;/span&gt;&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  instance_eval{
    def m
      p self
    end
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--definemethod"&gt;Class / &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;instance&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  define_method(:m){
    p self
  }
end

C.new.m # =&amp;gt; #&amp;lt;C:0x0000556efd3eb1a8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--classeval--definemethod"&gt;Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;instance&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class_eval{
    define_method(:m){
      p self
    }
  }
end

C.new.m # =&amp;gt; #&amp;lt;C:0x0000556efd3eb1a8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--instanceeval--definemethod"&gt;Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;instance&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  instance_eval{
    define_method(:m){
      p self
    }
  }
end

C.new.m # =&amp;gt; #&amp;lt;C:0x0000556efd3eb1a8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--def-self"&gt;Class / &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  def self.m
    p self
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--classeval--def-self"&gt;Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class_eval{
    def self.m
      p self
    end
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--instanceeval--def-self"&gt;Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  instance_eval{
    def self.m
      p self
    end
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--definesingletonmethod"&gt;Class / &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  define_singleton_method(:m){
    p self
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--classeval--definesingletonmethod"&gt;Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class_eval{
    define_singleton_method(:m){
      p self
    }
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class--instanceeval--definesingletonmethod"&gt;Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  instance_eval{
    define_singleton_method(:m){
      p self
    }
  }
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="reference--examples-class-class-level-scope"&gt;Reference / Examples: Class-Class-Level Scope&lt;/h2&gt;

&lt;h3 id="class-class--def"&gt;Class-Class / &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    def m
      p self
    end
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--classeval--def"&gt;Class-Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    class_eval{
      def m
        p self
      end
    }
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--instanceeval--def"&gt;Class-Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;def&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;&lt;span class="action-color"&gt;class-class&lt;/span&gt;&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    instance_eval{
      def m
        p self
      end
    }
  end
end

C.singleton_class.m #=&amp;gt; #&amp;lt;Class:C&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--definemethod"&gt;Class-Class / &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    define_method(:m){
      p self
    }
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--classeval--definemethod"&gt;Class-Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    class_eval{
      define_method(:m){
        p self
      }
    }
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--instanceeval--definemethod"&gt;Class-Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;define_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    instance_eval{
      define_method(:m){
        p self
      }
    }
  end
end

C.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--def-self"&gt;Class-Class / &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    def self.m
      p self
    end
  end
end

C.singleton_class.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--classeval--def-self"&gt;Class-Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    class_eval{
      def self.m
        p self
      end
    end
  }
end

C.singleton_class.m #=&amp;gt; #&amp;lt;Class:C&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--instanceeval--def-self"&gt;Class-Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;def self.&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    instance_eval{
      def self.m
        p self
      end
    }
  end
end

C.singleton_class.m #=&amp;gt; #&amp;lt;Class:C&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--definesingletonmethod"&gt;Class-Class / &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    define_singleton_method(:m){
      p self
    }
  end
end

C.singleton_class.m # =&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--classeval--definesingletonmethod"&gt;Class-Class / &lt;code&gt;class_eval&lt;/code&gt; + &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    class_eval{
      define_singleton_method(:m){
        p self
      }
    }
  end
end

C.singleton_class.m #=&amp;gt; #&amp;lt;Class:C&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="class-class--instanceeval--definesingletonmethod"&gt;Class-Class / &lt;code&gt;instance_eval&lt;/code&gt; + &lt;code&gt;define_singleton_method&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Defines method on &lt;strong&gt;class-class&lt;/strong&gt;-level&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class C
  class &amp;lt;&amp;lt; self
    instance_eval{
      define_singleton_method(:m){
        p self
      }
    }
  end
end

C.singleton_class.m #=&amp;gt; #&amp;lt;Class:C&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Blog post: &lt;a href="http://blog.yugui.jp/entry/846"&gt;Three implicit contexts in Ruby&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/25-meta-methodology.html"&gt;Episode 25: Meta Methodology&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Less Feature-Rich, More Fun</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/62-less-features-more-fun.html"/>
    <id>https://idiosyncratic-ruby.com/62-less-features-more-fun.html</id>
    <published>2016-05-31T00:00:00Z</published>
    <updated>2016-05-31T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby was created in 1993 and has come a long way. The preferred style of coding has changed quite a lot and solid best practice has emerged (though, as always, &lt;a href="http://relaxed.ruby.style/"&gt;one size does not fit all&lt;/a&gt;). At the same time, &lt;a href="/1-test-highlights.html"&gt;Ruby's tool support could be better&lt;/a&gt;, the language is still too complex. Maybe, the time has come to remove some features from Ruby.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Which is always hard, because it will break existing code.¹ But it can still be worth it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;People new to Ruby start with learning the &lt;em&gt;right thing&lt;/em&gt;, instead of having to learnthe best practice later ("avoid for loops")&lt;/li&gt;
  &lt;li&gt;The language gets simpler, which means: better tool support!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What follows are some opinionated examples of what could be removed from Ruby without breaking too much code (hopefully).&lt;/p&gt;

&lt;h2 id="ten-ruby-features-which-could-be-removed-without-too-much-trouble-more-or-less"&gt;Ten Ruby Features which Could Be Removed Without Too Much Trouble (More or Less)&lt;/h2&gt;

&lt;h3 id="for-and-in-keywords"&gt;1. &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;in&lt;/code&gt; Keywords&lt;/h3&gt;

&lt;p&gt;For loops are rarely used in favor of semantically almost similar alternatives like &lt;a href="https://ruby-doc.org/core/Array.html#method-i-each"&gt;Array#each&lt;/a&gt; or &lt;a href="https://ruby-doc.org/core/Integer.html#method-i-times"&gt;Integer#times&lt;/a&gt;. They are even &lt;a href="https://github.com/JuanitoFatas/fast-ruby#enumerableeach-vs-for-loop-code"&gt;a little slower than calling &lt;code&gt;each&lt;/code&gt; directly&lt;/a&gt;. Also see: &lt;a href="http://graysoftinc.com/early-steps/the-evils-of-the-for-loop"&gt;The Evils of the For Loop&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="character-literals"&gt;2. &lt;code&gt;?&lt;/code&gt; Character Literals&lt;/h3&gt;

&lt;p&gt;The &lt;a href="/33-too-expressive.html#question-mark-4-syntactical-meanings"&gt;question mark allows you to create single-letter strings&lt;/a&gt;. This was indeed useful when writing code that should work for both, Ruby 1.8 and Ruby 1.9:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncratic"[0] == ?I
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While the return value in Ruby 1.9+ is &lt;code&gt;"I"&lt;/code&gt; on both sides, in Ruby 1.8 it was &lt;code&gt;73&lt;/code&gt; on both sides, so it would still return &lt;code&gt;true&lt;/code&gt;. Support for Ruby 1.8 ended in 2013, so there is no benefit of the &lt;code&gt;?&lt;/code&gt; syntax anymore.&lt;/p&gt;

&lt;h3 id="class-hierarchy-variables"&gt;3. &lt;code&gt;@@&lt;/code&gt; Class Hierarchy Variables&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://makandracards.com/makandra/14229-the-many-gotchas-of-ruby-class-variables"&gt;You should not use class variables!&lt;/a&gt; They will confuse almost every newcomer and should be removed from the language. Some alternatives:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Class-instance variables&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://guides.rubyonrails.org/active_support_core_extensions.html#class-attributes"&gt;ActiveSupport's class attributes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/hanami/utils/blob/master/lib/hanami/utils/class_attribute.rb"&gt;Hanami's class attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be fair: Removing class variables would break more code than any of the other suggestions on this page. Too big to remove.&lt;/p&gt;

&lt;h3 id="then-keyword"&gt;4. &lt;code&gt;then&lt;/code&gt; Keyword&lt;/h3&gt;

&lt;p&gt;If statements usually separate the condition from the body using a newline or &lt;code&gt;;&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if true
  p 42
else
  p 43
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, you can optionally use the &lt;code&gt;then&lt;/code&gt; keyword:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if true then
  p 42
else
  p 43
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There exist two case where &lt;code&gt;then&lt;/code&gt; makes sense. One is one-liners:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if true then p 42 else p 43 end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But even they look better with the ternary operator (&lt;code&gt;?:&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p true ? 42 : 43
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The other is single-line &lt;code&gt;when&lt;/code&gt; statements:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;case
when true  then 42
when false then 43
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Going with &lt;code&gt;;&lt;/code&gt;, it would still be possible to write single-line &lt;code&gt;when&lt;/code&gt;s without &lt;code&gt;then&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;case
when true;  42
when false; 43
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All in all: &lt;code&gt;then&lt;/code&gt; is superfluous.&lt;/p&gt;

&lt;h3 id="true-false-nil-constants"&gt;5. &lt;code&gt;TRUE&lt;/code&gt;, &lt;code&gt;FALSE&lt;/code&gt;, &lt;code&gt;NIL&lt;/code&gt; constants&lt;/h3&gt;

&lt;p&gt;There are keywords for &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, and &lt;code&gt;nil&lt;/code&gt;. They all have a predefined associated constant, &lt;a href="/45-constant-shuffle.html"&gt;which can be redefined&lt;/a&gt;: &lt;code&gt;TRUE, FALSE, NIL = nil, true, false&lt;/code&gt;. There is no reason to keep them around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Removed in Ruby 3.0&lt;/p&gt;

&lt;h3 id="implicit-creation-of-local-variables-via-regex-matching"&gt;6. Implicit Creation of Local Variables via Regex Matching&lt;/h3&gt;

&lt;p&gt;Accessing the last regex match: There is no need for &lt;a href="/14-meeting-some-locals.html#implicit-local-variables-through-regex-matching"&gt;&lt;code&gt;=~&lt;/code&gt; to be able to create local variables&lt;/a&gt;, but only if both operands are in the right order. Using &lt;a href="https://idiosyncratic-ruby.com/60-escape-back-referencing.html"&gt;&lt;code&gt;$~[:group_name]&lt;/code&gt;&lt;/a&gt; instead is more explicit and still very concise.&lt;/p&gt;

&lt;h3 id="and-or-not-keywords"&gt;7. &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;not&lt;/code&gt; Keywords&lt;/h3&gt;

&lt;p&gt;The boolean operators with lower precedence are nice in some situations, for example, using &lt;code&gt;or&lt;/code&gt; to raise an exception when an assignment value is &lt;code&gt;nil&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a = dangerous_operation or raise "dangerous operation failed"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But is it a strong enough reason to keep the keywords in the language? They already have created lots of confusion for Ruby learners.&lt;/p&gt;

&lt;h3 id="secret-cli-options-like--s-and--x"&gt;8. Secret CLI Options like &lt;code&gt;-s&lt;/code&gt; and &lt;code&gt;-x&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;When is the last time you used &lt;a href="/7-easier-switching.html"&gt;&lt;code&gt;$ ruby -s&lt;/code&gt;&lt;/a&gt; or &lt;a href="/22-literate-ruby.html"&gt;&lt;code&gt;$ ruby -x&lt;/code&gt;&lt;/a&gt;?&lt;/p&gt;

&lt;h3 id="symbols"&gt;9. Symbols&lt;/h3&gt;

&lt;p&gt;Semantically, symbols and frozen strings are very similar. &lt;a href="https://speakerdeck.com/sferik/symbols"&gt;Symbols should become a shorthand syntax for frozen strings!&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="flip-flops"&gt;10. Flip Flops&lt;/h3&gt;

&lt;p&gt;This blog covers a lot of Ruby's lesser-known features. It does not even have an episode about &lt;a href="https://www.google.com/search?tbm=isch&amp;amp;q=ruby%20flip%20flops"&gt;Ruby's Flip Flops&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;¹ Maybe, we can have strict/quirks modes via a &lt;a href="/58-magic-instructions.html"&gt;magic comments&lt;/a&gt;? More complexity, though.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Meta Escape Control</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/61-meta-escape-control.html"/>
    <id>https://idiosyncratic-ruby.com/61-meta-escape-control.html</id>
    <published>2016-05-30T00:00:00Z</published>
    <updated>2016-05-30T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Double-quoted strings can not only be used with interpolation, &lt;code&gt;#{}&lt;/code&gt;, they also support various escape sequences, which are initiated with &lt;code&gt;\&lt;/code&gt;. Escape sequences allow you to embed raw byte and codepoint values. Furthermore, there are shortcuts for common formatting and control characters.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="byte-sequences"&gt;Byte Sequences&lt;/h2&gt;

&lt;p&gt;There are two basic ways in which you can specify raw bytes to embed: &lt;code&gt;\x00&lt;/code&gt; (hexadecimal) or &lt;code&gt;\000&lt;/code&gt; (octal):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\x20" # =&amp;gt; " " # space
"\xab" # =&amp;gt; "\xAB" # byte value 171
"\033" # =&amp;gt; "\e" # escape
"\0"   # =&amp;gt; "\u0000" # null byte
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="meta-escapes"&gt;Meta Escapes&lt;/h3&gt;

&lt;p&gt;There is a &lt;em&gt;meta escape&lt;/em&gt; syntax &lt;code&gt;"\M-x"&lt;/code&gt; with &lt;strong&gt;x&lt;/strong&gt; being a byte value. If the byte is below 128 (&lt;code&gt;\x80&lt;/code&gt;), it will add 128, otherwise it will return the same value. Differently put: It will return the same byte value with 8th bit set. The &lt;strong&gt;x&lt;/strong&gt; value can be escaped again:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"A".unpack("C")    # =&amp;gt; [65]
"\M-A".unpack("C") # =&amp;gt; [193]
"\M-\x01" # =&amp;gt; "\x81"
"\M-\x81" # =&amp;gt; "\x81"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="control-escapes"&gt;Control Escapes&lt;/h3&gt;

&lt;p&gt;Another legacy syntax is the &lt;em&gt;control escape&lt;/em&gt; syntax: &lt;code&gt;"\C-x"&lt;/code&gt; (or &lt;code&gt;"\cx"&lt;/code&gt;)  with &lt;strong&gt;x&lt;/strong&gt; being a byte value. It will return the value of the 5 least significant bits, so the value will also between 0 and 31. The &lt;strong&gt;x&lt;/strong&gt; value can be escaped again, or combined with &lt;em&gt;meta escapes&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\C-\x01" # =&amp;gt; "\u0001"
"\C-!"    # =&amp;gt; "\u0001"
"\C-A"    # =&amp;gt; "\u0001"
"\M-\C-A" # =&amp;gt; "\x81"
"\C-\M-A" # =&amp;gt; "\x81"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="unicode-codepoints"&gt;Unicode Codepoints&lt;/h2&gt;

&lt;p&gt;Unicode characters are represented by codepoint values. If you know the numerical codepoint value, you can embed it in a double-quoted string using &lt;code&gt;\u&lt;/code&gt;. You must use exactly 4 digits of the hexadecimal representation of the value, but casing is not relevant:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u0020" # =&amp;gt; " " # space
"\u00A0" # =&amp;gt; " " # no-break space
"\u203d" # =&amp;gt; "‽" # interrobang
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;\u&lt;/code&gt; syntax supports a more explicit &lt;code&gt;{}&lt;/code&gt; flavor:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u{9}" # =&amp;gt; "\t" # tab
"\u{2602}" # =&amp;gt; "☂" # umbrella
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;\u{}&lt;/code&gt; syntax is required if you want to display codepoints which need more than four hexadecimal digest, for example, &lt;a href="https://codepoints.net/U+1F6A1"&gt;&lt;code&gt;U+1F6A1 AERIAL TRAMWAY&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u{1F6A1}" # "🚡"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It also allows you to specify multiple characters at once:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\u{49 64 69 6f 73 79 6e 63 72 e4 74 69 63 20 52 75 62 79}"
# =&amp;gt; "Idiosyncrätic Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="control-and-formatting-characters"&gt;Control and Formatting Characters&lt;/h2&gt;

&lt;p&gt;Some byte values used for common control/formatting characters have escape sequences:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Escape&lt;/th&gt;
      &lt;th&gt;Byte Value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\a&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;terminal bell&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\b&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;backspace&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;tab&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\n&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;newline&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\v&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;vertical tab&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\f&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;form feed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;13&lt;/td&gt;
      &lt;td&gt;carriage return&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\e&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;27&lt;/td&gt;
      &lt;td&gt;start &lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code"&gt;escape sequence&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\s&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;32&lt;/td&gt;
      &lt;td&gt;&lt;code&gt; &lt;/code&gt; (space)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  <entry>
    <title>Escape Back Referencing</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/60-escape-back-referencing.html"/>
    <id>https://idiosyncratic-ruby.com/60-escape-back-referencing.html</id>
    <published>2016-05-29T00:00:00Z</published>
    <updated>2016-05-29T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby has more than one way to access additional information about the most recent regex match, like captured groups. One way is using the &lt;a href="/9-globalization.html"&gt;special variables &lt;code&gt;$`&lt;/code&gt;, &lt;code&gt;$&amp;amp;&lt;/code&gt;, &lt;code&gt;$'&lt;/code&gt;, &lt;code&gt;$1&lt;/code&gt; - &lt;code&gt;$9&lt;/code&gt;, &lt;code&gt;$+&lt;/code&gt;&lt;/a&gt;, and also in the &lt;a href="https://ruby-doc.org/core/MatchData.html"&gt;MatchData&lt;/a&gt; object &lt;code&gt;$~&lt;/code&gt;. They become available after using a method that matched a regex, or when the method supports a block, they are already available in the block.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;However, there is also a special string processing supported by the string replacement methods &lt;a href="https://ruby-doc.org/core/String.html#method-i-gsub"&gt;String#gsub&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/String.html#method-i-sub"&gt;String#sub&lt;/a&gt;. The replacement string (second parameter) can contain &lt;strong&gt;back references&lt;/strong&gt;, which behave similarly to their corresponding special variable:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncratic Ruby".sub(/(\w+) (\w+)/, '\2 \1') # =&amp;gt; "Ruby Idiosyncratic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="special-regex-variables--back-references"&gt;Special Regex Variables &amp;amp; Back References&lt;/h2&gt;

&lt;table class="table-15-15-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Perlish&lt;/th&gt;
      &lt;th&gt;Back-Ref&lt;/th&gt;
      &lt;th&gt;Effect&lt;/th&gt;
      &lt;th&gt;Example&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$&amp;amp;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\&amp;amp;'&lt;/code&gt;, &lt;code&gt;'\0'&lt;/code&gt;¹&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/.*/, '\&amp;amp;\&amp;amp;') # =&amp;gt; "abcabc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$`&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\`'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Pre Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/b/, '\`') # =&amp;gt; "aac"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\\\''&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Post Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/b/, '\\\'') # =&amp;gt; "acc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$1&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\1'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;1st Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/(a)b(c)/, '\1') # =&amp;gt; "a"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$+&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\+'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Last Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/(a)b(c)/, '\+') # =&amp;gt; "c"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$~[:name]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'\k&amp;lt;name&amp;gt;'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Named Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"abc".gsub(/(?&amp;lt;name&amp;gt;a)bc/, '\k&amp;lt;name&amp;gt;') # =&amp;gt; "a"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="escaping"&gt;Escaping&lt;/h2&gt;

&lt;p&gt;Ruby is absolutely confusing when it comes to how to escape back references. You have to use one or two backspaces when using single quoted strings. You have to use two (or sometimes three) backspaces when using double quoted strings. Escaping &lt;code&gt;\'&lt;/code&gt; needs special attention³:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;X&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;'\X'&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;'\\X'&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;'\\\X'&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;"\X"&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;"\\X"&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;"\\\X"&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;"\\\\X"&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&amp;amp;&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\&amp;amp;"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"&amp;amp;"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\&amp;amp;"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;`&lt;/td&gt;
      &lt;td&gt;Pre-Match&lt;/td&gt;
      &lt;td&gt;Pre-Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\`"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"`"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Pre-Match&lt;/td&gt;
      &lt;td&gt;Pre-Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\`"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;'&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"'"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;Post-Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"'"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Post-Match&lt;/td&gt;
      &lt;td&gt;Post-Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\'"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0¹&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\u0000"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Match&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\\u0000"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1²&lt;/td&gt;
      &lt;td&gt;1st Capture&lt;/td&gt;
      &lt;td&gt;1st Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\1"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\u0001"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;1st Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\\u0001"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\1"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;+&lt;/td&gt;
      &lt;td&gt;Last Capture&lt;/td&gt;
      &lt;td&gt;Last Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\+"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"+"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Last Capture&lt;/td&gt;
      &lt;td&gt;Last Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\+"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;k&amp;lt;name&amp;gt;&lt;/td&gt;
      &lt;td&gt;Named Capture&lt;/td&gt;
      &lt;td&gt;Named Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\k&amp;lt;name&amp;gt;"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"k&amp;lt;name&amp;gt;"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Named Capture&lt;/td&gt;
      &lt;td&gt;Named Capture&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\\k&amp;lt;name&amp;gt;"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Although the global variable &lt;code&gt;$0&lt;/code&gt; is not related to regex matching, &lt;code&gt;\0&lt;/code&gt; is a valid back reference.&lt;br /&gt;
² Same for 2-9: Nth Capture&lt;br /&gt;
³ If you want to replace &lt;code&gt;'&lt;/code&gt; with &lt;code&gt;\'&lt;/code&gt; (backspace quote, no back-ref), the replacement string is: &lt;code&gt;'\\\\\''&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Big Data Without End</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/59-big-data-without-end.html"/>
    <id>https://idiosyncratic-ruby.com/59-big-data-without-end.html</id>
    <published>2016-05-28T00:00:00Z</published>
    <updated>2016-05-28T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's big &lt;code&gt;DATA&lt;/code&gt; constant does more than you might expect!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Everything after the &lt;code&gt;__END__&lt;/code&gt; keyword (at the beginning of the line) is not interpreted as Ruby, but can be retrieved with the big¹ &lt;code&gt;DATA&lt;/code&gt; constant.² This is an example &lt;code&gt;big-data.rb&lt;/code&gt; script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p DATA.read
__END__
big data
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Big &lt;code&gt;DATA&lt;/code&gt; is a &lt;a href="https://ruby-doc.org/core/File.html"&gt;File&lt;/a&gt; object, which you can &lt;code&gt;read&lt;/code&gt;. The example will output &lt;code&gt;"big data"&lt;/code&gt;. An example of real-world usage is &lt;a href="http://www.sinatrarb.com/intro.html#Inline%20Templates"&gt;inline templating within the sinatra web framework&lt;/a&gt;.³&lt;/p&gt;

&lt;p&gt;¹ Do not confuse with the small &lt;code&gt;Data&lt;/code&gt; class, which is a &lt;a href="https://ruby-doc.org/core/Data.html"&gt;CRuby implementation detail&lt;/a&gt;&lt;br /&gt;
² Big &lt;code&gt;DATA&lt;/code&gt; &lt;a href="/53-the-constant-tree.html"&gt;is not defined&lt;/a&gt;, if you have no &lt;code&gt;__END__&lt;/code&gt;. Furthermore, it is not available if you did not execute the script directly, but loaded or required it.&lt;br /&gt;
³ &lt;a href="http://blog.honeybadger.io/data-and-end-in-ruby/#a-work-around-for-multiple-files"&gt;Actually, not really&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="is-the-data-section-enough"&gt;Is the Data Section Enough?&lt;/h2&gt;

&lt;p&gt;Wait a minute! Big &lt;code&gt;DATA&lt;/code&gt; is a &lt;a href="https://ruby-doc.org/core/File.html"&gt;File&lt;/a&gt; object? What file exactly?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p DATA.path
p DATA.lineno
__END__
big data
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output will be &lt;code&gt;"big-data.rb"&lt;/code&gt; and &lt;code&gt;3&lt;/code&gt;. The big &lt;code&gt;DATA&lt;/code&gt; object points to the source file itself at a specific position! And look, we can alter this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DATA.rewind
puts DATA.gets("\n__END__")[0..-9]
__END__
big data
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will now read the source code of itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DATA.rewind
puts DATA.gets("\n__END__")[0..-9]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/22-literate-ruby.html"&gt;&lt;code&gt;$ ruby -x&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/5-constant-shadows.html"&gt;&lt;code&gt;SCRIPT_LINES__&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Magic Instructions</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/58-magic-instructions.html"/>
    <id>https://idiosyncratic-ruby.com/58-magic-instructions.html</id>
    <published>2016-05-27T00:00:00Z</published>
    <updated>2016-05-27T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby supports &lt;strong&gt;magic comments&lt;/strong&gt; (interpreter instructions) at the top of the source file, mostly known for setting a source files' &lt;a href="https://ruby-doc.org/core/Encoding.html"&gt;Encoding&lt;/a&gt;. This is the most common use case, but there is more you can do.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="source-file-encoding"&gt;Source File Encoding&lt;/h2&gt;

&lt;p&gt;The default encoding of string literals in a Ruby file is UTF-8:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p "".encoding # =&amp;gt; #&amp;lt;Encoding:UTF-8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can change it like this&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encoding: big5
p "".encoding # =&amp;gt; #&amp;lt;Encoding:Big5&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The magic comment parser is pretty liberal and supports various syntaxes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Characters before encoding: ascii or after it will not affect its functionality
p "".encoding # =&amp;gt; #&amp;lt;Encoding:US-ASCII&amp;gt;¹
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can mix casing in the encoding name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encOding: bInary
p "".encoding # =&amp;gt; #&amp;lt;Encoding:ASCII-8BIT&amp;gt;¹
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The word &lt;em&gt;coding&lt;/em&gt;² is allowed instead of &lt;em&gt;encoding&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# -*- coding: utf-8 -*-
p "".encoding # =&amp;gt; #&amp;lt;Encoding:UTF-8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, the source encoding must be ASCII compatible:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encoding: utf-16le
p "".encoding
# UTF-16LE is not ASCII compatible (ArgumentError)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will also work if you have a &lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;UNIX Shebang&lt;/a&gt; in the first line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env ruby
# encoding: windows-1250
p "".encoding # =&amp;gt; #&amp;lt;Encoding:Windows-1250&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The encoding can be any you could pass to &lt;a href="https://ruby-doc.org/core/Encoding.html#method-c-find"&gt;Encoding.find&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Encoding.name_list # =&amp;gt; ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", "UTF8-MAC", "EUC-JP", "Windows-31J", "Big5", "Big5-HKSCS", "Big5-UAO", "CESU-8", "CP949", "Emacs-Mule", "EUC-KR", "EUC-TW", "GB18030", "GBK", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "KOI8-R", "KOI8-U", "Shift_JIS", "Windows-1250", "Windows-1251", "Windows-1252", "Windows-1253", "Windows-1254", "Windows-1257", "BINARY", "IBM437", "CP437", "IBM720", "CP720", "IBM737", "CP737", "IBM775", "CP775", "CP850", "IBM850", "IBM852", "CP852", "IBM855", "CP855", "IBM857", "CP857", "IBM860", "CP860", "IBM861", "CP861", "IBM862", "CP862", "IBM863", "CP863", "IBM864", "CP864", "IBM865", "CP865", "IBM866", "CP866", "IBM869", "CP869", "Windows-1258", "CP1258", "GB1988", "macCentEuro", "macCroatian", "macCyrillic", "macGreek", "macIceland", "macRoman", "macRomania", "macThai", "macTurkish", "macUkraine", "CP950", "Big5-HKSCS:2008", "CP951", "IBM037", "ebcdic-cp-us", "stateless-ISO-2022-JP", "eucJP", "eucJP-ms", "euc-jp-ms", "CP51932", "EUC-JIS-2004", "EUC-JISX0213", "eucKR", "eucTW", "GB2312", "EUC-CN", "eucCN", "GB12345", "CP936", "ISO-2022-JP", "ISO2022-JP", "ISO-2022-JP-2", "ISO2022-JP2", "CP50220", "CP50221", "ISO8859-1", "ISO8859-2", "ISO8859-3", "ISO8859-4", "ISO8859-5", "ISO8859-6", "Windows-1256", "CP1256", "ISO8859-7", "ISO8859-8", "Windows-1255", "CP1255", "ISO8859-9", "ISO8859-10", "ISO8859-11", "TIS-620", "Windows-874", "CP874", "ISO8859-13", "ISO8859-14", "ISO8859-15", "ISO8859-16", "CP878", "MacJapanese", "MacJapan", "ASCII", "ANSI_X3.4-1968", "646", "UTF-7", "CP65000", "CP65001", "UTF-8-MAC", "UTF-8-HFS", "UCS-2BE", "UCS-4BE", "UCS-4LE", "CP932", "csWindows31J", "SJIS", "PCK", "CP1250", "CP1251", "CP1252", "CP1253", "CP1254", "CP1257", "UTF8-DoCoMo", "SJIS-DoCoMo", "UTF8-KDDI", "SJIS-KDDI", "ISO-2022-JP-KDDI", "stateless-ISO-2022-JP-KDDI", "UTF8-SoftBank", "SJIS-SoftBank", "locale", "external", "filesystem", "internal"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ See &lt;a href="/56-us-ascii-8bit.html"&gt;US-ASCII-8BIT&lt;/a&gt; for an explanation of the difference between the both ASCII encodings&lt;br /&gt;
² &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html"&gt;Emacs style&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="more-comments-more-magic"&gt;More Comments, More Magic&lt;/h2&gt;

&lt;p&gt;Besides encoding instructions there are two additional magic comments. Note that when you have multiple comments, you must put the encoding comment first or it will not work!&lt;/p&gt;

&lt;h3 id="frozen-strings"&gt;Frozen Strings&lt;/h3&gt;

&lt;p&gt;Ruby 2.3 introduced the ability to make all string literals frozen by default:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encoding: stateless-iso-2022-jp-kddi
# frozen_string_literal: true
p "".frozen? # =&amp;gt; true
p "".encoding # =&amp;gt; #&amp;lt;Encoding:stateless-ISO-2022-JP-KDDI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also freeze string literals using the &lt;code&gt;--enable-frozen&lt;/code&gt; command line option, but the magic comment will always overwrite the behavior of the source file in question.&lt;/p&gt;

&lt;h3 id="indentation-warnings"&gt;Indentation Warnings&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;# warn_indent: true
def method_name
  end

# warning: mismatched indentations at 'end' with 'def' at 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This warning also appears when running Ruby with the &lt;a href="/3-ruby-can-you-speak-louder.html#command-line-options-for-debug-modes"&gt;&lt;code&gt;-w&lt;/code&gt; command-line option&lt;/a&gt;, but the magic comment will always overwrite the behavior of the source file in question.&lt;/p&gt;

&lt;h3 id="auto-freeze-constants"&gt;Auto-Freeze Constants&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Introduced in Ruby 3.0&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# sharable_constant_value: literal
X = [{foo: []}]
# =&amp;gt; same as [{foo: [].freeze}.freeze].freeze
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Part of &lt;a href="https://ruby-doc.org/core/Ractor.html"&gt;Ruby 3.0 Ractor&lt;/a&gt;, this magic comment helps you to create frozen, sharable objects. It can take one these four values:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;none&lt;/code&gt; - No special constant assignments&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;literal&lt;/code&gt; - Freezes literals assigned to constants&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;experimental_everywhere&lt;/code&gt; - Freezes everything assigned to constants&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;experimental_copy&lt;/code&gt; - Freezes everything assigned to constants, "dynamic" objects will be copied so the originally referenced object will not get frozen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Differently from the other comments, it can be placed anywhere in the file. It will affect all subsequent statements within the same module scope.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ruby-doc.org/core/doc/syntax/comments_rdoc.html#label-shareable_constant_value+Directive"&gt;Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/v3_0_0/parse.y#L8085-L8094"&gt;List of magic comments defined in Ruby's grammar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>What the Time?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/57-what-the-time.html"/>
    <id>https://idiosyncratic-ruby.com/57-what-the-time.html</id>
    <published>2016-05-26T00:00:00Z</published>
    <updated>2016-05-26T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href="#a--weekday-name-abbreviated"&gt;%a&lt;/a&gt;
&lt;a href="#a--weekday-name"&gt;%A&lt;/a&gt;
&lt;a href="#b-h--month-name-abbreviated"&gt;%b&lt;/a&gt;
&lt;a href="#b--month-name"&gt;%B&lt;/a&gt;
&lt;a href="#c--date-weekday--month--day-of-month--time--year"&gt;%c&lt;/a&gt;
&lt;a href="#c--century"&gt;%C&lt;/a&gt;
&lt;a href="#d--day-of-month--0131"&gt;%d&lt;/a&gt;
&lt;a href="#d-x--date-american"&gt;%D&lt;/a&gt;
&lt;a href="#e--day-of-month-space-padded--0131"&gt;%e&lt;/a&gt;
&lt;a href="#f--date-iso-8601"&gt;%F&lt;/a&gt;
&lt;a href="#g--year-week-based-without-century"&gt;%g&lt;/a&gt;
&lt;a href="#g--year-week-based-with-century"&gt;%G&lt;/a&gt;
&lt;a href="#b-h--month-name-abbreviated"&gt;%h&lt;/a&gt;
&lt;a href="#h--hour-of-day-24h-zero-padded--023"&gt;%H&lt;/a&gt;
&lt;a href="#i--hour-of-day-12h-zero-padded--011"&gt;%I&lt;/a&gt;
&lt;a href="#j--day-of-year--001366"&gt;%j&lt;/a&gt;
&lt;a href="#k--hour-of-day-24h-space-padded--023"&gt;%k&lt;/a&gt;
&lt;a href="#l--hour-of-day-12h-space-padded--011"&gt;%l&lt;/a&gt;
&lt;a href="#l--millisecond--000999"&gt;%L&lt;/a&gt;
&lt;a href="#m--month-as-number"&gt;%m&lt;/a&gt;
&lt;a href="#m--minute-of-hour--0059"&gt;%M&lt;/a&gt;
&lt;a href="#n--newline"&gt;%n&lt;/a&gt;
&lt;a href="#n--fraction-default-nanosecond"&gt;%N&lt;/a&gt;
&lt;a href="#p--meridian-indicator-uppercase"&gt;%p&lt;/a&gt;
&lt;a href="#p--meridian-indicator-lowercase"&gt;%P&lt;/a&gt;
&lt;a href="#q--milliseconds-since-unix-epoch"&gt;%Q&lt;/a&gt;
&lt;a href="#r--time-hour--minute--second--daytime"&gt;%r&lt;/a&gt;
&lt;a href="#r--time-hour--minute"&gt;%R&lt;/a&gt;
&lt;a href="#s--seconds-since-unix-epoch"&gt;%s&lt;/a&gt;
&lt;a href="#s--second-of-minute--0060"&gt;%S&lt;/a&gt;
&lt;a href="#t--tab"&gt;%t&lt;/a&gt;
&lt;a href="#t-x--time-hour--minute--second"&gt;%T&lt;/a&gt;
&lt;a href="#u--weekday-as-number-monday-starts-week--17"&gt;%u&lt;/a&gt;
&lt;a href="#u--week-number-sunday-starts-week--0053"&gt;%U&lt;/a&gt;
&lt;a href="#v--date-vms"&gt;%v&lt;/a&gt;
&lt;a href="#v--week-number-week-based-year--0153"&gt;%V&lt;/a&gt;
&lt;a href="#w--weekday-as-number-sunday-starts-week--06"&gt;%w&lt;/a&gt;
&lt;a href="#w--week-number-monday-starts-weeks--0053"&gt;%W&lt;/a&gt;
&lt;a href="#d-x--date-american"&gt;%x&lt;/a&gt;
&lt;a href="#t-x--time-hour--minute--second"&gt;%X&lt;/a&gt;
&lt;a href="#y--year-without-century"&gt;%y&lt;/a&gt;
&lt;a href="#y--year-with-century"&gt;%Y&lt;/a&gt;
&lt;a href="#z--time-zone-offset-from-utc"&gt;%z&lt;/a&gt;
&lt;a href="#z--time-zone-abbreviated-os-dependent"&gt;%Z&lt;/a&gt;
&lt;a href="#date-date1-style"&gt;%+&lt;/a&gt;
&lt;a href="#section"&gt;%%&lt;/a&gt;
&lt;a href="#formatting-flags-and-padding"&gt;-&lt;/a&gt;
&lt;a href="#formatting-flags-and-padding"&gt;_&lt;/a&gt;
&lt;a href="#formatting-flags-and-padding"&gt;0&lt;/a&gt;
&lt;a href="#formatting-flags-and-padding"&gt;^&lt;/a&gt;
&lt;a href="#formatting-flags-and-padding"&gt;#&lt;/a&gt;
&lt;a href="#z--time-zone-offset-from-utc"&gt;:&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date and time formatting is traditionally done with &lt;a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html"&gt;strftime&lt;/a&gt;. Not any different in Ruby, which includes a &lt;a href="https://github.com/ruby/ruby/blob/trunk/strftime.c"&gt;public domain based strftime implementation&lt;/a&gt; accessible via &lt;a href="https://ruby-doc.org/core/Time.html#method-i-strftime"&gt;Time#strftime&lt;/a&gt;. Ruby would not be Ruby if it would not add some confusion: There is a &lt;a href="https://github.com/ruby/ruby/blob/trunk/ext/date/date_strftime.c"&gt;second implementation included in the standard library&lt;/a&gt; which is used by &lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html#method-i-strftime"&gt;Date#strftime&lt;/a&gt; and &lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/DateTime.html#method-i-strftime"&gt;DateTime#strftime&lt;/a&gt;. It behaves similarly in most cases, but also differs in some nuances (for example, additional formatting directives like &lt;code&gt;%Q&lt;/code&gt; are supported).&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;strftime()&lt;/code&gt; is called on time objects to convert them to strings:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 05, 24, 15).strftime("%a %b %e %T %Y")
# =&amp;gt; "Tue May 24 15:00:00 2016"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Similar to &lt;a href="/49-what-the-format.html"&gt;format strings&lt;/a&gt; or &lt;a href="/4-what-the-pack.html"&gt;String.unpack()&lt;/a&gt; you have to pass a template string which contains formatting directives (like &lt;code&gt;%Y&lt;/code&gt; for year). Many of the directives are combined directives (like &lt;code&gt;%T&lt;/code&gt; for time), constructed from multiple base directives ("atoms"). The following tables give an overview, scroll further down for an explanation of every directive.&lt;/p&gt;

&lt;h2 id="atoms"&gt;Atoms&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Point of Time&lt;/th&gt;
      &lt;th&gt;Atoms (Example)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Year&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%Y&lt;/code&gt; (2016)&lt;br /&gt;&lt;code&gt;%C&lt;/code&gt; (20)&lt;br /&gt;&lt;code&gt;%y&lt;/code&gt; (16)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Month&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%m&lt;/code&gt; (05)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Day&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%d&lt;/code&gt; (31)&lt;br /&gt;&lt;code&gt;%j&lt;/code&gt; (365)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hour/Daytime&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%H&lt;/code&gt; (23)&lt;br /&gt;&lt;code&gt;%I&lt;/code&gt; (11)&lt;br /&gt;&lt;code&gt;%P&lt;/code&gt; (am)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Minute&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%M&lt;/code&gt; (59)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Second&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%S&lt;/code&gt; (59)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fraction&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%N&lt;/code&gt; (479254327)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="english"&gt;English&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Atoms (Example)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;English Month Name&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%B&lt;/code&gt; (January)&lt;br /&gt;&lt;code&gt;%b&lt;/code&gt; (Jan)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;English Weekday Name&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%A&lt;/code&gt; (Monday)&lt;br /&gt;&lt;code&gt;%a&lt;/code&gt; (Mon)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="week-based"&gt;Week Based&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Point of Time&lt;/th&gt;
      &lt;th&gt;Atoms (Example)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Year (by Week)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%G&lt;/code&gt; (2016)&lt;br /&gt;&lt;code&gt;%g&lt;/code&gt; (16)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Week&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%W&lt;/code&gt; (52)&lt;br /&gt;&lt;code&gt;%U&lt;/code&gt; (52)&lt;br /&gt;&lt;code&gt;%V&lt;/code&gt; (52)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Weekday&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%u&lt;/code&gt; (3)&lt;br /&gt;&lt;code&gt;%w&lt;/code&gt; (3)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="other"&gt;Other&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Atoms (Example)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Time Zone&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%z&lt;/code&gt; (+0000)&lt;br /&gt;&lt;code&gt;%Z&lt;/code&gt; (UTC)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Unix_time"&gt;Unix Timestamp&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%s&lt;/code&gt; (1464188400)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Unix_time"&gt;Unix Timestamp&lt;/a&gt; (Milliseconds)¹&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%Q&lt;/code&gt; (1464188400)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Only available in Date/DateTime's strftime() implementation&lt;/p&gt;

&lt;h2 id="formatting-flags-and-padding"&gt;Formatting Flags and Padding&lt;/h2&gt;

&lt;p&gt;Time formatting directives support some basic padding and formatting options via flags that appear between &lt;code&gt;%&lt;/code&gt; and the directive type. Padding is the minimum length of the output, if the value is smaller, the remaining space will be filled with spaces or zeros.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Flag&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Do not apply default padding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Use spaces for padding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Use zeros for padding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Upcase&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;#&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Swap case&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;time = Time.utc(2016, 05, 25, 15) #=&amp;gt; 2016-05-25 15:00:00 UTC

time.strftime("%P") # =&amp;gt; "pm"
time.strftime("%^P") # =&amp;gt; "PM"
time.strftime("%#P") # =&amp;gt; "PM"
time.strftime("%10P") # =&amp;gt;  "        pm"
time.strftime("%010P") # =&amp;gt; "00000000pm"
time.strftime("%_10P") # =&amp;gt;  "        pm"

time.strftime("%m") # =&amp;gt; "05"
time.strftime("%-m") # =&amp;gt; "5"
time.strftime("%10m") #=&amp;gt; "0000000005"
time.strftime("%010m") #=&amp;gt; "0000000005"
time.strftime("%_10m") #=&amp;gt; "         5"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="combined-directives-and-aliases"&gt;Combined Directives and Aliases&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Directive&lt;/th&gt;
      &lt;th&gt;Alias/From Atoms&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%c&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%a %b %e %T %Y&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%D&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%m/%d/%y&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%e&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%_d&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%F&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%Y-%m-%d&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%h&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%b&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%k&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%_H&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%l&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%_I&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%L&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%3N&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%n&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\n"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%p&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%^P&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%I:%M:%S %p&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%R&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%H:%M&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%t&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\t"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%T&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%H:%M:%S&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%v&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Time#strftime: &lt;code&gt;%e-%^b-%4Y&lt;/code&gt;&lt;br /&gt;Date#strftime: &lt;code&gt;%e-%b-%4Y&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%x&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%m/%d/%y&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%X&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%H:%M:%S&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%+&lt;/code&gt;¹&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;%a %b %e %H:%M:%S %Z %Y&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Only available in Date/DateTime's strftime() implementation&lt;/p&gt;

&lt;h2 id="years-directives"&gt;Years Directives&lt;/h2&gt;

&lt;h3 id="y--year-with-century"&gt;%Y | Year, with Century&lt;/h3&gt;

&lt;p&gt;Will display the time's year with a default padding of 4:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%Y") # =&amp;gt; "2016"
Time.utc(20000).strftime("%Y") # =&amp;gt; "20000"
Time.utc(2).strftime("%Y") # =&amp;gt; "0002"
Time.utc(2).strftime("%-Y") # =&amp;gt; "2"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="y--year-without-century"&gt;%y | Year, without Century&lt;/h3&gt;

&lt;p&gt;Will display the time's year modulo 100 with a default padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%y") # =&amp;gt; "16"
Time.utc(20000).strftime("%y") # =&amp;gt; "00"
Time.utc(2).strftime("%y") # =&amp;gt; "02"
Time.utc(2).strftime("%-y") # =&amp;gt; "2"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="c--century"&gt;%C | Century&lt;/h3&gt;

&lt;p&gt;Will display the time's year divided by 100 with a default padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%C") # =&amp;gt; "20"
Time.utc(20000).strftime("%C") # =&amp;gt; "000"
Time.utc(2).strftime("%C") # =&amp;gt; "00"
Time.utc(2).strftime("%-C") # =&amp;gt; "0"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="g--year-week-based-with-century"&gt;%G | Year (Week based), with Century&lt;/h3&gt;

&lt;p&gt;Returns the year based on &lt;a href="https://en.wikipedia.org/wiki/ISO_week_date#First_week"&gt;which year the time's week belongs to&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2014, 12, 29).strftime("%G") # =&amp;gt; "2015"
Time.utc(2017, 1, 1).strftime("%G") #=&amp;gt; "2016"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="g--year-week-based-without-century"&gt;%g | Year (Week based), without Century&lt;/h3&gt;

&lt;p&gt;Returns the year based on &lt;a href="https://en.wikipedia.org/wiki/ISO_week_date#First_week"&gt;which year the time's week belongs to&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2014, 12, 29).strftime("%g") # =&amp;gt; "15"
Time.utc(2017, 1, 1).strftime("%g") #=&amp;gt; "16"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="months-directives"&gt;Months Directives&lt;/h2&gt;

&lt;h3 id="m--month-as-number"&gt;%m | Month as Number&lt;/h3&gt;

&lt;p&gt;Number of month, with a default padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5).strftime("%m") # =&amp;gt; "05"
Time.utc(2016, 5).strftime("%-m") # =&amp;gt; "5"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b--month-name"&gt;%B | Month Name&lt;/h3&gt;

&lt;p&gt;Locale-independent (English) month name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 1).strftime("%B") # =&amp;gt; "January"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b-h--month-name-abbreviated"&gt;%b, %h | Month Name (Abbreviated)&lt;/h3&gt;

&lt;p&gt;Locale-independent (English) three-letter month name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 1).strftime("%b") # =&amp;gt; "Jan"
Time.utc(2016, 1).strftime("%h") # =&amp;gt; "Jan"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="weeks-directives"&gt;Weeks Directives&lt;/h2&gt;

&lt;p&gt;See &lt;a href="https://en.wikipedia.org/wiki/ISO_week_date"&gt;ISO 8601&lt;/a&gt; for an explanation of week number construction.&lt;/p&gt;

&lt;h3 id="u--week-number-sunday-starts-week--0053"&gt;%U | Week Number (Sunday Starts Week) | 00..53&lt;/h3&gt;

&lt;p&gt;Considers Sunday the &lt;strong&gt;first&lt;/strong&gt; day of the week. Will return &lt;code&gt;00&lt;/code&gt; if week belongs to last year:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2015, 1, 1).strftime("%U") # =&amp;gt; "00" # Thursday
Time.utc(2016, 1, 1).strftime("%U") # =&amp;gt; "00" # Friday
Time.utc(2017, 1, 1).strftime("%U") # =&amp;gt; "01" # Sunday
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="v--week-number-week-based-year--0153"&gt;%V | Week Number (Week Based Year) | 01..53&lt;/h3&gt;

&lt;p&gt;Considers Sunday the &lt;strong&gt;first&lt;/strong&gt; day of the week. Will return last years week number if week belongs to last year:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2015, 1, 1).strftime("%V") # =&amp;gt; "01" # Thursday
Time.utc(2016, 1, 1).strftime("%V") # =&amp;gt; "53" # Friday
Time.utc(2017, 1, 1).strftime("%V") # =&amp;gt; "52" # Sunday
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="w--week-number-monday-starts-weeks--0053"&gt;%W | Week Number (Monday Starts Weeks) | 00..53&lt;/h3&gt;

&lt;p&gt;Considers Sunday the &lt;strong&gt;last&lt;/strong&gt; day of the week. Will return &lt;code&gt;00&lt;/code&gt; if week belongs to last year:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2015, 1, 1).strftime("%W") # =&amp;gt; "00" # Thursday
Time.utc(2016, 1, 1).strftime("%W") # =&amp;gt; "00" # Friday
Time.utc(2017, 1, 1).strftime("%W") # =&amp;gt; "00" # Sunday
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="days-directives"&gt;Days Directives&lt;/h2&gt;

&lt;h3 id="j--day-of-year--001366"&gt;%j | Day of Year | 001..366&lt;/h3&gt;

&lt;p&gt;Which day of the year with a default padding of 3:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%j") # =&amp;gt; "145"
Time.utc(2016, 1, 1).strftime("%j") # =&amp;gt; "001"
Time.utc(2016, 1, 1).strftime("%-j") # =&amp;gt; "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="d--day-of-month--0131"&gt;%d | Day of Month | 01..31&lt;/h3&gt;

&lt;p&gt;Which day of the month with a default (zero) padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%d") # =&amp;gt; "24"
Time.utc(2016, 1, 1).strftime("%d") # =&amp;gt; "01"
Time.utc(2016, 1, 1).strftime("%-d") # =&amp;gt; "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="e--day-of-month-space-padded--0131"&gt;%e | Day of Month (Space Padded) | 01..31&lt;/h3&gt;

&lt;p&gt;Which day of the month with a default (space) padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%e") # =&amp;gt; "24"
Time.utc(2016, 1, 1).strftime("%e") # =&amp;gt; " 1"
Time.utc(2016, 1, 1).strftime("%-e") # =&amp;gt; "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="u--weekday-as-number-monday-starts-week--17"&gt;%u | Weekday as Number (Monday Starts Week) | 1..7&lt;/h3&gt;

&lt;p&gt;Number of day in the week, value of Sunday is 7:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 22).strftime("%u") # =&amp;gt; 7 # Sunday
Time.utc(2016, 5, 23).strftime("%u") # =&amp;gt; 1 # Monday
Time.utc(2016, 5, 24).strftime("%u") # =&amp;gt; 2 # Tuesday
Time.utc(2016, 5, 25).strftime("%u") # =&amp;gt; 3 # Wednesday
Time.utc(2016, 5, 26).strftime("%u") # =&amp;gt; 4 # Thursday
Time.utc(2016, 5, 27).strftime("%u") # =&amp;gt; 5 # Friday
Time.utc(2016, 5, 28).strftime("%u") # =&amp;gt; 6 # Saturday
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="w--weekday-as-number-sunday-starts-week--06"&gt;%w | Weekday as Number (Sunday Starts Week) | 0..6&lt;/h3&gt;

&lt;p&gt;Number of day in the week, value of Sunday is 0:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 22).strftime("%u") # =&amp;gt; 0 # Sunday
Time.utc(2016, 5, 23).strftime("%u") # =&amp;gt; 1 # Monday
Time.utc(2016, 5, 24).strftime("%u") # =&amp;gt; 2 # Tuesday
Time.utc(2016, 5, 25).strftime("%u") # =&amp;gt; 3 # Wednesday
Time.utc(2016, 5, 26).strftime("%u") # =&amp;gt; 4 # Thursday
Time.utc(2016, 5, 27).strftime("%u") # =&amp;gt; 5 # Friday
Time.utc(2016, 5, 28).strftime("%u") # =&amp;gt; 6 # Saturday
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="a--weekday-name"&gt;%A | Weekday Name&lt;/h3&gt;

&lt;p&gt;Locale-independent (English) name of weekday:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 22).strftime("%A") # =&amp;gt; "Sunday"
Time.utc(2016, 5, 23).strftime("%A") # =&amp;gt; "Monday"
Time.utc(2016, 5, 24).strftime("%A") # =&amp;gt; "Tuesday"
Time.utc(2016, 5, 25).strftime("%A") # =&amp;gt; "Wednesday"
Time.utc(2016, 5, 26).strftime("%A") # =&amp;gt; "Thursday"
Time.utc(2016, 5, 27).strftime("%A") # =&amp;gt; "Friday"
Time.utc(2016, 5, 28).strftime("%A") # =&amp;gt; "Saturday"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="a--weekday-name-abbreviated"&gt;%a | Weekday Name (Abbreviated)&lt;/h3&gt;

&lt;p&gt;Locale-independent (English) three-letter name of weekday:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 22).strftime("%a") # =&amp;gt; "Sun"
Time.utc(2016, 5, 23).strftime("%a") # =&amp;gt; "Mon"
Time.utc(2016, 5, 24).strftime("%a") # =&amp;gt; "Tue"
Time.utc(2016, 5, 25).strftime("%a") # =&amp;gt; "Wed"
Time.utc(2016, 5, 26).strftime("%a") # =&amp;gt; "Thu"
Time.utc(2016, 5, 27).strftime("%a") # =&amp;gt; "Fri"
Time.utc(2016, 5, 28).strftime("%a") # =&amp;gt; "Sat"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="d-x--date-american"&gt;%D, %x | Date, American&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%m/%d/%y&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Month&lt;/li&gt;
  &lt;li&gt;Day of Month&lt;/li&gt;
  &lt;li&gt;Year without Century&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%D") # =&amp;gt; "05/24/16"
Time.utc(2016, 5, 24).strftime("%x") # =&amp;gt; "05/24/16"&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="f--date-iso-8601"&gt;%F | Date, ISO 8601&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%Y-%m-%d&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Year&lt;/li&gt;
  &lt;li&gt;Month&lt;/li&gt;
  &lt;li&gt;Day of Month&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%F") # =&amp;gt; "2016-05-24"&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="v--date-vms"&gt;%v | Date, VMS&lt;/h3&gt;

&lt;h4 id="with-timestrftime"&gt;With Time#strftime&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;%_d-%^b-%Y&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Space Padded Day of Month&lt;/li&gt;
  &lt;li&gt;Uppercased Month Name&lt;/li&gt;
  &lt;li&gt;Year&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%v") # =&amp;gt; "24-MAY-2016"&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="with-datestrftime-and-datetimestrftime"&gt;With Date#strftime and DateTime#strftime&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;%_d-%b-%Y&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Space Padded Day of Month&lt;/li&gt;
  &lt;li&gt;Month Name&lt;/li&gt;
  &lt;li&gt;Year&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;require "date"
Time.utc(2016, 5, 24).to_date.strftime("%v") # =&amp;gt; "24-May-2016"&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="daytime-directives"&gt;Daytime Directives&lt;/h2&gt;

&lt;h3 id="p--meridian-indicator-lowercase"&gt;%P | Meridian Indicator (Lowercase)&lt;/h3&gt;

&lt;p&gt;Returns "am" for hours between 0 and 11, returns "pm" for hours between 12 and 23:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%P") # =&amp;gt; "pm"
Time.utc(2016, 5, 24, 3).strftime("%P") # =&amp;gt; "am"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="p--meridian-indicator-uppercase"&gt;%p | Meridian Indicator (Uppercase)&lt;/h3&gt;

&lt;p&gt;Returns "AM" for hours between 0 and 11, returns "PM" for hours between 12 and 23:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%p") # =&amp;gt; "PM"
Time.utc(2016, 5, 24, 3).strftime("%p") # =&amp;gt; "AM"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="hours-directives"&gt;Hours Directives&lt;/h2&gt;

&lt;h3 id="h--hour-of-day-24h-zero-padded--023"&gt;%H | Hour of Day, 24h (Zero Padded) | 0..23&lt;/h3&gt;

&lt;p&gt;Time's hour on the 24h clock:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%H") # =&amp;gt; "15"
Time.utc(2016, 5, 24, 3).strftime("%H") # =&amp;gt; "03"
Time.utc(2016, 5, 24, 3).strftime("%-H") # =&amp;gt; "3"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="k--hour-of-day-24h-space-padded--023"&gt;%k | Hour of Day, 24h (Space Padded) | 0..23&lt;/h3&gt;

&lt;p&gt;Time's hour on the 24h clock:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%k") # =&amp;gt; "15"
Time.utc(2016, 5, 24, 3).strftime("%k") # =&amp;gt; " 3"
Time.utc(2016, 5, 24, 3).strftime("%-k") # =&amp;gt; "3"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="i--hour-of-day-12h-zero-padded--011"&gt;%I | Hour of Day, 12h (Zero Padded) | 0..11&lt;/h3&gt;

&lt;p&gt;Time's hour on the 12h clock:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%I") # =&amp;gt; "03"
Time.utc(2016, 5, 24, 3).strftime("%I") # =&amp;gt; "03"
Time.utc(2016, 5, 24, 3).strftime("%-I") # =&amp;gt; "3"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="l--hour-of-day-12h-space-padded--011"&gt;%l | Hour of Day, 12h (Space Padded) | 0..11&lt;/h3&gt;

&lt;p&gt;Time's hour on the 12h clock:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15).strftime("%l") # =&amp;gt; " 3"
Time.utc(2016, 5, 24, 3).strftime("%l") # =&amp;gt; " 3"
Time.utc(2016, 5, 24, 3).strftime("%-l") # =&amp;gt; "3"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="minutes-directives"&gt;Minutes Directives&lt;/h2&gt;

&lt;h3 id="m--minute-of-hour--0059"&gt;%M | Minute of Hour | 00..59&lt;/h3&gt;

&lt;p&gt;Time's minutes with default padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29).strftime("%M") # =&amp;gt; "29"
Time.utc(2016, 5, 24, 15, 1).strftime("%M") # =&amp;gt; "01"
Time.utc(2016, 5, 24, 15, 1).strftime("%-M") # =&amp;gt; "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="r--time-hour--minute"&gt;%R | Time, Hour + Minute&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%H:%M&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hour (24h)&lt;/li&gt;
  &lt;li&gt;Minute&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29).strftime("%R") # =&amp;gt; "15:29"&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="seconds-directives"&gt;Seconds Directives&lt;/h2&gt;

&lt;h3 id="s--second-of-minute--0060"&gt;%S | Second of Minute | 00..60&lt;/h3&gt;

&lt;p&gt;Time's seconds with default padding of 2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 59).strftime("%S") # =&amp;gt; "59"
Time.utc(2016, 5, 24, 15, 29, 1).strftime("%S") # =&amp;gt; "01"
Time.utc(2016, 5, 24, 15, 29, 1).strftime("%-S") # =&amp;gt; "1"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="s--seconds-since-unix-epoch"&gt;%s | Seconds Since Unix Epoch&lt;/h3&gt;

&lt;p&gt;Number of seconds since &lt;strong&gt;1970-01-01 00:00:00 UTC&lt;/strong&gt;. This known as &lt;a href="https://en.wikipedia.org/wiki/Unix_time"&gt;Unix timestamps&lt;/a&gt;. It returns the same value (as string) like &lt;a href="https://ruby-doc.org/core/Time.html#method-i-to_i"&gt;Time#to_i&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 59).strftime("%s") # =&amp;gt; "1464103799"
Time.utc(2016, 5, 24, 15, 29, 59).to_i # =&amp;gt; 1464103799
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="r--time-hour--minute--second--daytime"&gt;%r | Time, Hour + Minute + Second + Daytime&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%I:%M:%S %p&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hour (12h)&lt;/li&gt;
  &lt;li&gt;Minute&lt;/li&gt;
  &lt;li&gt;Second&lt;/li&gt;
  &lt;li&gt;Daytime&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 59).strftime("%r") # =&amp;gt; "03:29:59 PM"&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="t-x--time-hour--minute--second"&gt;%T, %X | Time, Hour + Minute + Second&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%H:%M:%S&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hour (24h)&lt;/li&gt;
  &lt;li&gt;Minute&lt;/li&gt;
  &lt;li&gt;Second&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 59).strftime("%T") # =&amp;gt; "15:29:59"
Time.utc(2016, 5, 24, 15, 29, 59).strftime("%X") # =&amp;gt; "15:29:59"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="c--date-weekday--month--day-of-month--time--year"&gt;%c | Date, Weekday + Month + Day of Month + Time + Year&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%a %b %e %T %Y&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Weekday (Short)&lt;/li&gt;
  &lt;li&gt;Month (Short)&lt;/li&gt;
  &lt;li&gt;Day of Month&lt;/li&gt;
  &lt;li&gt;Time (24h)&lt;/li&gt;
  &lt;li&gt;Year&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 59).strftime("%c") # =&amp;gt; "Tue May 24 15:29:59 2016"&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="date-date1-style"&gt;%+ | Date, &lt;code&gt;date(1)&lt;/code&gt; Style&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Only available in Date/DateTime's strftime() implementation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;%a %b %e %T %Z %Y&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Weekday (Short)&lt;/li&gt;
  &lt;li&gt;Month (Short)&lt;/li&gt;
  &lt;li&gt;Day of Month&lt;/li&gt;
  &lt;li&gt;Time (24h)&lt;/li&gt;
  &lt;li&gt;Numerical Time Zone Offset&lt;/li&gt;
  &lt;li&gt;Year&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;require "date"
Time.utc(2016, 5, 24, 15, 29, 59).to_datetime.strftime("%+")
# =&amp;gt; "Tue May 24 15:29:59 +00:00 2016"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="smaller-than-seconds-directives"&gt;Smaller Than Seconds Directives&lt;/h2&gt;

&lt;h3 id="l--millisecond--000999"&gt;%L | Millisecond | 000..999&lt;/h3&gt;

&lt;p&gt;Millisecond with default padding of 3. More precise fractions will be truncated:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 0.1239).strftime("%L") # =&amp;gt; "123"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="n--fraction-default-nanosecond"&gt;%N | Fraction, Default: Nanosecond&lt;/h3&gt;

&lt;p&gt;Specifies time fractions like milliseconds (precision of 3), microseconds (precision of 6), or nanoseconds (precision of 9). More precise fractions will be truncated. Cannot be combined with padding:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24, 15, 29, 0.1234567890).strftime("%3N") # =&amp;gt; "123"
Time.utc(2016, 5, 24, 15, 29, 0.1234567890).strftime("%6N") # =&amp;gt; "123456"
Time.utc(2016, 5, 24, 15, 29, 0.1234567890).strftime("%9N") # =&amp;gt; "123456789"
Time.utc(2016, 5, 24, 15, 29, 0.1234567890).strftime("%N") # =&amp;gt; "123456789"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="q--milliseconds-since-unix-epoch"&gt;%Q | Milliseconds Since Unix Epoch&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Only available in Date/DateTime's strftime() implementation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Number of milliseconds since &lt;strong&gt;1970-01-01 00:00:00 UTC&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "date"
Time.utc(2016, 5, 24, 15, 29, 59.012).to_datetime.strftime("%Q") #=&amp;gt; "1464103799012"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="time-zone-directives"&gt;Time Zone Directives&lt;/h2&gt;

&lt;h3 id="z--time-zone-offset-from-utc"&gt;%z | Time Zone, Offset from UTC&lt;/h3&gt;

&lt;p&gt;A numerical &lt;a href="https://en.wikipedia.org/wiki/List_of_UTC_time_offsets"&gt;time zone&lt;/a&gt; identifier in the format of&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sign&lt;/li&gt;
  &lt;li&gt;Two-digit Hour&lt;/li&gt;
  &lt;li&gt;Two-digit Minute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which describes the offset from  &lt;a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time"&gt;UTC&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%z") # =&amp;gt; "+0000"
Time.local(2016, 5, 24).strftime("%z") # =&amp;gt; "+0200"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output separates hours and minutes when using a single &lt;code&gt;:&lt;/code&gt; flag:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.local(2016, 5, 24).strftime("%:z") # =&amp;gt; "+02:00"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will also show the seconds offset when using two &lt;code&gt;::&lt;/code&gt; colons:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.local(2016, 5, 24).strftime("%::z") # =&amp;gt; "+02:00:00"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When using &lt;code&gt;:::&lt;/code&gt;, it will only return significant information (no zero minutes or seconds):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.local(2016, 5, 24).strftime("%:::z") # =&amp;gt; "+02"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="z--time-zone-abbreviated-os-dependent"&gt;%Z | Time Zone, Abbreviated, OS Dependent&lt;/h3&gt;

&lt;h4 id="with-timestrftime-1"&gt;With Time#strftime&lt;/h4&gt;

&lt;p&gt;Big &lt;code&gt;%Z&lt;/code&gt; displays a platform dependent time zone string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016, 5, 24).strftime("%Z") # =&amp;gt; "UTC"
Time.local(2016, 5, 24).strftime("%Z") # =&amp;gt; "CEST"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ruby's documentation disencourages &lt;code&gt;%Z&lt;/code&gt;, because it has a different result on different platforms and also does not properly identify the time zone:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;While all directives are locale independent since Ruby 1.9, &lt;code&gt;%Z&lt;/code&gt; is platform dependent. So, the result may differ even if the same format string is used in other systems such as C.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;%z&lt;/code&gt; is recommended over &lt;code&gt;%Z&lt;/code&gt;. &lt;code&gt;%Z&lt;/code&gt; doesn’t identify the timezone. For example, "CST" is used at America/Chicago (-06:00), America/Havana (-05:00), Asia/Harbin (+08:00), Australia/Darwin (+09:30) and Australia/Adelaide (+10:30). Also, &lt;code&gt;%Z&lt;/code&gt; is highly dependent on the operating system. For example, it may generate a non ASCII string on Japanese Windows. i.e. the result can be different to "JST". So the numeric time zone offset, &lt;code&gt;%z&lt;/code&gt;, is recommended.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="with-datestrftime-and-datetimestrftime-1"&gt;With Date#strftime and DateTime#strftime&lt;/h4&gt;

&lt;p&gt;Date's strftime() implementation outputs a numerical offset, similar to &lt;code&gt;%:z&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "date"
Time.utc(2016, 5, 24).to_datetime.strftime("%Z") # =&amp;gt; "+00:00"
Time.local(2016, 5, 24).to_datetime.strftime("%Z") # =&amp;gt; "+02:00"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="non-interpolating-directives"&gt;Non Interpolating Directives&lt;/h2&gt;

&lt;h3 id="n--newline"&gt;%n | Newline&lt;/h3&gt;

&lt;p&gt;Output a newline:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%n") # =&amp;gt; "\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="t--tab"&gt;%t | Tab&lt;/h3&gt;

&lt;p&gt;Output a tab:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%t") # =&amp;gt; "\t"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="section"&gt;%% | %&lt;/h3&gt;

&lt;p&gt;A single &lt;code&gt;%&lt;/code&gt; needs to be escaped:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.utc(2016).strftime("%%") # =&amp;gt; "%"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-sprintf"&gt;RDoc: Time#strftime&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html#method-i-strftime"&gt;RDoc: Date#strftime&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/strftime.c"&gt;Source: strftime.c&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/ext/date/date_strftime.c"&gt;Source: date_strftime.c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://strftimeslikethese.com/"&gt;Interactive examples: "Strftimes Like These"&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/4-what-the-pack.html"&gt;What the Pack?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/49-what-the-format.html"&gt;What the Format?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/64-what-the-regex.html"&gt;What the Regex?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>US-ASCII-8BIT</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/56-us-ascii-8bit.html"/>
    <id>https://idiosyncratic-ruby.com/56-us-ascii-8bit.html</id>
    <published>2016-05-25T00:00:00Z</published>
    <updated>2016-05-25T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;How come that Ruby has two &lt;a href="https://en.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt; encodings?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Encoding.name_list.grep(/ASCII/)
# =&amp;gt; ["ASCII-8BIT", "US-ASCII"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which one is the &lt;em&gt;normal&lt;/em&gt; one you should use for ASCII?&lt;/p&gt;

&lt;h2 id="aliases"&gt;Aliases&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;ASCII-8BIT&lt;/th&gt;
      &lt;th&gt;US-ASCII&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;BINARY&lt;/td&gt;
      &lt;td&gt;ASCII&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;ANSI_X3.4-1968&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;646&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;So, &lt;strong&gt;US-ASCII&lt;/strong&gt; is aliased to &lt;strong&gt;ASCII&lt;/strong&gt;, but then what is &lt;strong&gt;ASCII-8BIT&lt;/strong&gt; for? &lt;a href="https://ruby-doc.org/core/Encoding.html"&gt;Encodings' RDoc&lt;/a&gt; has some help:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Encoding::ASCII_8BIT is a special encoding that is usually
used for a byte string, not a character string. But as the name insists,
its characters in the range of ASCII are considered as ASCII characters.
This is useful when you use ASCII-8BIT characters with other ASCII
compatible characters.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So basically, it is not a real encoding, but represents an arbitrary stream of bytes (bytes with a value between 0 and 255). It is used for raw byte stream or if you want to make clear that you do not know about a string's encoding!&lt;/p&gt;

&lt;p&gt;The ASCII charset only takes 7 bits, so in strict ASCII, the 8th bit should never be set. The allowed byte value range is from 0 to 127. This is what the &lt;strong&gt;US-ASCII&lt;/strong&gt; encoding is all about: It is used when dealing with ASCII encoded strings. Think: &lt;strong&gt;"ASCII-7BIT"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple example illustrating the difference:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; out_of_ascii_range = 128.chr # =&amp;gt; "\x80"
 out_of_ascii_range.force_encoding("US-ASCII").valid_encoding? # =&amp;gt; false
 out_of_ascii_range.force_encoding("ASCII-8BIT").valid_encoding? # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Struggling Four Equality</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/55-struggling-four-equality.html"/>
    <id>https://idiosyncratic-ruby.com/55-struggling-four-equality.html</id>
    <published>2016-05-24T00:00:00Z</published>
    <updated>2016-05-24T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Another of Ruby's idiosyncrasies is equalness. It's not too complicated, but naming is an issue here.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="four-concepts-of-equalness"&gt;Four Concepts of Equalness&lt;/h2&gt;

&lt;h3 id="equal-object-identity-comparison"&gt;&lt;code&gt;equal?&lt;/code&gt; Object Identity Comparison&lt;/h3&gt;

&lt;p&gt;This one is easy. Two objects should be considered identical. Think: &lt;code&gt;x.object_id == y.object_id&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="equality-equality"&gt;&lt;code&gt;==&lt;/code&gt; Equality Equality&lt;/h3&gt;

&lt;p&gt;This is the usual method to care about. Two objects should be treated the same. If the class supports the &lt;a href="https://ruby-doc.org/core/Comparable.html"&gt;&lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt; spaceship comparison operator&lt;/a&gt;, it is expected that &lt;code&gt;==&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt; for the same values, &lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt; returns &lt;code&gt;0&lt;/code&gt; for.&lt;/p&gt;

&lt;h3 id="eql-hash-key-equality"&gt;&lt;code&gt;eql?&lt;/code&gt; Hash Key Equality&lt;/h3&gt;

&lt;p&gt;Normally, this is the same as &lt;code&gt;==&lt;/code&gt;: &lt;a href="https://ruby-doc.org/core/Hash.html#class-Hash-label-Hash+Keys"&gt;"…&lt;code&gt;eql?&lt;/code&gt; is usually aliased to the overridden &lt;code&gt;==&lt;/code&gt; method"&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most important effect of the result of &lt;code&gt;eql?&lt;/code&gt; is to distinguish between hash keys: &lt;a href="https://ruby-doc.org/core/Hash.html#class-Hash-label-Hash+Keys"&gt;"Two objects refer to the same hash key when their &lt;code&gt;hash&lt;/code&gt; value is identical and the two objects are &lt;code&gt;eql?&lt;/code&gt; to each other"&lt;/a&gt;. A real life example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1 == 1.0 # =&amp;gt; true
1.eql?(1.0) # =&amp;gt; false

# this means that the following will be treated as two different keys
{1: "Idiosyncratic", 1.0 "Hash"}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So &lt;code&gt;eql?&lt;/code&gt; is a little stricter than &lt;code&gt;==&lt;/code&gt;, because it will return &lt;code&gt;false&lt;/code&gt; if two objects are not instances of the same class. A typical implementation looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def eql?(other)
  instance_of?(other.class) &amp;amp;&amp;amp; self == other
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="fancy-equality"&gt;&lt;code&gt;===&lt;/code&gt; Fancy Equality&lt;/h3&gt;

&lt;p&gt;Implicitly used for &lt;code&gt;case&lt;/code&gt; statements. Usually like &lt;code&gt;==&lt;/code&gt;, but can also mean that something has some kind of relationship, like being &lt;a href="https://github.com/janlelis/sig/blob/v1.0.1/lib/sig.rb#L108-L129"&gt;some kind of a class&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="equality-implementations-for-core-classes"&gt;Equality Implementations for Core Classes&lt;/h2&gt;

&lt;table class="table-13-29-29-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Class&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;eql?&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;==&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;===&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Object&lt;/td&gt;
      &lt;td&gt;Identity (like &lt;code&gt;equal?&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;Same as &lt;code&gt;eql?&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Same as &lt;code&gt;==&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Symbol&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Numeric&lt;/td&gt;
      &lt;td&gt;Same type, same value&lt;/td&gt;
      &lt;td&gt;Same value, according to &lt;a href="https://ruby-doc.org/core/Numeric.html#method-i-3C-3D-3E"&gt;spaceship returning &lt;code&gt;0&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;Same length, same contents&lt;/td&gt;
      &lt;td&gt;If other is a String: &lt;code&gt;eql?&lt;/code&gt;, else: &lt;code&gt;other.to_str === self&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Regexp&lt;/td&gt;
      &lt;td&gt;If other is a Regexp: Same pattern, same options, same encoding&lt;/td&gt;
      &lt;td&gt;Same as &lt;code&gt;eql?&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;If other is a String: Match against self&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Array&lt;/td&gt;
      &lt;td&gt;Same length, every element &lt;code&gt;.eql?&lt;/code&gt; corresponding other element&lt;/td&gt;
      &lt;td&gt;Same length, every element &lt;code&gt;==&lt;/code&gt; corresponding other element. Will &lt;a href="/54-try-converting.html"&gt;implicitly convert&lt;/a&gt; other object via &lt;code&gt;.to_ary&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hash&lt;/td&gt;
      &lt;td&gt;Same length, every element &lt;code&gt;==&lt;/code&gt; corresponding other element (order not relevant)&lt;/td&gt;
      &lt;td&gt;Same as &lt;code&gt;eql?&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Module&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;other.is_a?(self)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Class&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;other.is_a?(self)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Meaning of &lt;code&gt;-&lt;/code&gt;: Not defined / Use &lt;code&gt;Object&lt;/code&gt;'s implementation&lt;/p&gt;

&lt;h2 id="best-practices-for-sub-classes"&gt;Best Practices for Sub Classes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Define a meaningful &lt;code&gt;==&lt;/code&gt; which returns &lt;code&gt;true&lt;/code&gt; if two objects should be considered the same&lt;/li&gt;
  &lt;li&gt;Make &lt;code&gt;eql?&lt;/code&gt; return the same value &lt;code&gt;==&lt;/code&gt;, but also limit it to return only &lt;code&gt;true&lt;/code&gt; if both object are instances of the same class&lt;/li&gt;
  &lt;li&gt;Don't redefine &lt;code&gt;equal?&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Be creative with &lt;code&gt;===&lt;/code&gt; (On a reasonable level. Other people using your code expect it to be some kind of useful relationship check)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/dkubb/equalizer"&gt;equalizer: Automatically define &lt;code&gt;==&lt;/code&gt; and &lt;code&gt;eql?&lt;/code&gt; based on the object's instance variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Try Converting</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/54-try-converting.html"/>
    <id>https://idiosyncratic-ruby.com/54-try-converting.html</id>
    <published>2016-05-23T00:00:00Z</published>
    <updated>2016-05-23T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Similar to &lt;a href="/25-meta-methodology.html"&gt;metaprogramming&lt;/a&gt;, Ruby's type conversion system has evolved over time. While the result functions, it is also a little inconsistent and suffers from poor naming. Let's put things in perspective:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="implicit-and-explicit-conversion"&gt;Implicit and Explicit Conversion&lt;/h2&gt;

&lt;p&gt;Ruby objects are usually converted to other classes/types using &lt;code&gt;to_*&lt;/code&gt; functions. For example, converting the &lt;a href="https://ruby-doc.org/core/String.html"&gt;String&lt;/a&gt; &lt;code&gt;"42"&lt;/code&gt; to a &lt;a href="https://ruby-doc.org/core/Float.html"&gt;Float&lt;/a&gt; is done with &lt;code&gt;to_f&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"42".to_f # =&amp;gt; 42.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This process is called &lt;strong&gt;explicit conversion&lt;/strong&gt; (you want the object converted).&lt;/p&gt;

&lt;p&gt;Some classes provide a second way to convert an object: &lt;strong&gt;implicit conversion&lt;/strong&gt; (you expect the object to be of some type).&lt;/p&gt;

&lt;p&gt;The following table shows the defined conversion methods of Ruby's important core classes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Class&lt;/th&gt;
      &lt;th&gt;Explicit Conversion&lt;/th&gt;
      &lt;th&gt;Implicit Conversion&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Array&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_a&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_ary&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hash&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_h&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_hash&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_s&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_str&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Integer&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_int&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Float&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_f&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Complex&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_c&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rational&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Regexp&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_regexp&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;IO&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;to_io&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;In most cases you should just go with the explicit conversion method and you are good.&lt;/p&gt;

&lt;h2 id="expecting-a-specific-type"&gt;Expecting a Specific Type&lt;/h2&gt;

&lt;p&gt;However, things are more complicated in real life. You might, and many of Ruby's core methods do, expect a compatible type that you can deal with. That is where two kinds of indirect conversion methods come into play:&lt;/p&gt;

&lt;h3 id="tryconvert-class-methods-implicit-conversion-or-nil"&gt;&lt;code&gt;.try_convert&lt;/code&gt; Class Methods (Implicit Conversion or &lt;code&gt;nil&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Some of Ruby's core classes have a &lt;code&gt;try_convert&lt;/code&gt; class method. Although its not obvious, which classes have one, and which do not have one (&lt;code&gt;Array&lt;/code&gt; has one, &lt;code&gt;Integer&lt;/code&gt; does not), its semantics are pretty clear: It will convert the object into an instance of the class via the &lt;strong&gt;implicit conversion&lt;/strong&gt; method (e.g. &lt;code&gt;to_ary&lt;/code&gt;), or, if no implicit conversion method is defined, will just return &lt;code&gt;nil&lt;/code&gt;. It will also return &lt;code&gt;nil&lt;/code&gt;, if the result of the conversion is &lt;code&gt;nil&lt;/code&gt;, or &lt;code&gt;nil&lt;/code&gt; was given as argument:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Array.try_convert(42) # =&amp;gt; nil
Array.try_convert(42..43) # =&amp;gt; nil
Array.try_convert([42, 43]) # =&amp;gt; [42, 43]
Array.try_convert(nil) # =&amp;gt; nil

o = Object.new
def o.to_ary() [42] end
Array.try_convert(o) # =&amp;gt; [42]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="uppercased-kernel-methods-special-conversion-or-typeerror"&gt;Uppercased Kernel Methods (Special Conversion or &lt;code&gt;TypeError&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Idiosyncratically, there is a third way of converting values: &lt;em&gt;Uppercased Kernel methods&lt;/em&gt;, like &lt;code&gt;Array()&lt;/code&gt;.¹ The objects you pass in will be converted to the corresponding class, following the following rules:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If there is a &lt;strong&gt;special conversion&lt;/strong&gt;, apply it. See the table below for details and the exact application order (e.g. &lt;code&gt;Array()&lt;/code&gt; does its special conversion &lt;em&gt;after&lt;/em&gt; it tried the two steps below).&lt;/li&gt;
  &lt;li&gt;Unless special conversion gets applied, try to convert via the &lt;strong&gt;implicit conversion&lt;/strong&gt; method&lt;/li&gt;
  &lt;li&gt;If it does not exist, try to convert via the &lt;strong&gt;explicit conversion&lt;/strong&gt; method&lt;/li&gt;
  &lt;li&gt;Raise a &lt;a href="https://ruby-doc.org/core/TypeError.html"&gt;TypeError&lt;/a&gt;² if everything of the above has failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¹ Although defining uppercased methods for your custom classes to create instances of it looks like an interesting idea at first glance, it is rather confusing. Consider defining class&lt;code&gt;.[]&lt;/code&gt; instead, which enables a very similar syntax, but uses the real constant it belongs to. An example of such usage is &lt;a href="https://ruby-doc.org/stdlib/libdoc/set/rdoc/Set.html#method-c-5B-5D"&gt;Set&lt;/a&gt;.&lt;br /&gt;
² Since Ruby 2.6, you can pass in a &lt;code&gt;exception: false&lt;/code&gt; keyword argument to return &lt;code&gt;nil&lt;/code&gt; instead of raising an error&lt;/p&gt;

&lt;h2 id="core-classes-conversion-table"&gt;Core Classes Conversion Table&lt;/h2&gt;

&lt;table class="table-10-20-15-25-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Class&lt;/th&gt;
      &lt;th&gt;&lt;code&gt;.try_convert&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;Kernel Method&lt;/th&gt;
      &lt;th&gt;Kernel Method w/ &lt;code&gt;nil&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;Kernel Method Special&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Array&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Array.html#method-c-try_convert"&gt;Array.try_convert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Array"&gt;Array()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Array(nil) # =&amp;gt; []&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;If &lt;code&gt;:to_ary&lt;/code&gt; and &lt;code&gt;:to_a&lt;/code&gt; did not return an array, it will create single-element array which contains the given value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hash&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Hash.html#method-c-try_convert"&gt;Hash.try_convert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Hash"&gt;Hash()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Hash(nil) # =&amp;gt; {}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Hash([]) # =&amp;gt; {}&lt;/code&gt;. Also remember that you can convert arrays to hashes with &lt;a href="https://ruby-doc.org/core/Hash.html#method-c-5B-5D"&gt;Hash.[]&lt;/a&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-c-try_convert"&gt;String.try_convert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-String"&gt;String()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;String(nil) # =&amp;gt; ""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Integer&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Integer.html#method-c-try_convert"&gt;Integer.try_convert&lt;/a&gt;⁴&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Integer"&gt;Integer()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Integer(nil) # TypeError&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Special behavior for strings: Instead of calling &lt;a href="https://ruby-doc.org/core/String.html#method-i-to_i"&gt;String#to_i&lt;/a&gt;, it will be more rigid². Takes a second argument defining the &lt;a href="https://en.wikipedia.org/wiki/Radix"&gt;numerical base&lt;/a&gt;. Also see ³&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Float&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Float"&gt;Float()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Float(nil) # TypeError&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;- ³&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Complex&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Complex"&gt;Complex()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Complex(nil) # TypeError&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rational&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Rational"&gt;Rational()&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Rational(nil) # TypeError&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Regexp&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#method-c-try_convert"&gt;Regexp.try_convert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;IO&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-c-try_convert"&gt;IO.try_convert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;p&gt;² It will only convert strings that contain exactly an integer. It would not accept "42A", which &lt;code&gt;String#to_i&lt;/code&gt; would happily take. It also accepts &lt;a href="https://idiosyncratic-ruby.com/39-fixed-numbers.html"&gt;radix prefixes and numbers that contain underscores&lt;/a&gt;, so basically it accepts the same format that is valid for direct integer literals in Ruby. Will raise an &lt;code&gt;ArgumentError&lt;/code&gt; if an invalid string is passed in.&lt;br /&gt;
³ It will convert to other low-level numerical types (such as integers and floats) directly, so &lt;code&gt;Float(4)&lt;/code&gt; will &lt;em&gt;not&lt;/em&gt; call &lt;code&gt;4.to_f&lt;/code&gt;&lt;br /&gt;
⁴ Added in Ruby 3.1&lt;/p&gt;

&lt;h2 id="when-to-use-what"&gt;When to Use What?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Prefer &lt;strong&gt;explicit conversion&lt;/strong&gt;: &lt;code&gt;to_*&lt;/code&gt; methods&lt;/li&gt;
  &lt;li&gt;Use &lt;code&gt;.try_convert&lt;/code&gt; for &lt;strong&gt;implicit conversion&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Use the uppercased Kernel methods for their special effects, like &lt;code&gt;Array()&lt;/code&gt; for wrapping single arguments in an arrays, or &lt;code&gt;Integer()&lt;/code&gt; for strict integer conversion&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>The Constant Tree</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/53-the-constant-tree.html"/>
    <id>https://idiosyncratic-ruby.com/53-the-constant-tree.html</id>
    <published>2016-05-22T00:00:00Z</published>
    <updated>2016-05-22T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Generated with Ruby 3.2.2, including RubyGems and &lt;a href="https://stdgems.org/did_you_mean/"&gt;DidYouMean&lt;/a&gt;:&lt;/p&gt;

&lt;pre id="constant-tree"&gt;Object (Class)
├─ARGF (ARGF.class)
├─ARGV (Array)
├─ArgumentError (Class)
├─Array (Class)
├─BasicObject (Class)
│ └─BasicObject → BasicObject
├─Binding (Class)
├─CROSS_COMPILING (NilClass)
├─Class (Class)
├─ClosedQueueError (Class)
├─Comparable (Module)
├─Complex (Class)
│ └─I (Complex)
├─ConditionVariable (Class)
├─Data (Class)
├─DidYouMean (Module)
│ ├─ClassNameChecker (Class)
│ ├─Correctable (Module)
│ ├─Formatter (Class)
│ ├─Jaro (Module)
│ ├─JaroWinkler (Module)
│ │ ├─THRESHOLD (Float)
│ │ └─WEIGHT (Float)
│ ├─KeyErrorChecker (Class)
│ ├─Levenshtein (Module)
│ ├─MethodNameChecker (Class)
│ │ ├─NAMES_TO_EXCLUDE (Hash)
│ │ └─RB_RESERVED_WORDS (Array)
│ ├─NameErrorCheckers (Object)
│ ├─NullChecker (Class)
│ ├─PatternKeyNameChecker (Class)
│ ├─PlainFormatter (Class)
│ ├─RequirePathChecker (Class)
│ ├─SPELL_CHECKERS (DidYouMean::DeprecatedMapping)
│ ├─SpellChecker (Class)
│ ├─TreeSpellChecker (Class)
│ ├─VERSION (String)
│ └─VariableNameChecker (Class)
│   ├─NAMES_TO_EXCLUDE (Hash)
│   └─RB_RESERVED_WORDS (Array)
├─Dir (Class)
├─ENV (Object)
├─EOFError (Class)
├─Encoding (Class)
│ ├─ANSI_X3_4_1968 (Encoding)
│ ├─ASCII (Encoding)
│ ├─ASCII_8BIT (Encoding)
│ ├─BIG5 (Encoding)
│ ├─BIG5_HKSCS (Encoding)
│ ├─BIG5_HKSCS_2008 (Encoding)
│ ├─BIG5_UAO (Encoding)
│ ├─BINARY (Encoding)
│ ├─Big5 (Encoding)
│ ├─Big5_HKSCS (Encoding)
│ ├─Big5_HKSCS_2008 (Encoding)
│ ├─Big5_UAO (Encoding)
│ ├─CESU_8 (Encoding)
│ ├─CP1250 (Encoding)
│ ├─CP1251 (Encoding)
│ ├─CP1252 (Encoding)
│ ├─CP1253 (Encoding)
│ ├─CP1254 (Encoding)
│ ├─CP1255 (Encoding)
│ ├─CP1256 (Encoding)
│ ├─CP1257 (Encoding)
│ ├─CP1258 (Encoding)
│ ├─CP437 (Encoding)
│ ├─CP50220 (Encoding)
│ ├─CP50221 (Encoding)
│ ├─CP51932 (Encoding)
│ ├─CP65000 (Encoding)
│ ├─CP65001 (Encoding)
│ ├─CP720 (Encoding)
│ ├─CP737 (Encoding)
│ ├─CP775 (Encoding)
│ ├─CP850 (Encoding)
│ ├─CP852 (Encoding)
│ ├─CP855 (Encoding)
│ ├─CP857 (Encoding)
│ ├─CP860 (Encoding)
│ ├─CP861 (Encoding)
│ ├─CP862 (Encoding)
│ ├─CP863 (Encoding)
│ ├─CP864 (Encoding)
│ ├─CP865 (Encoding)
│ ├─CP866 (Encoding)
│ ├─CP869 (Encoding)
│ ├─CP874 (Encoding)
│ ├─CP878 (Encoding)
│ ├─CP932 (Encoding)
│ ├─CP936 (Encoding)
│ ├─CP949 (Encoding)
│ ├─CP950 (Encoding)
│ ├─CP951 (Encoding)
│ ├─CSWINDOWS31J (Encoding)
│ ├─CompatibilityError (Class)
│ ├─Converter (Class)
│ │ ├─AFTER_OUTPUT (Integer)
│ │ ├─CRLF_NEWLINE_DECORATOR (Integer)
│ │ ├─CR_NEWLINE_DECORATOR (Integer)
│ │ ├─INVALID_MASK (Integer)
│ │ ├─INVALID_REPLACE (Integer)
│ │ ├─LF_NEWLINE_DECORATOR (Integer)
│ │ ├─PARTIAL_INPUT (Integer)
│ │ ├─UNDEF_HEX_CHARREF (Integer)
│ │ ├─UNDEF_MASK (Integer)
│ │ ├─UNDEF_REPLACE (Integer)
│ │ ├─UNIVERSAL_NEWLINE_DECORATOR (Integer)
│ │ ├─XML_ATTR_CONTENT_DECORATOR (Integer)
│ │ ├─XML_ATTR_QUOTE_DECORATOR (Integer)
│ │ └─XML_TEXT_DECORATOR (Integer)
│ ├─ConverterNotFoundError (Class)
│ ├─CsWindows31J (Encoding)
│ ├─EBCDIC_CP_US (Encoding)
│ ├─EMACS_MULE (Encoding)
│ ├─EUCCN (Encoding)
│ ├─EUCJP (Encoding)
│ ├─EUCJP_MS (Encoding)
│ ├─EUCKR (Encoding)
│ ├─EUCTW (Encoding)
│ ├─EUC_CN (Encoding)
│ ├─EUC_JISX0213 (Encoding)
│ ├─EUC_JIS_2004 (Encoding)
│ ├─EUC_JP (Encoding)
│ ├─EUC_JP_MS (Encoding)
│ ├─EUC_KR (Encoding)
│ ├─EUC_TW (Encoding)
│ ├─Emacs_Mule (Encoding)
│ ├─EucCN (Encoding)
│ ├─EucJP (Encoding)
│ ├─EucJP_ms (Encoding)
│ ├─EucKR (Encoding)
│ ├─EucTW (Encoding)
│ ├─GB12345 (Encoding)
│ ├─GB18030 (Encoding)
│ ├─GB1988 (Encoding)
│ ├─GB2312 (Encoding)
│ ├─GBK (Encoding)
│ ├─IBM037 (Encoding)
│ ├─IBM437 (Encoding)
│ ├─IBM720 (Encoding)
│ ├─IBM737 (Encoding)
│ ├─IBM775 (Encoding)
│ ├─IBM850 (Encoding)
│ ├─IBM852 (Encoding)
│ ├─IBM855 (Encoding)
│ ├─IBM857 (Encoding)
│ ├─IBM860 (Encoding)
│ ├─IBM861 (Encoding)
│ ├─IBM862 (Encoding)
│ ├─IBM863 (Encoding)
│ ├─IBM864 (Encoding)
│ ├─IBM865 (Encoding)
│ ├─IBM866 (Encoding)
│ ├─IBM869 (Encoding)
│ ├─ISO2022_JP (Encoding)
│ ├─ISO2022_JP2 (Encoding)
│ ├─ISO8859_1 (Encoding)
│ ├─ISO8859_10 (Encoding)
│ ├─ISO8859_11 (Encoding)
│ ├─ISO8859_13 (Encoding)
│ ├─ISO8859_14 (Encoding)
│ ├─ISO8859_15 (Encoding)
│ ├─ISO8859_16 (Encoding)
│ ├─ISO8859_2 (Encoding)
│ ├─ISO8859_3 (Encoding)
│ ├─ISO8859_4 (Encoding)
│ ├─ISO8859_5 (Encoding)
│ ├─ISO8859_6 (Encoding)
│ ├─ISO8859_7 (Encoding)
│ ├─ISO8859_8 (Encoding)
│ ├─ISO8859_9 (Encoding)
│ ├─ISO_2022_JP (Encoding)
│ ├─ISO_2022_JP_2 (Encoding)
│ ├─ISO_2022_JP_KDDI (Encoding)
│ ├─ISO_8859_1 (Encoding)
│ ├─ISO_8859_10 (Encoding)
│ ├─ISO_8859_11 (Encoding)
│ ├─ISO_8859_13 (Encoding)
│ ├─ISO_8859_14 (Encoding)
│ ├─ISO_8859_15 (Encoding)
│ ├─ISO_8859_16 (Encoding)
│ ├─ISO_8859_2 (Encoding)
│ ├─ISO_8859_3 (Encoding)
│ ├─ISO_8859_4 (Encoding)
│ ├─ISO_8859_5 (Encoding)
│ ├─ISO_8859_6 (Encoding)
│ ├─ISO_8859_7 (Encoding)
│ ├─ISO_8859_8 (Encoding)
│ ├─ISO_8859_9 (Encoding)
│ ├─InvalidByteSequenceError (Class)
│ ├─KOI8_R (Encoding)
│ ├─KOI8_U (Encoding)
│ ├─MACCENTEURO (Encoding)
│ ├─MACCROATIAN (Encoding)
│ ├─MACCYRILLIC (Encoding)
│ ├─MACGREEK (Encoding)
│ ├─MACICELAND (Encoding)
│ ├─MACJAPAN (Encoding)
│ ├─MACJAPANESE (Encoding)
│ ├─MACROMAN (Encoding)
│ ├─MACROMANIA (Encoding)
│ ├─MACTHAI (Encoding)
│ ├─MACTURKISH (Encoding)
│ ├─MACUKRAINE (Encoding)
│ ├─MacCentEuro (Encoding)
│ ├─MacCroatian (Encoding)
│ ├─MacCyrillic (Encoding)
│ ├─MacGreek (Encoding)
│ ├─MacIceland (Encoding)
│ ├─MacJapan (Encoding)
│ ├─MacJapanese (Encoding)
│ ├─MacRoman (Encoding)
│ ├─MacRomania (Encoding)
│ ├─MacThai (Encoding)
│ ├─MacTurkish (Encoding)
│ ├─MacUkraine (Encoding)
│ ├─PCK (Encoding)
│ ├─SHIFT_JIS (Encoding)
│ ├─SJIS (Encoding)
│ ├─SJIS_DOCOMO (Encoding)
│ ├─SJIS_DoCoMo (Encoding)
│ ├─SJIS_KDDI (Encoding)
│ ├─SJIS_SOFTBANK (Encoding)
│ ├─SJIS_SoftBank (Encoding)
│ ├─STATELESS_ISO_2022_JP (Encoding)
│ ├─STATELESS_ISO_2022_JP_KDDI (Encoding)
│ ├─Shift_JIS (Encoding)
│ ├─Stateless_ISO_2022_JP (Encoding)
│ ├─Stateless_ISO_2022_JP_KDDI (Encoding)
│ ├─TIS_620 (Encoding)
│ ├─UCS_2BE (Encoding)
│ ├─UCS_4BE (Encoding)
│ ├─UCS_4LE (Encoding)
│ ├─US_ASCII (Encoding)
│ ├─UTF8_DOCOMO (Encoding)
│ ├─UTF8_DoCoMo (Encoding)
│ ├─UTF8_KDDI (Encoding)
│ ├─UTF8_MAC (Encoding)
│ ├─UTF8_SOFTBANK (Encoding)
│ ├─UTF8_SoftBank (Encoding)
│ ├─UTF_16 (Encoding)
│ ├─UTF_16BE (Encoding)
│ ├─UTF_16LE (Encoding)
│ ├─UTF_32 (Encoding)
│ ├─UTF_32BE (Encoding)
│ ├─UTF_32LE (Encoding)
│ ├─UTF_7 (Encoding)
│ ├─UTF_8 (Encoding)
│ ├─UTF_8_HFS (Encoding)
│ ├─UTF_8_MAC (Encoding)
│ ├─UndefinedConversionError (Class)
│ ├─WINDOWS_1250 (Encoding)
│ ├─WINDOWS_1251 (Encoding)
│ ├─WINDOWS_1252 (Encoding)
│ ├─WINDOWS_1253 (Encoding)
│ ├─WINDOWS_1254 (Encoding)
│ ├─WINDOWS_1255 (Encoding)
│ ├─WINDOWS_1256 (Encoding)
│ ├─WINDOWS_1257 (Encoding)
│ ├─WINDOWS_1258 (Encoding)
│ ├─WINDOWS_31J (Encoding)
│ ├─WINDOWS_874 (Encoding)
│ ├─Windows_1250 (Encoding)
│ ├─Windows_1251 (Encoding)
│ ├─Windows_1252 (Encoding)
│ ├─Windows_1253 (Encoding)
│ ├─Windows_1254 (Encoding)
│ ├─Windows_1255 (Encoding)
│ ├─Windows_1256 (Encoding)
│ ├─Windows_1257 (Encoding)
│ ├─Windows_1258 (Encoding)
│ ├─Windows_31J (Encoding)
│ └─Windows_874 (Encoding)
├─EncodingError (Class)
├─Enumerable (Module)
├─Enumerator (Class)
│ ├─ArithmeticSequence (Class)
│ ├─Chain (Class)
│ ├─Generator (Class)
│ ├─Lazy (Class)
│ ├─Producer (Class)
│ ├─Product (Class)
│ └─Yielder (Class)
├─Errno (Module)
│ ├─E2BIG (Class)
│ │ └─Errno (Integer)
│ ├─EACCES (Class)
│ │ └─Errno (Integer)
│ ├─EADDRINUSE (Class)
│ │ └─Errno (Integer)
│ ├─EADDRNOTAVAIL (Class)
│ │ └─Errno (Integer)
│ ├─EADV (Class)
│ │ └─Errno (Integer)
│ ├─EAFNOSUPPORT (Class)
│ │ └─Errno (Integer)
│ ├─EAGAIN (Class)
│ │ └─Errno (Integer)
│ ├─EALREADY (Class)
│ │ └─Errno (Integer)
│ ├─EAUTH (Class)
│ │ └─Errno (Integer)
│ ├─EBADARCH (Class)
│ │ └─Errno (Integer)
│ ├─EBADE (Class)
│ │ └─Errno (Integer)
│ ├─EBADEXEC (Class)
│ │ └─Errno (Integer)
│ ├─EBADF (Class)
│ │ └─Errno (Integer)
│ ├─EBADFD (Class)
│ │ └─Errno (Integer)
│ ├─EBADMACHO (Class)
│ │ └─Errno (Integer)
│ ├─EBADMSG (Class)
│ │ └─Errno (Integer)
│ ├─EBADR (Class)
│ │ └─Errno (Integer)
│ ├─EBADRPC (Class)
│ │ └─Errno (Integer)
│ ├─EBADRQC (Class)
│ │ └─Errno (Integer)
│ ├─EBADSLT (Class)
│ │ └─Errno (Integer)
│ ├─EBFONT (Class)
│ │ └─Errno (Integer)
│ ├─EBUSY (Class)
│ │ └─Errno (Integer)
│ ├─ECANCELED (Class)
│ │ └─Errno (Integer)
│ ├─ECAPMODE (Class)
│ │ └─Errno (Integer)
│ ├─ECHILD (Class)
│ │ └─Errno (Integer)
│ ├─ECHRNG (Class)
│ │ └─Errno (Integer)
│ ├─ECOMM (Class)
│ │ └─Errno (Integer)
│ ├─ECONNABORTED (Class)
│ │ └─Errno (Integer)
│ ├─ECONNREFUSED (Class)
│ │ └─Errno (Integer)
│ ├─ECONNRESET (Class)
│ │ └─Errno (Integer)
│ ├─EDEADLK (Class)
│ │ └─Errno (Integer)
│ ├─EDEADLOCK (Class)
│ │ └─Errno (Integer)
│ ├─EDESTADDRREQ (Class)
│ │ └─Errno (Integer)
│ ├─EDEVERR (Class)
│ │ └─Errno (Integer)
│ ├─EDOM (Class)
│ │ └─Errno (Integer)
│ ├─EDOOFUS (Class)
│ │ └─Errno (Integer)
│ ├─EDOTDOT (Class)
│ │ └─Errno (Integer)
│ ├─EDQUOT (Class)
│ │ └─Errno (Integer)
│ ├─EEXIST (Class)
│ │ └─Errno (Integer)
│ ├─EFAULT (Class)
│ │ └─Errno (Integer)
│ ├─EFBIG (Class)
│ │ └─Errno (Integer)
│ ├─EFTYPE (Class)
│ │ └─Errno (Integer)
│ ├─EHOSTDOWN (Class)
│ │ └─Errno (Integer)
│ ├─EHOSTUNREACH (Class)
│ │ └─Errno (Integer)
│ ├─EHWPOISON (Class)
│ │ └─Errno (Integer)
│ ├─EIDRM (Class)
│ │ └─Errno (Integer)
│ ├─EILSEQ (Class)
│ │ └─Errno (Integer)
│ ├─EINPROGRESS (Class)
│ │ └─Errno (Integer)
│ ├─EINTR (Class)
│ │ └─Errno (Integer)
│ ├─EINVAL (Class)
│ │ └─Errno (Integer)
│ ├─EIO (Class)
│ │ └─Errno (Integer)
│ ├─EIPSEC (Class)
│ │ └─Errno (Integer)
│ ├─EISCONN (Class)
│ │ └─Errno (Integer)
│ ├─EISDIR (Class)
│ │ └─Errno (Integer)
│ ├─EISNAM (Class)
│ │ └─Errno (Integer)
│ ├─EKEYEXPIRED (Class)
│ │ └─Errno (Integer)
│ ├─EKEYREJECTED (Class)
│ │ └─Errno (Integer)
│ ├─EKEYREVOKED (Class)
│ │ └─Errno (Integer)
│ ├─EL2HLT (Class)
│ │ └─Errno (Integer)
│ ├─EL2NSYNC (Class)
│ │ └─Errno (Integer)
│ ├─EL3HLT (Class)
│ │ └─Errno (Integer)
│ ├─EL3RST (Class)
│ │ └─Errno (Integer)
│ ├─ELAST (Class)
│ │ └─Errno (Integer)
│ ├─ELIBACC (Class)
│ │ └─Errno (Integer)
│ ├─ELIBBAD (Class)
│ │ └─Errno (Integer)
│ ├─ELIBEXEC (Class)
│ │ └─Errno (Integer)
│ ├─ELIBMAX (Class)
│ │ └─Errno (Integer)
│ ├─ELIBSCN (Class)
│ │ └─Errno (Integer)
│ ├─ELNRNG (Class)
│ │ └─Errno (Integer)
│ ├─ELOOP (Class)
│ │ └─Errno (Integer)
│ ├─EMEDIUMTYPE (Class)
│ │ └─Errno (Integer)
│ ├─EMFILE (Class)
│ │ └─Errno (Integer)
│ ├─EMLINK (Class)
│ │ └─Errno (Integer)
│ ├─EMSGSIZE (Class)
│ │ └─Errno (Integer)
│ ├─EMULTIHOP (Class)
│ │ └─Errno (Integer)
│ ├─ENAMETOOLONG (Class)
│ │ └─Errno (Integer)
│ ├─ENAVAIL (Class)
│ │ └─Errno (Integer)
│ ├─ENEEDAUTH (Class)
│ │ └─Errno (Integer)
│ ├─ENETDOWN (Class)
│ │ └─Errno (Integer)
│ ├─ENETRESET (Class)
│ │ └─Errno (Integer)
│ ├─ENETUNREACH (Class)
│ │ └─Errno (Integer)
│ ├─ENFILE (Class)
│ │ └─Errno (Integer)
│ ├─ENOANO (Class)
│ │ └─Errno (Integer)
│ ├─ENOATTR (Class)
│ │ └─Errno (Integer)
│ ├─ENOBUFS (Class)
│ │ └─Errno (Integer)
│ ├─ENOCSI (Class)
│ │ └─Errno (Integer)
│ ├─ENODATA (Class)
│ │ └─Errno (Integer)
│ ├─ENODEV (Class)
│ │ └─Errno (Integer)
│ ├─ENOENT (Class)
│ │ └─Errno (Integer)
│ ├─ENOEXEC (Class)
│ │ └─Errno (Integer)
│ ├─ENOKEY (Class)
│ │ └─Errno (Integer)
│ ├─ENOLCK (Class)
│ │ └─Errno (Integer)
│ ├─ENOLINK (Class)
│ │ └─Errno (Integer)
│ ├─ENOMEDIUM (Class)
│ │ └─Errno (Integer)
│ ├─ENOMEM (Class)
│ │ └─Errno (Integer)
│ ├─ENOMSG (Class)
│ │ └─Errno (Integer)
│ ├─ENONET (Class)
│ │ └─Errno (Integer)
│ ├─ENOPKG (Class)
│ │ └─Errno (Integer)
│ ├─ENOPOLICY (Class)
│ │ └─Errno (Integer)
│ ├─ENOPROTOOPT (Class)
│ │ └─Errno (Integer)
│ ├─ENOSPC (Class)
│ │ └─Errno (Integer)
│ ├─ENOSR (Class)
│ │ └─Errno (Integer)
│ ├─ENOSTR (Class)
│ │ └─Errno (Integer)
│ ├─ENOSYS (Class)
│ │ └─Errno (Integer)
│ ├─ENOTBLK (Class)
│ │ └─Errno (Integer)
│ ├─ENOTCAPABLE (Class)
│ │ └─Errno (Integer)
│ ├─ENOTCONN (Class)
│ │ └─Errno (Integer)
│ ├─ENOTDIR (Class)
│ │ └─Errno (Integer)
│ ├─ENOTEMPTY (Class)
│ │ └─Errno (Integer)
│ ├─ENOTNAM (Class)
│ │ └─Errno (Integer)
│ ├─ENOTRECOVERABLE (Class)
│ │ └─Errno (Integer)
│ ├─ENOTSOCK (Class)
│ │ └─Errno (Integer)
│ ├─ENOTSUP (Class)
│ │ └─Errno (Integer)
│ ├─ENOTTY (Class)
│ │ └─Errno (Integer)
│ ├─ENOTUNIQ (Class)
│ │ └─Errno (Integer)
│ ├─ENXIO (Class)
│ │ └─Errno (Integer)
│ ├─EOPNOTSUPP (Class)
│ │ └─Errno (Integer)
│ ├─EOVERFLOW (Class)
│ │ └─Errno (Integer)
│ ├─EOWNERDEAD (Class)
│ │ └─Errno (Integer)
│ ├─EPERM (Class)
│ │ └─Errno (Integer)
│ ├─EPFNOSUPPORT (Class)
│ │ └─Errno (Integer)
│ ├─EPIPE (Class)
│ │ └─Errno (Integer)
│ ├─EPROCLIM (Class)
│ │ └─Errno (Integer)
│ ├─EPROCUNAVAIL (Class)
│ │ └─Errno (Integer)
│ ├─EPROGMISMATCH (Class)
│ │ └─Errno (Integer)
│ ├─EPROGUNAVAIL (Class)
│ │ └─Errno (Integer)
│ ├─EPROTO (Class)
│ │ └─Errno (Integer)
│ ├─EPROTONOSUPPORT (Class)
│ │ └─Errno (Integer)
│ ├─EPROTOTYPE (Class)
│ │ └─Errno (Integer)
│ ├─EPWROFF (Class)
│ │ └─Errno (Integer)
│ ├─EQFULL (Class)
│ │ └─Errno (Integer)
│ ├─ERANGE (Class)
│ │ └─Errno (Integer)
│ ├─EREMCHG (Class)
│ │ └─Errno (Integer)
│ ├─EREMOTE (Class)
│ │ └─Errno (Integer)
│ ├─EREMOTEIO (Class)
│ │ └─Errno (Integer)
│ ├─ERESTART (Class)
│ │ └─Errno (Integer)
│ ├─ERFKILL (Class)
│ │ └─Errno (Integer)
│ ├─EROFS (Class)
│ │ └─Errno (Integer)
│ ├─ERPCMISMATCH (Class)
│ │ └─Errno (Integer)
│ ├─ESHLIBVERS (Class)
│ │ └─Errno (Integer)
│ ├─ESHUTDOWN (Class)
│ │ └─Errno (Integer)
│ ├─ESOCKTNOSUPPORT (Class)
│ │ └─Errno (Integer)
│ ├─ESPIPE (Class)
│ │ └─Errno (Integer)
│ ├─ESRCH (Class)
│ │ └─Errno (Integer)
│ ├─ESRMNT (Class)
│ │ └─Errno (Integer)
│ ├─ESTALE (Class)
│ │ └─Errno (Integer)
│ ├─ESTRPIPE (Class)
│ │ └─Errno (Integer)
│ ├─ETIME (Class)
│ │ └─Errno (Integer)
│ ├─ETIMEDOUT (Class)
│ │ └─Errno (Integer)
│ ├─ETOOMANYREFS (Class)
│ │ └─Errno (Integer)
│ ├─ETXTBSY (Class)
│ │ └─Errno (Integer)
│ ├─EUCLEAN (Class)
│ │ └─Errno (Integer)
│ ├─EUNATCH (Class)
│ │ └─Errno (Integer)
│ ├─EUSERS (Class)
│ │ └─Errno (Integer)
│ ├─EWOULDBLOCK (Class)
│ │ └─Errno (Integer)
│ ├─EXDEV (Class)
│ │ └─Errno (Integer)
│ ├─EXFULL (Class)
│ │ └─Errno (Integer)
│ └─NOERROR (Class)
│   └─Errno (Integer)
├─ErrorHighlight (Module)
│ ├─CoreExt (Module)
│ ├─DefaultFormatter (Class)
│ └─VERSION (String)
├─Exception (Class)
├─FalseClass (Class)
├─Fiber (Class)
├─FiberError (Class)
├─File (Class)
│ ├─ALT_SEPARATOR (NilClass)
│ ├─Constants (Module)
│ │ ├─APPEND (Integer)
│ │ ├─BINARY (Integer)
│ │ ├─CREAT (Integer)
│ │ ├─DIRECT (Integer)
│ │ ├─DSYNC (Integer)
│ │ ├─EXCL (Integer)
│ │ ├─FNM_CASEFOLD (Integer)
│ │ ├─FNM_DOTMATCH (Integer)
│ │ ├─FNM_EXTGLOB (Integer)
│ │ ├─FNM_NOESCAPE (Integer)
│ │ ├─FNM_PATHNAME (Integer)
│ │ ├─FNM_SHORTNAME (Integer)
│ │ ├─FNM_SYSCASE (Integer)
│ │ ├─LOCK_EX (Integer)
│ │ ├─LOCK_NB (Integer)
│ │ ├─LOCK_SH (Integer)
│ │ ├─LOCK_UN (Integer)
│ │ ├─NOATIME (Integer)
│ │ ├─NOCTTY (Integer)
│ │ ├─NOFOLLOW (Integer)
│ │ ├─NONBLOCK (Integer)
│ │ ├─NULL (String)
│ │ ├─RDONLY (Integer)
│ │ ├─RDWR (Integer)
│ │ ├─RSYNC (Integer)
│ │ ├─SHARE_DELETE (Integer)
│ │ ├─SYNC (Integer)
│ │ ├─TMPFILE (Integer)
│ │ ├─TRUNC (Integer)
│ │ └─WRONLY (Integer)
│ ├─PATH_SEPARATOR (String)
│ ├─SEPARATOR (String)
│ ├─Separator (String)
│ └─Stat (Class)
├─FileTest (Module)
├─Float (Class)
│ ├─DIG (Integer)
│ ├─EPSILON (Float)
│ ├─INFINITY (Float)
│ ├─MANT_DIG (Integer)
│ ├─MAX (Float)
│ ├─MAX_10_EXP (Integer)
│ ├─MAX_EXP (Integer)
│ ├─MIN (Float)
│ ├─MIN_10_EXP (Integer)
│ ├─MIN_EXP (Integer)
│ ├─NAN (Float)
│ └─RADIX (Integer)
├─FloatDomainError (Class)
├─FrozenError (Class)
├─GC (Module)
│ ├─INTERNAL_CONSTANTS (Hash)
│ ├─OPTS (Array)
│ └─Profiler (Module)
├─Gem (Module)
│ ├─BUNDLED_GEMS (Module)
│ │ ├─ARCHDIR (String)
│ │ ├─DLEXT (Regexp)
│ │ ├─EXACT (Hash)
│ │ ├─LIBDIR (String)
│ │ ├─LIBEXT (Regexp)
│ │ ├─PREFIXED (Hash)
│ │ ├─SINCE (Hash)
│ │ └─WARNED (Hash)
│ ├─BasicSpecification (Class)
│ ├─CIDetector (Module)
│ │ ├─ENV_DESCRIPTORS (Hash)
│ │ └─ENV_INDICATORS (Array)
│ ├─CommandLineError (Class)
│ ├─ConfigFile (Class)
│ │ ├─DEFAULT_BACKTRACE (TrueClass)
│ │ ├─DEFAULT_BULK_THRESHOLD (Integer)
│ │ ├─DEFAULT_CERT_EXPIRATION_LENGTH_DAYS (Integer)
│ │ ├─DEFAULT_CONCURRENT_DOWNLOADS (Integer)
│ │ ├─DEFAULT_IPV4_FALLBACK_ENABLED (FalseClass)
│ │ ├─DEFAULT_UPDATE_SOURCES (TrueClass)
│ │ ├─DEFAULT_VERBOSITY (TrueClass)
│ │ ├─OPERATING_SYSTEM_DEFAULTS (Hash)
│ │ ├─PLATFORM_DEFAULTS (Hash)
│ │ ├─SYSTEM_CONFIG_PATH (String)
│ │ └─SYSTEM_WIDE_CONFIG_FILE (String)
│ ├─ConfigMap (Hash)
│ ├─ConflictError (Class)
│ ├─DEFAULT_HOST (String)
│ ├─Dependency (Class)
│ │ └─TYPES (Array)
│ ├─DependencyError (Class)
│ ├─DependencyList (Class)
│ ├─DependencyRemovalException (Class)
│ ├─DependencyResolutionError (Class)
│ ├─Deprecate (Module)
│ ├─DocumentError (Class)
│ ├─EndOfYAMLException (Class)
│ ├─ErrorReason (Class)
│ ├─Exception (Class)
│ ├─FilePermissionError (Class)
│ ├─FormatException (Class)
│ ├─GEM_DEP_FILES (Array)
│ ├─GemNotFoundException (Class)
│ ├─GemNotInHomeException (Class)
│ ├─ImpossibleDependenciesError (Class)
│ ├─InstallError (Class)
│ ├─Installer (Class)
│ │ ├─ENV_PATHS (Array)
│ │ ├─ExtensionBuildError (Class)
│ │ └─FakePackage (Class)
│ ├─InvalidSpecificationException (Class)
│ ├─LOADED_SPECS_MUTEX (Thread::Mutex)
│ ├─Licenses (Class)
│ │ ├─DEPRECATED_EXCEPTION_IDENTIFIERS (Array)
│ │ ├─DEPRECATED_EXCEPTION_REGEXP (Regexp)
│ │ ├─DEPRECATED_LICENSE_IDENTIFIERS (Array)
│ │ ├─DEPRECATED_LICENSE_REGEXP (Regexp)
│ │ ├─EXCEPTION_IDENTIFIERS (Array)
│ │ ├─LICENSE_IDENTIFIERS (Array)
│ │ ├─LICENSE_REF (String)
│ │ ├─NONSTANDARD (String)
│ │ └─VALID_REGEXP (Regexp)
│ ├─List (Class)
│ ├─LoadError (Class)
│ ├─MARSHAL_SPEC_DIR (String)
│ ├─MissingSpecError (Class)
│ ├─MissingSpecVersionError (Class)
│ ├─NameTuple (Class)
│ ├─OperationNotSupportedError (Class)
│ ├─PathSupport (Class)
│ ├─Platform (Class)
│ │ ├─CURRENT (String)
│ │ └─RUBY (String)
│ ├─PlatformMismatch (Class)
│ ├─REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES (Array)
│ ├─REPOSITORY_SUBDIRECTORIES (Array)
│ ├─RUBYGEMS_DIR (String)
│ ├─RbConfigPriorities (Array)
│ ├─RemoteError (Class)
│ ├─RemoteInstallationCancelled (Class)
│ ├─RemoteInstallationSkipped (Class)
│ ├─RemoteSourceException (Class)
│ ├─RequestSet (Class)
│ │ ├─GemDependencyAPI (Class)
│ │ │ ├─ENGINE_MAP (Hash)
│ │ │ ├─PLATFORM_MAP (Hash)
│ │ │ ├─VERSION_MAP (Hash)
│ │ │ └─WINDOWS (Hash)
│ │ └─Lockfile (Class)
│ │   ├─ParseError (Class)
│ │   ├─Parser (Class)
│ │   └─Tokenizer (Class)
│ │     ├─EOF (Gem::RequestSet::Lockfile::Tokenizer::Token)
│ │     └─Token (Class)
│ ├─Requirement (Class)
│ │ ├─BadRequirementError (Class)
│ │ ├─DefaultPrereleaseRequirement (Array)
│ │ ├─DefaultRequirement (Array)
│ │ ├─OPS (Hash)
│ │ ├─PATTERN (Regexp)
│ │ ├─PATTERN_RAW (String)
│ │ └─SOURCE_SET_REQUIREMENT (#&amp;lt;Class:0x00007fa4ce6f7a00&amp;gt;)
│ ├─Resolver (Class)
│ │ ├─APISet (Class)
│ │ │ └─GemParser (Class)
│ │ ├─APISpecification (Class)
│ │ ├─ActivationRequest (Class)
│ │ ├─BestSet (Class)
│ │ ├─ComposedSet (Class)
│ │ ├─Conflict (Class)
│ │ ├─CurrentSet (Class)
│ │ ├─DEBUG_RESOLVER (FalseClass)
│ │ ├─DependencyRequest (Class)
│ │ ├─GitSet (Class)
│ │ ├─GitSpecification (Class)
│ │ ├─IndexSet (Class)
│ │ ├─IndexSpecification (Class)
│ │ ├─InstalledSpecification (Class)
│ │ ├─InstallerSet (Class)
│ │ ├─LocalSpecification (Class)
│ │ ├─LockSet (Class)
│ │ ├─LockSpecification (Class)
│ │ ├─Molinillo (Module)
│ │ │ ├─CircularDependencyError (Class)
│ │ │ ├─Delegates (Module)
│ │ │ │ ├─ResolutionState (Module)
│ │ │ │ └─SpecificationProvider (Module)
│ │ │ ├─DependencyGraph (Class)
│ │ │ │ ├─Action (Class)
│ │ │ │ ├─AddEdgeNoCircular (Class)
│ │ │ │ ├─AddVertex (Class)
│ │ │ │ ├─DeleteEdge (Class)
│ │ │ │ ├─DetachVertexNamed (Class)
│ │ │ │ ├─Edge (Class)
│ │ │ │ ├─Log (Class)
│ │ │ │ ├─SetPayload (Class)
│ │ │ │ ├─Tag (Class)
│ │ │ │ └─Vertex (Class)
│ │ │ ├─DependencyState (Class)
│ │ │ ├─NoSuchDependencyError (Class)
│ │ │ ├─PossibilityState (Class)
│ │ │ ├─ResolutionState (Class)
│ │ │ ├─Resolver (Class)
│ │ │ │ └─Resolution (Class)
│ │ │ │   ├─Conflict (Class)
│ │ │ │   ├─PossibilitySet (Class)
│ │ │ │   └─UnwindDetails (Class)
│ │ │ ├─ResolverError (Class)
│ │ │ ├─SpecificationProvider (Module)
│ │ │ ├─UI (Module)
│ │ │ ├─VERSION (String)
│ │ │ └─VersionConflict (Class)
│ │ ├─RequirementList (Class)
│ │ ├─Set (Class)
│ │ ├─SourceSet (Class)
│ │ ├─SpecSpecification (Class)
│ │ ├─Specification (Class)
│ │ ├─Stats (Class)
│ │ │ └─PATTERN (String)
│ │ ├─VendorSet (Class)
│ │ └─VendorSpecification (Class)
│ ├─RubyGemsVersion (String)
│ ├─RubyVersionMismatch (Class)
│ ├─RuntimeRequirementNotMetError (Class)
│ ├─Source (Class)
│ │ ├─FILES (Hash)
│ │ ├─Git (Class)
│ │ ├─Installed (Class)
│ │ ├─Local (Class)
│ │ ├─Lock (Class)
│ │ ├─SpecificFile (Class)
│ │ └─Vendor (Class)
│ ├─SourceFetchProblem (Class)
│ ├─SourceList (Class)
│ ├─SpecFetcher (Class)
│ ├─SpecificGemNotFoundException (Class)
│ ├─Specification (Class)
│ │ ├─CURRENT_SPECIFICATION_VERSION (Integer)
│ │ ├─DateLike (Object)
│ │ ├─DateTimeFormat (Regexp)
│ │ ├─INITIALIZE_CODE_FOR_DEFAULTS (Hash)
│ │ ├─LATEST_RUBY_WITHOUT_PATCH_VERSIONS (Gem::Version)
│ │ ├─MARSHAL_FIELDS (Hash)
│ │ ├─NONEXISTENT_SPECIFICATION_VERSION (Integer)
│ │ ├─NOT_FOUND (#&amp;lt;Class:0x00007fa4ce6f6060&amp;gt;)
│ │ ├─REMOVED_METHODS (Array)
│ │ ├─SPECIFICATION_VERSION_HISTORY (Hash)
│ │ ├─TODAY (Time)
│ │ └─VALID_NAME_PATTERN (Regexp)
│ ├─SpecificationPolicy (Class)
│ │ ├─HOMEPAGE_URI_PATTERN (Regexp)
│ │ ├─LAZY (String)
│ │ ├─LAZY_PATTERN (Regexp)
│ │ ├─METADATA_LINK_KEYS (Array)
│ │ ├─SPECIAL_CHARACTERS (Regexp)
│ │ ├─VALID_NAME_PATTERN (Regexp)
│ │ └─VALID_URI_PATTERN (Regexp)
│ ├─StubSpecification (Class)
│ │ ├─OPEN_MODE (String)
│ │ ├─PREFIX (String)
│ │ └─StubLine (Class)
│ │   ├─NO_EXTENSIONS (Array)
│ │   ├─REQUIRE_PATHS (Hash)
│ │   └─REQUIRE_PATH_LIST (Hash)
│ ├─SystemExitException (Class)
│ ├─UninstallError (Class)
│ ├─UnknownCommandError (Class)
│ ├─UnknownCommandSpellChecker (Class)
│ ├─UnsatisfiableDepedencyError (Class)
│ ├─UnsatisfiableDependencyError (Class)
│ ├─Util (Module)
│ ├─VERSION (String)
│ ├─VerificationError (Class)
│ ├─Version (Class)
│ │ ├─ANCHORED_VERSION_PATTERN (Regexp)
│ │ ├─Requirement (Class)
│ │ │ ├─BadRequirementError (Class)
│ │ │ ├─DefaultPrereleaseRequirement (Array)
│ │ │ ├─DefaultRequirement (Array)
│ │ │ ├─OPS (Hash)
│ │ │ ├─PATTERN (Regexp)
│ │ │ ├─PATTERN_RAW (String)
│ │ │ └─SOURCE_SET_REQUIREMENT (#&amp;lt;Class:0x00007fa4ce6f7a00&amp;gt;)
│ │ └─VERSION_PATTERN (String)
│ ├─WIN_PATTERNS (Array)
│ └─WebauthnVerificationError (Class)
├─Hash (Class)
├─IO (Class)
│ ├─Buffer (Class)
│ │ ├─AccessError (Class)
│ │ ├─AllocationError (Class)
│ │ ├─BIG_ENDIAN (Integer)
│ │ ├─DEFAULT_SIZE (Integer)
│ │ ├─EXTERNAL (Integer)
│ │ ├─HOST_ENDIAN (Integer)
│ │ ├─INTERNAL (Integer)
│ │ ├─InvalidatedError (Class)
│ │ ├─LITTLE_ENDIAN (Integer)
│ │ ├─LOCKED (Integer)
│ │ ├─LockedError (Class)
│ │ ├─MAPPED (Integer)
│ │ ├─MaskError (Class)
│ │ ├─NETWORK_ENDIAN (Integer)
│ │ ├─PAGE_SIZE (Integer)
│ │ ├─PRIVATE (Integer)
│ │ ├─READONLY (Integer)
│ │ └─SHARED (Integer)
│ ├─EAGAINWaitReadable (Class)
│ ├─EAGAINWaitWritable (Class)
│ ├─EINPROGRESSWaitReadable (Class)
│ ├─EINPROGRESSWaitWritable (Class)
│ ├─EWOULDBLOCKWaitReadable (Class)
│ ├─EWOULDBLOCKWaitWritable (Class)
│ ├─PRIORITY (Integer)
│ ├─READABLE (Integer)
│ ├─SEEK_CUR (Integer)
│ ├─SEEK_DATA (Integer)
│ ├─SEEK_END (Integer)
│ ├─SEEK_HOLE (Integer)
│ ├─SEEK_SET (Integer)
│ ├─TimeoutError (Class)
│ ├─WRITABLE (Integer)
│ ├─WaitReadable (Module)
│ └─WaitWritable (Module)
├─IOError (Class)
├─IndexError (Class)
├─Integer (Class)
│ └─GMP_VERSION (String)
├─Interrupt (Class)
├─Kernel (Module)
│ └─RUBYGEMS_ACTIVATION_MONITOR (Monitor)
├─KeyError (Class)
├─LoadError (Class)
├─LocalJumpError (Class)
├─Marshal (Module)
│ ├─MAJOR_VERSION (Integer)
│ └─MINOR_VERSION (Integer)
├─MatchData (Class)
├─Math (Module)
│ ├─DomainError (Class)
│ ├─E (Float)
│ └─PI (Float)
├─Method (Class)
├─Module (Class)
├─Monitor (Class)
├─MonitorMixin (Module)
│ └─ConditionVariable (Class)
├─Mutex (Class)
├─NameError (Class)
├─NilClass (Class)
├─NoMatchingPatternError (Class)
├─NoMatchingPatternKeyError (Class)
├─NoMemoryError (Class)
├─NoMethodError (Class)
├─NotImplementedError (Class)
├─Numeric (Class)
├─Object → Object
├─ObjectSpace (Module)
│ ├─WeakKeyMap (Class)
│ └─WeakMap (Class)
├─Proc (Class)
├─Process (Module)
│ ├─CLOCK_BOOTTIME (Integer)
│ ├─CLOCK_BOOTTIME_ALARM (Integer)
│ ├─CLOCK_MONOTONIC (Integer)
│ ├─CLOCK_MONOTONIC_COARSE (Integer)
│ ├─CLOCK_MONOTONIC_RAW (Integer)
│ ├─CLOCK_PROCESS_CPUTIME_ID (Integer)
│ ├─CLOCK_REALTIME (Integer)
│ ├─CLOCK_REALTIME_ALARM (Integer)
│ ├─CLOCK_REALTIME_COARSE (Integer)
│ ├─CLOCK_TAI (Integer)
│ ├─CLOCK_THREAD_CPUTIME_ID (Integer)
│ ├─GID (Module)
│ ├─PRIO_PGRP (Integer)
│ ├─PRIO_PROCESS (Integer)
│ ├─PRIO_USER (Integer)
│ ├─RLIMIT_AS (Integer)
│ ├─RLIMIT_CORE (Integer)
│ ├─RLIMIT_CPU (Integer)
│ ├─RLIMIT_DATA (Integer)
│ ├─RLIMIT_FSIZE (Integer)
│ ├─RLIMIT_MEMLOCK (Integer)
│ ├─RLIMIT_MSGQUEUE (Integer)
│ ├─RLIMIT_NICE (Integer)
│ ├─RLIMIT_NOFILE (Integer)
│ ├─RLIMIT_NPROC (Integer)
│ ├─RLIMIT_RSS (Integer)
│ ├─RLIMIT_RTPRIO (Integer)
│ ├─RLIMIT_RTTIME (Integer)
│ ├─RLIMIT_SIGPENDING (Integer)
│ ├─RLIMIT_STACK (Integer)
│ ├─RLIM_INFINITY (Integer)
│ ├─RLIM_SAVED_CUR (Integer)
│ ├─RLIM_SAVED_MAX (Integer)
│ ├─Status (Class)
│ ├─Sys (Module)
│ ├─Tms (Class)
│ ├─UID (Module)
│ ├─WNOHANG (Integer)
│ ├─WUNTRACED (Integer)
│ └─Waiter (Class)
├─Queue (Class)
├─RUBY_COPYRIGHT (String)
├─RUBY_DESCRIPTION (String)
├─RUBY_ENGINE (String)
├─RUBY_ENGINE_VERSION (String)
├─RUBY_PATCHLEVEL (Integer)
├─RUBY_PLATFORM (String)
├─RUBY_RELEASE_DATE (String)
├─RUBY_REVISION (String)
├─RUBY_VERSION (String)
├─Ractor (Class)
│ ├─ClosedError (Class)
│ ├─Error (Class)
│ ├─IsolationError (Class)
│ ├─MovedError (Class)
│ ├─MovedObject (Class)
│ ├─RemoteError (Class)
│ └─UnsafeError (Class)
├─Random (Class)
│ ├─Base (Class)
│ └─Formatter (Module)
│   └─ALPHANUMERIC (Array)
├─Range (Class)
├─RangeError (Class)
├─Rational (Class)
├─RbConfig (Module)
│ ├─CONFIG (Hash)
│ ├─DESTDIR (String)
│ ├─MAKEFILE_CONFIG (Hash)
│ └─TOPDIR (String)
├─Refinement (Class)
├─Regexp (Class)
│ ├─EXTENDED (Integer)
│ ├─FIXEDENCODING (Integer)
│ ├─IGNORECASE (Integer)
│ ├─MULTILINE (Integer)
│ ├─NOENCODING (Integer)
│ └─TimeoutError (Class)
├─RegexpError (Class)
├─RubyVM (Class)
│ ├─AbstractSyntaxTree (Module)
│ │ └─Node (Class)
│ ├─DEFAULT_PARAMS (Hash)
│ ├─INSTRUCTION_NAMES (Array)
│ ├─InstructionSequence (Class)
│ ├─OPTS (Array)
│ └─RJIT (Module)
├─RuntimeError (Class)
├─STDERR (IO)
├─STDIN (IO)
├─STDOUT (IO)
├─ScriptError (Class)
├─SecurityError (Class)
├─Set (Class)
│ ├─InspectKey (Symbol)
│ └─VERSION (String)
├─Signal (Module)
├─SignalException (Class)
├─SizedQueue (Class)
├─StandardError (Class)
├─StopIteration (Class)
├─String (Class)
├─Struct (Class)
├─Symbol (Class)
├─SyntaxError (Class)
├─SyntaxSuggest (Module)
│ └─MiniStringIO (Class)
├─SystemCallError (Class)
├─SystemExit (Class)
├─SystemStackError (Class)
├─TOPLEVEL_BINDING (Binding)
├─Thread (Class)
│ ├─Backtrace (Class)
│ │ └─Location (Class)
│ ├─ConditionVariable (Class)
│ ├─Mutex (Class)
│ ├─Queue (Class)
│ └─SizedQueue (Class)
├─ThreadError (Class)
├─ThreadGroup (Class)
│ └─Default (ThreadGroup)
├─Time (Class)
├─TracePoint (Class)
├─TrueClass (Class)
├─TypeError (Class)
├─UnboundMethod (Class)
├─UncaughtThrowError (Class)
├─UnicodeNormalize (Module)
├─Warning (Module)
└─ZeroDivisionError (Class)
&lt;/pre&gt;

&lt;h2 id="constant-tree-printer"&gt;Constant Tree Printer&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;def print_constants(nested_constants = [Object], nested_last_status = [], seen_constants = [])
  current_constant = nested_constants[-1]
  seen_constants &amp;lt;&amp;lt; current_constant
  constants = current_constant.constants(false).select{|c| c.to_s =~ /^[A-Z]/ }.sort
  length = constants.length
  constants.each.with_index{ |constant_name, index|
    is_last = (index + 1) == length
    constant = current_constant.const_get(constant_name)
    print nested_last_status.map{ |is_hidden| is_hidden ? "  " : "│ " }.join
    print is_last ? "└─" : "├─"
    if seen_constants.include?(constant)
      puts '%{name} → %{alias}' % { name: constant_name, alias: constant.name }
    else
      puts '%{name} (%{class})' % { name: constant_name, class: constant.class }
      print_constants(nested_constants + [constant], nested_last_status + [is_last]) if constant.is_a? Module
    end
  }
end

puts "Object (Class)"
print_constants
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/43-new-ruby-startup.html"&gt;New Ruby Startup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/32-no-more-errors.html"&gt;Errors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Constant Visibility</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/52-constant-visibility.html"/>
    <id>https://idiosyncratic-ruby.com/52-constant-visibility.html</id>
    <published>2016-05-21T00:00:00Z</published>
    <updated>2016-05-21T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;It is less common, but similar to methods, constants have a visibility attached to them. You have the choice between &lt;strong&gt;private&lt;/strong&gt; and &lt;strong&gt;public&lt;/strong&gt;, and you can also mark a constant &lt;strong&gt;deprecated&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Like with methods, the default visibility of a constant is &lt;strong&gt;public&lt;/strong&gt;. Unlike methods, &lt;a href="/25-meta-methodology.html"&gt;which have a lot of associated methods for metaprogramming&lt;/a&gt;, working with constants is easier:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Module.methods.grep /const/
=&amp;gt; [:const_get, :constants, :const_defined?, :const_set, :private_constant,
:public_constant, :deprecate_constant, :const_missing]

Module.private_methods.grep /const/
=&amp;gt; [:remove_const]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Besides some minor idiosyncrasies (like the visibility modifiers, which where introduced at a later time, refer to constants with &lt;em&gt;constant&lt;/em&gt;, while the others just use &lt;em&gt;const&lt;/em&gt;), their usage is straight forward.&lt;/p&gt;

&lt;h2 id="effects-of-visibility-modifications"&gt;Effects of Visibility Modifications&lt;/h2&gt;

&lt;p&gt;You must create a constant before you can modify its visibility. When a constant exists, you can use the class method &lt;a href="https://ruby-doc.org/core/Module.html#method-i-private_constant"&gt;&lt;code&gt;private_constant&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://ruby-doc.org/core/Module.html#method-i-deprecate_constant"&gt;&lt;code&gt;deprecate_constant&lt;/code&gt;&lt;/a&gt; to alter its behaviour. You can change &lt;strong&gt;private&lt;/strong&gt; visibility back to the original state using the &lt;a href="https://ruby-doc.org/core/Module.html#method-i-public_constant"&gt;&lt;code&gt;public_constant&lt;/code&gt;&lt;/a&gt; method. You cannot "undeprecate" constants.&lt;/p&gt;

&lt;h3 id="public"&gt;Public&lt;/h3&gt;

&lt;p&gt;This is the default behavior, the constant can be referenced from anywhere and shows up in the &lt;a href="https://ruby-doc.org/core/Module.html#method-i-constants"&gt;&lt;code&gt;constants&lt;/code&gt;&lt;/a&gt; list:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Namespace
  module Public
  end
end

Namespace::Public # =&amp;gt; Namespace::Public

Namespace.const_defined?(:Public) # =&amp;gt; true
Namespace.constants.include?(:Public) # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="private"&gt;Private&lt;/h3&gt;

&lt;p&gt;The constant cannot referenced via the &lt;code&gt;::&lt;/code&gt; operator and does not show up in the constants list. They can still be accessed from within the namespace and via &lt;a href="https://ruby-doc.org/core/Module.html#method-i-const_get"&gt;&lt;code&gt;const_get&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Namespace
  module Private
  end

  private_constant :Private
end

Namespace::Private # NameError: private constant Namespace::Private referenced

module Namespace
  Private # =&amp;gt; Namespace::Private
end

Namespace.const_defined?(:Private) # =&amp;gt; true
Namespace.constants.include?(:Private) # =&amp;gt; false

Namespace.const_get(:Private) # =&amp;gt; Namespace::Private
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="deprecated"&gt;Deprecated&lt;/h3&gt;

&lt;p&gt;This is an additional property, which is also stored in a constant's visibility flag. Whenever you reference it, it will output a (&lt;a href="https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html#verbosity"&gt;$VERBOSE level independent&lt;/a&gt;) warning:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Namespace
  module Deprecated
  end

  deprecate_constant :Deprecated
end

Namespace::Deprecated # =&amp;gt; Namespace::Deprecated
# warning: constant Namespace::Deprecated is deprecated

Namespace.const_defined? :Deprecated # =&amp;gt; true
Namespace.constants.include? :Deprecated # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="more-about-constants"&gt;More about Constants&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/doc/syntax/modules_and_classes_rdoc.html#label-Constants"&gt;RDoc: Modules (Constants)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://cirw.in/blog/constant-lookup.html"&gt;Everything you ever wanted to know about constant lookup in Ruby&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/45-constant-shuffle.html"&gt;Constants can be redefined and removed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>½ Kilo of SHA256</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/51-half-kilo-of-sha256.html"/>
    <id>https://idiosyncratic-ruby.com/51-half-kilo-of-sha256.html</id>
    <published>2016-05-20T00:00:00Z</published>
    <updated>2016-05-20T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;How many bytes (= ASCII characters) of Ruby code does it take to generate a &lt;a href="https://en.wikipedia.org/wiki/SHA-2#Pseudocode"&gt;SHA 256&lt;/a&gt; hash sum of STDIN?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="bytes"&gt;500 Bytes¹&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;q,z=[3,2].map{|t|i=l=1;(2..330).select{i-1&amp;lt;(l*=i)%i+=1}.map{|e|(e**t**-1*X=2**32).to_i&amp;amp;X-=1}}
s=proc{|n,*m|a=0
m.map{|e|a^=n&amp;gt;&amp;gt;e|n&amp;lt;&amp;lt;32-e}
a}
i=$&amp;lt;.read.b&amp;lt;&amp;lt;128
(i+"\0"*(56.-(w=i.size)%64)+[~-w*8].pack('Q&amp;gt;')).gsub(/.{64}/m){w=$&amp;amp;.unpack'N*'
y=z
64.times{|i|i&amp;gt;15&amp;amp;&amp;amp;w[i]=w[i-16]+(s[v=w[i-15],7,18]^v&amp;gt;&amp;gt;3)+w[i-7]+(s[w[i-2],17,19]^w[i-2]&amp;gt;&amp;gt;10)&amp;amp;X
f=y[7]+s[u=y[4],6,11,25]+(u&amp;amp;y[5]^~u&amp;amp;y[6])+q[i]+w[i]
y=[f+s[y[0],2,13,22]+(y[0]&amp;amp;y[1]^y[0]&amp;amp;y[2]^y[1]&amp;amp;y[2])&amp;amp;X]+y
y[4]=y[4]+f&amp;amp;X}
z=z.zip(y).map{|a,b|a+b&amp;amp;X}}
$&amp;gt;&amp;lt;&amp;lt;'%.8x'*8%z
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is based on a submission to a (now defunct) code golf contest and there were "better" submissions, so it is possible to get the code smaller. Looking for pull requests!&lt;/p&gt;

&lt;p&gt;¹ The code above actually contains 501 bytes, but you can replace &lt;code&gt;"\0"&lt;/code&gt; with a real null byte&lt;/p&gt;

&lt;h3 id="test-script"&gt;Test Script&lt;/h3&gt;

&lt;p&gt;Save the above code as &lt;code&gt;sha256.rb&lt;/code&gt; and create the following test script in the same directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encoding: utf-8

require "digest/sha2"
require "open3"

TEST_SCRIPT = "ruby sha256.rb"
TEST_CASES  = [
  "Idiosyncrätic Ruby",
  "\n",
  "",
  "a"*6000,
  "a"*57
]

TEST_CASES.each{ |test_case|
  expected = Digest::SHA256.hexdigest(test_case)
  actual = nil
  Open3.popen3(TEST_SCRIPT){ |in_, out,|
    in_ &amp;lt;&amp;lt; test_case
    in_.close
    actual = out.read
  }
  if expected == actual
    print "."
  else
    $stderr.puts "Fail:
- Expected: #{expected.inspect}
- Actual:   #{actual.inspect}
"
  end
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/27-golfing-basics.html"&gt;Golfing Basics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://golf.shinh.org/"&gt;Anarchy Golf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Naming Too Good</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/50-naming-too-good.html"/>
    <id>https://idiosyncratic-ruby.com/50-naming-too-good.html</id>
    <published>2016-05-19T00:00:00Z</published>
    <updated>2016-05-19T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Some words should not be chosen as identifiers for variables, parameters and methods in Ruby, because they clash with core methods or keywords.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;As long as you do not define a method with the name of a keyword, Ruby will not complain. Still, it is often better to avoid naming things like existing methods. It carries potential for future bugs and also confuses newcomers. You might change the name in the future, but miss some occurrences, which will then do something completely different. It also &lt;a href="https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html#what-if-the-thing-implements-the-method-method"&gt;makes debugging harder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A simple workaround is to append an &lt;code&gt;_&lt;/code&gt; to critical identifiers. Some variables names that I find myself wanting to choose sometimes, but which should not (or cannot) be used:&lt;/p&gt;

&lt;h2 id="class"&gt;&lt;code&gt;class&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;class&lt;/code&gt; is a keyword so this is invalid code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class = Thread
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When referencing classes in your code the most common convention is to use &lt;code&gt;klass&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2 id="in"&gt;&lt;code&gt;in&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;An example where this rarely used keyword (which is part of the &lt;code&gt;for&lt;/code&gt; loop syntax) prevents good naming is working with streams:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'open3'
Open3.popen3(cmd){ |in, out, err|
  # ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="method"&gt;&lt;code&gt;method&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;A common pattern:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def send_somewhere(method, something)
  # ...
  public_send(method)
  # ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Conflicts with: &lt;a href="https://ruby-doc.org/core/Object.html#method-i-method"&gt;Object#method&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="hash"&gt;&lt;code&gt;hash&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Calculating a hash:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "digest/sha2"
hash = Digest::SHA256.hexdigest "ö"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Conflicts with: &lt;a href="https://ruby-doc.org/core/Object.html#method-i-hash"&gt;Object#hash&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="format"&gt;&lt;code&gt;format&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;"format" is a typical name for a keyword argument:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def something(format: "json")
  # ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I still do it sometimes, but it conflicts with: &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-format"&gt;Kernel#format&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="display"&gt;&lt;code&gt;display&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-display"&gt;Object#display&lt;/a&gt; should also &lt;a href="https://chrisarcand.com/the-search-for-class0x0000001ab51700/"&gt;be avoided&lt;/a&gt;!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What the Format?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/49-what-the-format.html"/>
    <id>https://idiosyncratic-ruby.com/49-what-the-format.html</id>
    <published>2016-05-18T00:00:00Z</published>
    <updated>2016-05-18T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href="#a-a--analyze-float"&gt;%a&lt;/a&gt;
&lt;a href="#a-a--analyze-float"&gt;%A&lt;/a&gt;
&lt;a href="#b-b--binary-number"&gt;%b&lt;/a&gt;
&lt;a href="#b-b--binary-number"&gt;%B&lt;/a&gt;
&lt;a href="#c--character"&gt;%c&lt;/a&gt;
&lt;a href="#d-i-u--integer-decimal-number"&gt;%d&lt;/a&gt;
&lt;a href="#e-e--float-in-exponential-notation"&gt;%e&lt;/a&gt;
&lt;a href="#e-e--float-in-exponential-notation"&gt;%E&lt;/a&gt;
&lt;a href="#f--float"&gt;%f&lt;/a&gt;
&lt;a href="#g-g--float-in-normal-or-exponential-notation"&gt;%g&lt;/a&gt;
&lt;a href="#g-g--float-in-normal-or-exponential-notation"&gt;%G&lt;/a&gt;
&lt;a href="#d-i-u--integer-decimal-number"&gt;%i&lt;/a&gt;
&lt;a href="#o--octal-number"&gt;%o&lt;/a&gt;
&lt;a href="#p--inspect"&gt;%p&lt;/a&gt;
&lt;a href="#s--string"&gt;%s&lt;/a&gt;
&lt;a href="#d-i-u--integer-decimal-number"&gt;%u&lt;/a&gt;
&lt;a href="#x-x--hexadecimal-number"&gt;%x&lt;/a&gt;
&lt;a href="#x-x--hexadecimal-number"&gt;%X&lt;/a&gt;
&lt;a href="#percent"&gt;%%&lt;/a&gt;
&lt;a href="#zero"&gt;0&lt;/a&gt;
&lt;a href="#referencing-absolute-positioning"&gt;$&lt;/a&gt;
&lt;a href="#hash"&gt;#&lt;/a&gt;
&lt;a href="#plus"&gt;+&lt;/a&gt;
&lt;a href="#minus"&gt;-&lt;/a&gt;
&lt;a href="#star"&gt;*&lt;/a&gt;
&lt;a href="#space"&gt;space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby comes with a structured alternative to classic string interpolation: This episode will explore &lt;strong&gt;format strings&lt;/strong&gt;, also known as the &lt;em&gt;sprintf&lt;/em&gt; syntax.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Recall the normal way of interpolating variables into a string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;v = 42
"--&amp;gt; #{v} &amp;lt;--"
# =&amp;gt; "--&amp;gt; 42 &amp;lt;--"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Format strings are different in that they use a string template and bind it to data via the &lt;code&gt;%&lt;/code&gt; method:¹&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;v = 42
"--&amp;gt; %s &amp;lt;--" % v
# =&amp;gt; "--&amp;gt; 42 &amp;lt;--"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This might look familiar to you, because &lt;a href="https://en.wikipedia.org/wiki/Printf_format_string"&gt;dozens of other programming languages&lt;/a&gt; also support some flavor of this syntax.&lt;/p&gt;

&lt;p&gt;¹ Some people prefer the functional-style &lt;em&gt;Kernel#sprintf&lt;/em&gt; or &lt;em&gt;Kernel#format&lt;/em&gt; methods, which let you access the same functionality&lt;/p&gt;

&lt;h2 id="four-kinds-of-references"&gt;Four Kinds of References&lt;/h2&gt;

&lt;p&gt;Format strings separate the string's format (= template) from the actual data. The template contains references in the format of &lt;code&gt;%X&lt;/code&gt; (unnamed) or &lt;code&gt;%&amp;lt;name&amp;gt;X&lt;/code&gt; (named). The &lt;code&gt;X&lt;/code&gt; consists of the formatting type, optionally preceded by other formatting options (see next section). The most basic formatting type is &lt;code&gt;%s&lt;/code&gt;, which stands for &lt;em&gt;string&lt;/em&gt;. You cannot mix between the two referencing styles; either go with named or unnamed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Named format strings take a hash parameter:
"--&amp;gt; %&amp;lt;forty_two&amp;gt;s -- %&amp;lt;forty_three&amp;gt;s &amp;lt;--" % {forty_two: 42, forty_three: 43}
# =&amp;gt; --&amp;gt; 42 -- 43 &amp;lt;--

# Named format strings, fancy style (note the dot before `%`):
"--&amp;gt; %&amp;lt;forty_two&amp;gt;s -- %&amp;lt;forty_three&amp;gt;s &amp;lt;--".% forty_two: 42, forty_three: 43
# =&amp;gt; --&amp;gt; 42 -- 43 &amp;lt;--

# Shorter, simple/unnamed format strings, take an array as parameter:
"--&amp;gt; %s -- %s &amp;lt;--" % [42, 43]
# =&amp;gt; --&amp;gt; 42 -- 43 &amp;lt;--

# If you only need to interpolate a single value, you can shorten this to:
"--&amp;gt; %s &amp;lt;--" % 42
# =&amp;gt; --&amp;gt; 42 &amp;lt;--

# Attempt to mix:
"--&amp;gt; %s -- %&amp;lt;second&amp;gt;s &amp;lt;--" % [1, second: 2]
# ArgumentError: named&amp;lt;second&amp;gt; after unnumbered(1)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Conceptionally, this is very similar to how regular expressions handle references. For simple interpolations use simple references, for more complex interpolations named references might be a better fit. Named references serve as inline documentation.&lt;/p&gt;

&lt;h3 id="referencing-template-style"&gt;Referencing: Template Style&lt;/h3&gt;

&lt;p&gt;Besides the two main styles, there exists a shorthand syntax for using format strings with named references:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"--&amp;gt; %{first} -- %{second} &amp;lt;--".% first: 1, second: 2
# =&amp;gt; --&amp;gt; 1 -- 2 &amp;lt;--
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Though you will lose the ability to apply a formatting type (see below), it is concise and looks good. At its core, it is templating built into the language!&lt;/p&gt;

&lt;h3 id="referencing-absolute-positioning"&gt;Referencing: Absolute Positioning&lt;/h3&gt;

&lt;p&gt;The fourth way of referencing the values is the most unreadable one and I would not recommend it. It is a modification of the unnamed reference style: Instead of using the variables in the order you passed them in, you denote the position of the value in the template string using &lt;code&gt;n$&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"--&amp;gt; %2$s -- %1$s &amp;lt;--" % [:first, :second]
# =&amp;gt; "--&amp;gt; second -- first &amp;lt;--"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again, mixing with other types of referencing will lead to errors like this one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"--&amp;gt; %2$s -- %s &amp;lt;--" % [:first, :second]
# ArgumentError: unnumbered(1) mixed with numbered
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="flags-widths-and-formatting-type"&gt;Flags, Widths, and Formatting Type&lt;/h2&gt;

&lt;p&gt;In the previous examples, only basic string substitution was used. But format strings can do more: They can convert a value to another representation using a different &lt;strong&gt;formatting type&lt;/strong&gt;. The formatting type is specified by the last letter of the reference. Besides &lt;code&gt;%s&lt;/code&gt;, another common used formatting type is &lt;code&gt;%d&lt;/code&gt;, which will put the value through &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Integer"&gt;&lt;code&gt;Interger()&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%d" % 1
# =&amp;gt; 1

"%d" % "1"
# =&amp;gt; 1

"%d" % "string without integer value"
# ArgumentError: invalid value for Integer(): "string without integer value"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are three different kinds of formatting types: Format as &lt;code&gt;String&lt;/code&gt;, format as &lt;code&gt;Integer&lt;/code&gt;, and format as &lt;code&gt;Float&lt;/code&gt;. See further below for a detailed description. Often, the formatting can be enhanced with special flags or widths. Special options appear between the &lt;code&gt;%&lt;/code&gt; sign and the formatting type². For example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%.2f" % 1.23456 # =&amp;gt; 1.23
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is a float conversion, and the special option "precision of 2" was used. Different formatting types support different kinds of flags and options. The complete syntax of a reference is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;%&amp;lt;name&amp;gt;AB.CX&lt;/code&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Syntax&lt;/th&gt;
      &lt;th&gt;Notes&lt;/th&gt;
      &lt;th&gt;Required/Optional&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;%&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-³&lt;/td&gt;
      &lt;td&gt;Required&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Named reference&lt;/td&gt;
      &lt;td&gt;Optional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;A&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Flags&lt;/td&gt;
      &lt;td&gt;Optional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;B&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Width&lt;/td&gt;
      &lt;td&gt;Optional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;.&lt;/code&gt; &lt;em&gt;C&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Precision&lt;/td&gt;
      &lt;td&gt;Optional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;X&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Formatting type&lt;/td&gt;
      &lt;td&gt;Required&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;² As &lt;a href="https://twitter.com/fnordfish/status/732957226932047877"&gt;fnordfish noted&lt;/a&gt;, the syntax can sometimes be quite confusing, such as in:&lt;br /&gt;&lt;code&gt;"Such %&amp;lt;num&amp;gt; cookies" % { num: 100 }&lt;/code&gt;&lt;br /&gt;
³ &lt;span id="percent"&gt;Since the &lt;code&gt;%&lt;/code&gt; character denotes a reference, you have to use &lt;code&gt;%%&lt;/code&gt; to get a single "%"&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;What follows is a description of all formatting options and types.&lt;/p&gt;

&lt;h2 id="formatting-flags-and-options-string-padding"&gt;Formatting Flags and Options: String Padding&lt;/h2&gt;

&lt;p&gt;When the format string parser finds a number (which is not a preceded by &lt;code&gt;.&lt;/code&gt; or &lt;code&gt;$&lt;/code&gt;), it will treat the value as a padding width. The padding width defines the minimum string length, the remaining space will be filled with ASCII spaces. This is a similar functionality like provided by &lt;a href="https://ruby-doc.org/core/String.html"&gt;String#ljust&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%20s" % "Idiosyncratic"
# =&amp;gt; "       Idiosyncratic"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It also works with template-style references:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%20{ruby}".% ruby: "Idiosyncratic"
#=&amp;gt; "       Idiosyncratic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="minus"&gt;- | Minus&lt;/h3&gt;

&lt;p&gt;You can use "negative widths" to right-pad a string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%-20s" % "Idiosyncratic"
# =&amp;gt; "Idiosyncratic       "
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="star"&gt;* | Star&lt;/h3&gt;

&lt;p&gt;A dynamic padding width can be achieved with &lt;code&gt;*&lt;/code&gt;. This will require two arguments and does not work with named references:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;w = 20
"%*s" % [w, "Idiosyncratic"] # =&amp;gt; "       Idiosyncratic"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Alternatively, you can just inline-interpolate the format string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;w = 20
"%#{w}s" % "Idiosyncratic" # =&amp;gt; "       Idiosyncratic"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Can be combined with absolute positioned references (e.g. &lt;code&gt;"%1$*2$s"&lt;/code&gt;).&lt;/p&gt;

&lt;h3 id="zero"&gt;0 | Zero&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;0&lt;/code&gt; as flag allows you to pad numerical values with zeros instead of spaces:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%020i" % 1
# =&amp;gt; #=&amp;gt; "00000000000000000001"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will not work for &lt;code&gt;%s&lt;/code&gt;, &lt;code&gt;%p&lt;/code&gt;, or &lt;code&gt;%c&lt;/code&gt;. Can also not be combined with the &lt;code&gt;-&lt;/code&gt; flag (right-pad).&lt;/p&gt;

&lt;h2 id="formatting-flags-and-options-algebraic-sign"&gt;Formatting Flags and Options: Algebraic Sign&lt;/h2&gt;

&lt;h3 id="plus"&gt;+ | Plus&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;+&lt;/code&gt; flag forces a "+" sign for positive numbers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%+d" % 1
# =&amp;gt; "+1"

"%+d" % -1
# =&amp;gt; "-1"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will not work for &lt;code&gt;%s&lt;/code&gt;, &lt;code&gt;%p&lt;/code&gt;, or &lt;code&gt;%c&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="space"&gt;⍽ | Space&lt;/h3&gt;

&lt;p&gt;In a similar manner, the &lt;code&gt; &lt;/code&gt; flag, forces positive numbers to leave a space (for a potential "-" sign):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"% d" % 1
# =&amp;gt; " 1"

"% d" % -1
# =&amp;gt; "-1"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will not work for &lt;code&gt;%s&lt;/code&gt;, &lt;code&gt;%p&lt;/code&gt;, or &lt;code&gt;%c&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="other-formatting-flags-and-options"&gt;Other Formatting Flags and Options&lt;/h2&gt;

&lt;h3 id="hash"&gt;# | Hash&lt;/h3&gt;

&lt;p&gt;Modifies the way a numerical value gets converted. What it exactly does varies, so see the description at respective formatting type!&lt;/p&gt;

&lt;h2 id="formatting-types-string"&gt;Formatting Types: String&lt;/h2&gt;

&lt;h3 id="s--string"&gt;%s | String&lt;/h3&gt;

&lt;p&gt;Does nothing but putting the string argument at the right position.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%s Ruby" % "Idiosyncratic"
# =&amp;gt; "Idiosyncratic Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will call &lt;code&gt;to_s&lt;/code&gt; on the object passed in.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%s Ruby" % :Idiosyncratic
# =&amp;gt; "Idiosyncratic Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A padding example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%4s" % "A"
# =&amp;gt; "   A"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using the precision syntax, you can pass a hard length limit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%.4s" % "Idiosyncratic"
# =&amp;gt; "Idio"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Padding + Limit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%4.8s" % "12"
# =&amp;gt; "  12"

"%4.8s" % "1234567890"
# =&amp;gt; "12345678"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="p--inspect"&gt;%p | Inspect&lt;/h3&gt;

&lt;p&gt;Calls &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-p"&gt;inspect&lt;/a&gt; on the value:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%p" % "Idiosyncratic"
# =&amp;gt; "\"Idiosyncratic\""
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Supports the same flags and arguments like &lt;code&gt;%s&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="c--character"&gt;%c | Character&lt;/h3&gt;

&lt;p&gt;Interpretes a numerical value as a &lt;a href="https://en.wikipedia.org/wiki/Code_point"&gt;codepoint&lt;/a&gt; of the current encoding and converts it to the respective character (the reverse of &lt;a href="https://ruby-doc.org/core/String.html#method-i-ord"&gt;String#ord&lt;/a&gt;, similar to what &lt;a href="(https://idiosyncratic-ruby.com/4-what-the-pack.html#u--utf-8-characters)"&gt;&lt;code&gt;Array#pack("U")&lt;/code&gt;&lt;/a&gt; does for UTF-8 strings):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%c" % 11835
# =&amp;gt; "⸻"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Can also be used with a single letter string, which will just be inserted (as if was used with &lt;code&gt;%s&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%c" % "A"
# =&amp;gt; "A"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="formatting-types-integer"&gt;Formatting Types: Integer&lt;/h2&gt;

&lt;p&gt;A padding width has the same effect it has for strings. When Integer formatting is used together with a precision it will act as the minimum number of digits to display (which is different from the effect it has in Float formatting):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%6.4d" % 20
# =&amp;gt; "  0020"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The all integer formatting type will run the value through &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-Integer"&gt;&lt;code&gt;Integer()&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%d" % 42.9
# =&amp;gt; "42"

"%d" % "23"
# =&amp;gt; "23"

"%d" % "0xff"
# =&amp;gt; "255"

"%d" % nil
# TypeError: can't convert nil into Integer
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="d-i-u--integer-decimal-number"&gt;%d, %i, %u | Integer (Decimal Number)&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;%d&lt;/code&gt;, &lt;code&gt;%i&lt;/code&gt; and &lt;code&gt;%u&lt;/code&gt; all convert the value to an integer (see explanation above):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%d" % "123"
# =&amp;gt; 123
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b-b--binary-number"&gt;%b, %B | Binary Number&lt;/h3&gt;

&lt;p&gt;Converts the number to a binary number string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%b" % 42
# =&amp;gt; "101010"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Another way of achieving the same would be to use &lt;a href="https://ruby-doc.org/core/Numeric.html"&gt;Numeric#to_s(2)&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;42.to_s(2)
# =&amp;gt; "101010"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Negative numbers will be convert to &lt;a href="https://en.wikipedia.org/wiki/Two's_complement"&gt;two's complement&lt;/a&gt;, preceded by "..1" representing an infinite string of leading "1"s:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%b" % -42
# =&amp;gt; "..1010110"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not the case when the &lt;code&gt;+&lt;/code&gt; or &lt;code&gt; &lt;/code&gt; flag are in use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%+b" % -42
# =&amp;gt; "-101010"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternative conversion format (&lt;code&gt;#&lt;/code&gt; flag) will prepend "0b" (except for 0):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%#b" % 42
# =&amp;gt; "0b101010"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;%B&lt;/code&gt; type has exactly the same behavior as &lt;code&gt;%b&lt;/code&gt;, except that it will use an uppercase "B" in alternative conversion format:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%#B" % 42
# =&amp;gt; "0B101010"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="o--octal-number"&gt;%o | Octal Number&lt;/h3&gt;

&lt;p&gt;Converts the number to an octal number string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%o" % 42
# =&amp;gt; "52"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Another way of achieving the same would be to use &lt;a href="https://ruby-doc.org/core/Numeric.html"&gt;Numeric#to_s(8)&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;42.to_s(8)
# =&amp;gt; "52"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Negative numbers will be convert to &lt;a href="https://en.wikipedia.org/wiki/Two's_complement"&gt;two's complement&lt;/a&gt;, preceded by "..7" representing an infinite string of leading "7"s:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%o" % -42
# =&amp;gt; "..726"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not the case when the &lt;code&gt;+&lt;/code&gt; or &lt;code&gt; &lt;/code&gt; flag are in use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%+o" % -42
# =&amp;gt; "-52"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternative conversion format (&lt;code&gt;#&lt;/code&gt; flag) will prepend "0" (except for 0):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%#o" % 42
# =&amp;gt; "052"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="x-x--hexadecimal-number"&gt;%x, %X | Hexadecimal Number&lt;/h3&gt;

&lt;p&gt;Converts the number to a hexadecimal number string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%x" % 42
# =&amp;gt; "2a"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;%X&lt;/code&gt; type has the same behavior, except that it will used uppercased letters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%X" % 42
# =&amp;gt; "2A"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Another way of achieving the same would be to use &lt;a href="https://ruby-doc.org/core/Numeric.html"&gt;Numeric#to_s(16)&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;42.to_s(16)
# =&amp;gt; "2a"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Negative numbers will be convert to &lt;a href="https://en.wikipedia.org/wiki/Two's_complement"&gt;two's complement&lt;/a&gt;, preceded by "..f" representing an infinite string of leading "f"s:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%x" % -42
# =&amp;gt; "..fd6"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not the case when the &lt;code&gt;+&lt;/code&gt; or &lt;code&gt; &lt;/code&gt; flag are in use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%+x" % -42
# =&amp;gt; "-2a"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternative conversion format (&lt;code&gt;#&lt;/code&gt; flag) will prepend "0x" (except for 0):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%#x" % 42
# =&amp;gt; "0x2a"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or "0X" when using big &lt;code&gt;%X&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%#X" % 42
# =&amp;gt; "0X2A"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="formatting-types-float"&gt;Formatting Types: Float&lt;/h2&gt;

&lt;h3 id="f--float"&gt;%f | Float&lt;/h3&gt;

&lt;p&gt;This will convert the argument to a floating point number:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%f" % 42
# =&amp;gt; "42.000000"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The precision syntax defines the actual precision here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%.2f" % 42
# =&amp;gt; "42.00"

"%.3f" % 42
# =&amp;gt; "42.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="e-e--float-in-exponential-notation"&gt;%e, %E | Float in Exponential Notation&lt;/h3&gt;

&lt;p&gt;Converts the value to a float in &lt;a href="https://en.wikipedia.org/wiki/Scientific_notation"&gt;exponential notation&lt;/a&gt; (with 6 digits before the exponent):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%e" % 42
# =&amp;gt; "4.200000e+01"

"%e" % 0.00000023
# =&amp;gt; "2.300000e-07"

"%e" % -1_000_000_000
# =&amp;gt; "-1.000000e+09"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The precision syntax defines the number of digits before the exponent:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%.2e" % 42
#=&amp;gt; "4.20e+01"

"%.4e" % 42
# =&amp;gt; "4.2000e+01"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using big &lt;code&gt;%E&lt;/code&gt; will uppercase the "E" in the result:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%E" % 1
# =&amp;gt; "1.000000E+00"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="g-g--float-in-normal-or-exponential-notation"&gt;%g, %G | Float in Normal or Exponential Notation&lt;/h3&gt;

&lt;p&gt;Converts a float either to normal representation &lt;code&gt;1.23&lt;/code&gt; or exponential notation (see &lt;code&gt;%e&lt;/code&gt; above). Which one is chosen, depends on the number: If the exponent is more than 5 or less than -4, exponential format is used:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; "%g" % 100000
# =&amp;gt; "100000"

&amp;gt;&amp;gt; "%g" % 1000000
# =&amp;gt; "1e+06"

&amp;gt;&amp;gt; "%g" % 0.0001
# =&amp;gt; "0.0001"

&amp;gt;&amp;gt; "%g" % 0.00001
# =&amp;gt; "1e-05"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will use a given (positive) precision as the point to decide between both notation forms:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%.2g" % 10
# =&amp;gt; "10"

"%.2g" % 100
# =&amp;gt; "1e+02"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using big &lt;code&gt;%G&lt;/code&gt; will uppercase the "E" in the result:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%G" % 1234567890
# =&amp;gt; "1.23457E+09"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="a-a--analyze-float"&gt;%a, %A | Analyze Float&lt;/h3&gt;

&lt;p&gt;Converts a float into a format revealing its underlying representation, which is divided into &lt;a href="https://en.wikipedia.org/wiki/Floating_point"&gt;significant (mantissa) and exponent&lt;/a&gt;. The result is a string of the following format:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; (if negative) + &lt;code&gt;0x&lt;/code&gt; + significant (hexadecimal) + &lt;code&gt;p&lt;/code&gt; + exponent sign + exponent (decimal)&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%a" % 1
# =&amp;gt; "0x1p+0"

"%a" % 1.2
# =&amp;gt; "0x1.3333333333333p+0"

"%a" % 1.23
# =&amp;gt; "0x1.3ae147ae147aep+0"

"%a" % 0.1
# =&amp;gt; "0x1.999999999999ap-4"

"%a" % 10000000000
# =&amp;gt; "0x1.2a05f2p+33"

"%a" % 0.000000001
# =&amp;gt; "0x1.12e0be826d695p-30"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using big &lt;code&gt;%A&lt;/code&gt; will uppercase all letters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"%A" % -12.34
# =&amp;gt; "-0X1.8AE147AE147AEP+3"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="classic-interpolation-vs-format-strings"&gt;Classic Interpolation vs. Format Strings&lt;/h2&gt;

&lt;h3 id="advantages-of-format-strings"&gt;Advantages of Format Strings&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Values sit side by side, instead of being all around the place&lt;/li&gt;
  &lt;li&gt;Simple access to string padding functionality&lt;/li&gt;
  &lt;li&gt;Advanced (and explicit) numerical conversions&lt;/li&gt;
  &lt;li&gt;Can be used as built-in mini templating engine&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="advantages-of-classical-interpolation"&gt;Advantages of Classical Interpolation&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Interpolation happens on syntax level, no method calling involved&lt;/li&gt;
  &lt;li&gt;Inline interpolation quicker to write/more convenient for simple interpolations&lt;/li&gt;
  &lt;li&gt;Not possible to mismatch values and format string references&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-sprintf"&gt;RDoc: Kernel#sprintf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/sprintf.c"&gt;Source: sprintf.c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/4-what-the-pack.html"&gt;What the Pack?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/57-what-the-time.html"&gt;What the Time?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/64-what-the-regex.html"&gt;What the Regex?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby TRICKS of 2015</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/48-ruby-tricks-of-2015.html"/>
    <id>https://idiosyncratic-ruby.com/48-ruby-tricks-of-2015.html</id>
    <published>2016-05-17T00:00:00Z</published>
    <updated>2016-05-17T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby was initially designed to be a successor of the Perl programming language, which also means that it inherited a lot of Perl's expressiveness. To celebrate this, the &lt;a href="https://github.com/tric/trick2015"&gt;TRIC¹ contest&lt;/a&gt; was invented:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Write the most Transcendental, Imbroglio Ruby program!&lt;/li&gt;
  &lt;li&gt;Illustrate some of the subtleties (and design issues) of Ruby!&lt;/li&gt;
  &lt;li&gt;Show the robustness and portability of Ruby interpreters!&lt;/li&gt;
  &lt;li&gt;Stabilize the spec of Ruby by the presence of valuable but unmaintainable code!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best submissions were awarded at the Japanese &lt;strong&gt;Ruby Kaigi&lt;/strong&gt; conference and also &lt;a href="https://github.com/ruby/ruby/tree/master/sample/trick2015"&gt;included in the Ruby source&lt;/a&gt;, for educational purpose. The winning submissions² of 2015 were:&lt;/p&gt;

&lt;p&gt;¹ &lt;em&gt;Transcendental Ruby Imbroglio Contest&lt;/em&gt;&lt;br /&gt;
² &lt;em&gt;All code is MIT licensed, Copyright (c) 2015, TRICK Winners and Judges&lt;/em&gt;&lt;/p&gt;

&lt;h2 id="st-place-best-piphilology"&gt;1st Place: "Best piphilology"&lt;/h2&gt;

&lt;p&gt;By kinaba (&lt;a href="https://github.com/tric/trick2015/blob/master/kinaba/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;big, temp = Array 100000000**0x04e2
srand big
alias $curTerm $initTerm

Numeric
Interrupt

big += big
printout _pi_ finish if $never
init ||= big
$counter ||= 02

private
@mainloop
while 0x00012345 &amp;gt;= $counter

  Rational aprx = 3.141592r
  numbase = 0o0000

  @justonce
  def increment
    $initTerm ||= Integer srand * 0x00000002
    srand $counter += 0x00000001

    $noaction
    Integer rand
    $noaction
    rand
    rand
    alias $line_cnt $.
  end

  @lets_just
  @assume
  diameter = 100000

  @you
  @then_have
  permtr |= +3_14159

  return if $nomeaning

  @onlyuse
  increment

  beautiful computer action if $nothing
  $sigmaTerm ||= init
  $curTerm /= srand and init
  pi, = Integer $sigmaTerm unless $nomean

  iterator?
  $counter += 1
  atan real_one multiplied by__four unless
  srand +big &amp;amp;&amp;amp; $counter &amp;gt;&amp;gt; 0b1

  Enumerable
  Fixnum
  Bignum
  Math
  Complex
  Comparable
  TrueClass
  Dir
  Encoding
  Data
  Hash
  Method
  Enumerator
  Exception
  Fiber
  Errno
  FalseClass
  Mutex
  NilClass
  IO
  GC

  num = numbase |= srand

  ENV
  Float
  MatchData
  Proc
  TracePoint
  KeyError
    p   or
  FileTest
  File
  EOFError
    p
    p
    p
  Binding
  Time
  Class

  $sigmaTerm += $curTerm
  puts a HelloWorld if $nomean
  SystemExit

  !LoadError
  31i
  3.1415e0
  Array 14 + 3
  IndexError
  Range
  false
  55555
  NameError

  Object
  @ori
    @ent
  RubyVM

  pi += 3_3_1_3_8

  @use
  @lots_of
  @keywords
  begin
    self
    $noaction
    not $important
    nil
    __FILE__.object_id
  rescue
    next
    redo if __LINE__
    defined? +$nomeaning
    $noaction
    $nomean
    break $never
  ensure
    class PiCompute
    end
  end

  This code cannot _ be executed with typical style unless true
  $curTerm *= num
end

@ll_set
@re_U_ok

$Enjoy
$Superb
$TRICK15 and a number

print pi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All valid syntax! Run it and it will output the first 1000 digits of Pi:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But that is not all, Pi is encoded a second time! The program is a &lt;a href="https://en.wikipedia.org/wiki/Piphilology"&gt;Piphilology&lt;/a&gt;: Each token's length represents the next digit (and 0 is represented by a token length of 10)! Save the program as &lt;code&gt;entry.rb&lt;/code&gt; and run the following one-liner to verify:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -r ripper -e \
  'puts Ripper.tokenize(STDIN).grep(/\S/).map{|t|t.size%10}.join' &amp;lt; entry.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="nd-place-most-unreadable-alu"&gt;2nd Place: "Most unreadable ALU"&lt;/h2&gt;

&lt;p&gt;By Keisuke Nakano (&lt;a href="https://github.com/tric/trick2015/blob/master/ksk_1/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If the number is even, divide it by two, otherwise, multiply it by three and add one.&lt;/em&gt; …and eventually the number becomes 1. This is known as the &lt;a href="https://en.wikipedia.org/wiki/Collatz_conjecture"&gt;Collatz conjecture&lt;/a&gt;. The following one-liner calculates this series, without using any conditionals or arithmetic operations:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%%%while eval '_=%%r%%(.)...\1=%%=~[%%%%,,,,,%%%s  ?=]*%%%%%%#"]*%%%%3x+1?%%'.% %%",%*p(_||=eval($**%%%))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To try it out, save the code to &lt;code&gt;entry.rb&lt;/code&gt; and called it with a number! Example of &lt;code&gt;$ ruby entry.rb 42&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;42
21
64
32
16
8
4
2
1
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="rd-place-doubling-amphisbaena-award"&gt;3rd Place: "Doubling amphisbaena award"&lt;/h2&gt;

&lt;p&gt;By monae (&lt;a href="https://github.com"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;          ;;  ;;          ;;  ;;
           ;;  ;;          ;;  ;;
        ;;eval$s        =%q[i=1#
         eval(%q[        xxxxxxxx
        xx  xxxx  xx    xx  xxxx  xx
         xx  xxxx  xx    xx  xxxx  xx
            xxxxxxxx        xxxxxxxx
             xxxxxxxx        xxxxxxxx
  xx  xx  xxxxxxxxxx  xx  xxxxxxxx
   j,  t,  p=0,[?;],"  ev  al$s=%qx
[#$s]".split*"";i,j,t=i-j,i+j,(x
 [b=?\s]*j.abs+t).map{|s|r=t.shix
ft  ||b;r.gsub!(?;){p.slice!0}if  $x
 f|  |=p&amp;gt;p=p.center(i*i+j*j,?;);r  ,x
    s=[s,r]if(i*j&amp;lt;0);(b*i.abs+s).ljx
     ust(r.size).gsub(b){r[$`.size]|x
  |b}}unti  l$  f;puts(t)#  xx  xx
   xxxxxxxx  xx  xxxxxxxxxx  xx  xx
xxxxxxxx        xxxxxxxx
 xxxxxxxx        xxxxxxxx
xx  xxxx  xx    xx  xxxx  xx
 xx  xxxx  xx    xx  xxxx  xx
    xxxxxxxx        x].gsub\
     /x.*|\s/        ,"")#];;
    ;;  ;;          ;;  ;;
     ;;  ;;          ;;  ;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save this program as &lt;code&gt;entry.rb&lt;/code&gt; and run it with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby entry.rb | ruby | ruby | ruby # ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then watch it duplicating!&lt;/p&gt;

&lt;h2 id="th-place-least-general-solver"&gt;4th Place: "Least general solver"&lt;/h2&gt;

&lt;p&gt;By Benoit Daloze (&lt;a href="https://github.com/tric/trick2015/blob/master/eregon/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;What is your visual impression when looking at the following code?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class String;def[]*a;$*&amp;lt;&amp;lt;a;b;end;end;
_=0;z="C=Fiber;s=$*;a=*0..8;l=C.new{e
xit},*a.product(a).select{|r,c|s[r][c
]==0}."[1,9,_, _,_,8, _,_,5]+"map{|r,
 c|C.ne"[_,_,2, _,5,_, _,8,9]+"w{o=s[r
][c];l"[8,_,6, 7,4,_, _,_,_]+"oop{(1.
.9).map{|n|C.yield(s[r][c]=n)if a.non
e?{|k|"[_,_,_, _,_,4, _,9,2]+"s[r][k]
==n||s"[_,2,3, _,7,_, 8,1,_]+"[k][c]=
=n||s["[5,6,_, 8,_,_, _,_,_]+"r-r%3+k
%3][c-c%3+k/3]==n}};s[r][c]=o;C.yield
}}},C."[_,_,_, _,2,7, 9,_,3]+"new{loo
p{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{
|r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}&amp;lt;&amp;lt;''
;C.yield}};c=l[i=1];loop{c=l[i+=c.res
ume ? 1:-1]}";eval z.tr ?\n,''
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is a &lt;a href="https://en.wikipedia.org/wiki/Sudoku"&gt;Sudoku&lt;/a&gt; embedded! Run the code to solve it!&lt;/p&gt;

&lt;h2 id="th-place-most-general-solver"&gt;5th Place: "Most general solver"&lt;/h2&gt;

&lt;p&gt;By Keisuke Nakano (&lt;a href="https://github.com/tric/trick2015/blob/master/ksk_2/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This handy one-liner is a &lt;a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem"&gt;SAT solver&lt;/a&gt; based on Ruby's regex engine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;_='s %sSATISFIABLE';puts eval$&amp;lt;.read.gsub(/.*p.*?(\d+).*?$|\d+/m){$1?%w[?-* +'=-'=~/#{'(-?)'* }-*=(?=]*$1:$&amp;amp;&amp;gt;?0?"\\#$&amp;amp;$|":'$)(?='}+')/x?[_%p%i=0,[*$~].map{|x|x&amp;gt;?-?:v:eval(x+?1)*i-=1}*" "]:_%:UN'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the &lt;a href="https://github.com/tric/trick2015/blob/master/ksk_2/remarks.markdown#description"&gt;description&lt;/a&gt; for more info! Sample files to pipe in:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ksk_2/sample.cnf"&gt;sample.cnf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ksk_2/unsat.cnf"&gt;unsat.cnf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ksk_2/quinn.cnf"&gt;quinn.cnf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ksk_2/abnormal.cnf"&gt;abnormal.cnf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ksk_2/uf20-01.cnf"&gt;uf20-01.cnf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="other-awarded-submissions"&gt;Other Awarded Submissions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/shinh/entry.rb"&gt;"Most Beautiful Pattern" (yhara award)&lt;/a&gt; by Shinichiro Hamaji (&lt;a href="https://github.com/tric/trick2015/blob/master/shinh/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/unak/entry.rb"&gt;"Most Fragile" (shinh award)&lt;/a&gt; by NAKAMURA Usaku (&lt;a href="https://github.com/tric/trick2015/blob/master/unak/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/k_tsj/entry.rb"&gt;"Matz Lisp Award" (matz award)&lt;/a&gt; by Kazuki Tsujimoto (&lt;a href="https://github.com/tric/trick2015/blob/master/k_tsj/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ko1_1/entry.rb"&gt;"Most Timely" (mame award)&lt;/a&gt; by Koichi Sasada (&lt;a href="https://github.com/tric/trick2015/blob/master/ko1_1/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/yoshi-taka/entry.rb"&gt;"Best Document" (eban award)&lt;/a&gt; by yoshi-taka (&lt;a href="https://github.com/tric/trick2015/blob/master/yoshi-taka/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/omoikane/entry.rb"&gt;"Most Illusionistic" (eto award)&lt;/a&gt; by Don Yang (&lt;a href="https://github.com/tric/trick2015/blob/master/omoikane/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2015/master/ko1_2/entry.rb"&gt;"Most Inconsistent" (leonid award)&lt;/a&gt; by Koichi Sasada (&lt;a href="https://github.com/tric/trick2015/blob/master/ko1_2/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/75-ruby-tricks-of-2018.html"&gt;TRIC 2018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/47-ruby-tricks-of-2013.html"&gt;TRIC 2013&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby TRICKS of 2013</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/47-ruby-tricks-of-2013.html"/>
    <id>https://idiosyncratic-ruby.com/47-ruby-tricks-of-2013.html</id>
    <published>2016-05-16T00:00:00Z</published>
    <updated>2016-05-16T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby was initially designed to be a successor of the Perl programming language, which also means that it inherited a lot of Perl's expressiveness. To celebrate this, the &lt;a href="https://github.com/tric/trick2013"&gt;TRIC¹ contest&lt;/a&gt; was invented:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Write the most Transcendental, Imbroglio Ruby program!&lt;/li&gt;
  &lt;li&gt;Illustrate some of the subtleties (and design issues) of Ruby!&lt;/li&gt;
  &lt;li&gt;Show the robustness and portability of Ruby interpreters!&lt;/li&gt;
  &lt;li&gt;Stabilize the spec of Ruby by the presence of valuable but unmaintainable code!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best submissions were awarded at the Japanese &lt;strong&gt;Ruby Kaigi&lt;/strong&gt; conference and also &lt;a href="https://github.com/ruby/ruby/tree/master/sample/trick2013"&gt;included in the Ruby source&lt;/a&gt;, for educational purpose. The winning submissions² of 2013 were:&lt;/p&gt;

&lt;p&gt;¹ &lt;em&gt;Transcendental Ruby Imbroglio Contest&lt;/em&gt;&lt;br /&gt;
² &lt;em&gt;All code is MIT licensed, Copyright (c) 2013, TRICK Winners and Judges&lt;/em&gt;&lt;/p&gt;

&lt;h2 id="st-place-best-pangram"&gt;1st Place: "Best pangram"&lt;/h2&gt;

&lt;p&gt;By kinaba (&lt;a href="https://github.com/tric/trick2013/blob/master/kinaba/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The program prints each ASCII character from 0x20 ' ' to 0x7e '~' exactly once&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;!@THEqQUICKbBROWNfFXjJMPSvVLAZYDGgkyz&amp;amp;[%r{\"}mosx,4&amp;gt;6]|?'while(putc 3_0-~$.+=9/2^5;)&amp;lt;18*7and:`#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While this would not be such a complicated thing to accomplish, reconsider the program after reading the second constraint!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The program contains each ASCII character from 0x20 ' ' to 0x7e '~' exactly once.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is what it outputs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;!"#$%&amp;amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="nd-place-most-readable"&gt;2nd Place: "Most Readable"&lt;/h2&gt;

&lt;p&gt;By Shinichiro Hamaji (&lt;a href="https://github.com/tric/trick2013/blob/master/shinh/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;begin with an easy program.
you should be able to write
a program unless for you,
program in ruby language is
too difficult. At the end
of your journey towards the
ultimate program; you must
be a part of a programming
language. You will end if
you != program
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This program does exactly nothing, but nevertheless, it is all valid syntax!&lt;/p&gt;

&lt;h2 id="rd-place-most-classic"&gt;3rd Place: "Most classic"&lt;/h2&gt;

&lt;p&gt;By Yusuke Endoh (&lt;a href="https://github.com/tric/trick2013/blob/master/mame1/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Guess what this one does:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;          eval$C=%q(at_exit{
          open("/dev/dsp","wb"){|g|h=[0]*80
          $&amp;gt;&amp;lt;&amp;lt;"\s"*18+"eval$C=%q(#$C);S=%:"
          (S&amp;lt;&amp;lt;m=58).lines{|l|s=[128]*n=20E2
          t=0;           h.map!{|v|d=?!==l[
          t]?1                         :(l[
          t]==                         ?#)?
          0*v=                         6:03
          (v&amp;lt;1                         ?[]:
          0..n                         -1).
          each                         {|z|
          s[z]                         +=2*
  M.sin(($*[0]                         ||1)
.to_f*M.sin(y=                 40*(z+m)*2**
(t/12E0)/463)+               y)*(v-z*d/n)};
t+=1;v-d};m+=                n;g.flush&amp;lt;&amp;lt;(s.
  pack"C*");                 puts(l)}}};M=
                               Math);S=%:

         Jesu, Joy of Man's Desiring
            Johann Sebastian Bach

  #
  |                       #
  |                         #
              #      #    #   #
              |      |    |      #
              |      |   #     #
           #           #  #    #
           |           |  |        #
           |           |    #    #
      #                   #   #  #
      |                   |   |       #
      |                   | #        #
           #           #      #       #
           |           |      |  #
           |           |  #   #
           #      #    #  #
           |      |    |    #
           |      |  #        #
    #           #      #       #
    |           |      |         #
    |           |        #         #
      #              #    #      #
      |              |    |    #
      |              |        #
       #           #   #    #
       |           |   |      #
       |          #|      #
         #      #  |     #
         |      |  |      #
         |         | #      #
             #  #    #      #
             |  |        #  |
             |  |         # #
         #               #  #  #
         |               |  | #
         |               |  #
              #      #    #   #
              |      |    #   |
              |          #  # |
           #  #           #   #
           |  |           |      #
           |  |          #     #
       #               #  #    #
       |               |  |        #
       |               |    #    #
      #                   #   #  #
      |                   |   |       #
      |                   | #        #
           #           #      #       #
           |           |      |  #
           |           |  #   #
         #        #    #  #
         |        |    |    #
         |        |       #   #
       #           #   #    #
       |           |        |    #
       |           |     #     #
        #              #  #   #
        |              |  | #
        |              #  #
         #      #    #
         |      |    |    #
         |         # |   #
  #               #  #    #
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    |
  |               |  |    :
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Right! It will play some lovely classical music! Run it with:³&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ padsp ruby entry.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;³ See &lt;a href="https://github.com/tric/trick2013/blob/master/mame1/remarks.markdown#limitation"&gt;Limitations&lt;/a&gt; for how to play it on Mac OS&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/75-ruby-tricks-of-2018.html"&gt;TRIC 2018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/48-ruby-tricks-of-2015.html"&gt;TRIC 2015&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="other-awarded-submissions"&gt;Other Awarded Submissions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/yhara1/entry.rb"&gt;"Worst Abuse of Constants - Dishonorable Mention"&lt;/a&gt; by Yutaka Hara (&lt;a href="https://github.com/tric/trick2013/blob/master/yhara1/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/mame2/entry.rb"&gt;"Most Competitive"&lt;/a&gt; by Yusuke Endoh (&lt;a href="https://github.com/tric/trick2013/blob/master/mame2/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/unak/entry.rb"&gt;"Best Way to Return true"&lt;/a&gt; by NAKAMURA Usaku (&lt;a href="https://github.com/tric/trick2013/blob/master/unak/remarks.en.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/nari/entry.rb"&gt;"Worst House of Garbage"&lt;/a&gt; by Nakamura Narihiro (&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/nari/hello_world.br"&gt;hello_world.br&lt;/a&gt;, &lt;a href="https://github.com/tric/trick2013/blob/master/nari/remarks.en.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/yhara2/entry.rb"&gt;"Ruby by Ruby for Ruby Award"&lt;/a&gt; by Yutaka Hara (&lt;a href="https://github.com/tric/trick2013/blob/master/yhara2/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/yoshi-taka/entry.rb"&gt;"Most Characteristic"&lt;/a&gt; by yoshi-taka (&lt;a href="https://github.com/tric/trick2013/blob/master/yoshi-taka/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/tric/trick2013/master/baban/entry.rb"&gt;"Good Way to make Programs Wonderful"&lt;/a&gt; by baban (&lt;a href="https://github.com/tric/trick2013/blob/master/baban/remarks.markdown"&gt;remarks&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>The Art of Arguments</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/46-the-art-of-arguments.html"/>
    <id>https://idiosyncratic-ruby.com/46-the-art-of-arguments.html</id>
    <published>2016-05-15T00:00:00Z</published>
    <updated>2016-05-15T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;There is nothing easier than parsing the command-line arguments given to your Ruby program: It is an array found in the special variable &lt;code&gt;$*&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -e 'p $*' -- some command line --arguments
["some", "command", "line", "--arguments"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="that-is-too-easy"&gt;That is Too Easy!&lt;/h2&gt;

&lt;p&gt;The trouble begins with supporting &lt;a href="http://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html"&gt;common arguments conventions, like GNU's&lt;/a&gt;, and combining it with Ruby DSLs. This has lead to &lt;a href="https://www.ruby-toolbox.com/categories/CLI_Option_Parsers"&gt;hundreds of Ruby libraries&lt;/a&gt; parsing command line options, even the &lt;a href="https://idiosyncratic-ruby.com/20-better-standards.html"&gt;standard library&lt;/a&gt; includes two ways: &lt;a href="https://ruby-doc.org/stdlib/libdoc/optparse/rdoc/OptParse.html"&gt;OptParse&lt;/a&gt; and &lt;a href="https://ruby-doc.org/stdlib/libdoc/getoptlong/rdoc/GetoptLong.html"&gt;GetoptLong&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="which-one-is-the-best"&gt;Which One is the Best?&lt;/h2&gt;

&lt;p&gt;Despite all the options above, I found myself using &lt;code&gt;$*&lt;/code&gt; directly very often, because it is simple and does not require remembering the API of an option parser. Unfortunately, this also means loosing the ability to understand the mentioned conventions for command-line options.&lt;/p&gt;

&lt;p&gt;This changed the day I came across the &lt;a href="https://github.com/substack/minimist"&gt;minimist option parser&lt;/a&gt; for NodeJS! It evolved out of the &lt;strong&gt;Optimist&lt;/strong&gt; option parser, which has the following slogan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;With Optimist, the options are just a hash! No optstrings attached.&lt;/em&gt;&lt;/p&gt;
&lt;a href="https://github.com/substack/node-optimist#examples"&gt;&amp;mdash; node-optimist readme&lt;/a&gt;
&lt;/blockquote&gt;

&lt;h2 id="we-need-this-in-ruby"&gt;We Need This in Ruby!&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/janlelis/rationalist"&gt;Why not?&lt;/a&gt;¹ It features a superior API:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby example/parse.rb -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],
  x: 3,
  y: 4,
  n: 5,
  a: true,
  b: true,
  c: true,
  beep: 'boop' }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The contents of &lt;code&gt;parse.rb&lt;/code&gt;:²&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rationalist'
p Rationalist.parse(ARGV)
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;You always get back a Ruby hash&lt;/li&gt;
  &lt;li&gt;Options get their own key&lt;/li&gt;
  &lt;li&gt;Untreated arguments go to &lt;code&gt;:_&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;The default usage is simple, yet advanced processing is easily configurable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¹ &lt;strong&gt;By the way:&lt;/strong&gt; On its syntactical surface, JavaScript and Ruby have more in common than you would usually expect. Take arrays &lt;code&gt;[]&lt;/code&gt; and hashes &lt;code&gt;{}&lt;/code&gt;: They just look very similar!&lt;br /&gt;
² To continue the tradition of &lt;a href="/9-globalization.html"&gt;Perl-style two-letter variables&lt;/a&gt;, we should probably do:&lt;br /&gt;&lt;code&gt;$★ = Rationalist.parse(ARGV)&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Constant Shuffle</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/45-constant-shuffle.html"/>
    <id>https://idiosyncratic-ruby.com/45-constant-shuffle.html</id>
    <published>2016-05-14T00:00:00Z</published>
    <updated>2016-05-14T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Today, another snippet from the category &lt;em&gt;&lt;a href="/16-changing-the-rules.html"&gt;don't try at home, might have unforeseeable consequences!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Constant assignment¹ is not permanent in Ruby, so it is perfectly valid to do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module A
end

class B
  def initialize
    p 42
  end
end

A, B = B, A
# warning: already initialized constant A
# warning: previous definition of A was here
# warning: already initialized constant B
# warning: previous definition of B was here
A.new  #=&amp;gt; #&amp;lt;B:0x00000002744008&amp;gt;
# 42
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ As a side note: There is also &lt;a href="https://ruby-doc.org/core/Module.html#method-i-remove_const"&gt;Module#remove_const&lt;/a&gt;, which will delete the constant, but not the module! Quoting the documentation: &lt;em&gt;"If that constant referred to a module, this will not change that module's name and can lead to confusion"&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;o = Object.send(:remove_const, :Object)
Object.constants # NameError: uninitialized constant Object
o # =&amp;gt; Object
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="the-ruby-shuffle"&gt;The Ruby Shuffle&lt;/h2&gt;

&lt;p&gt;Developing the swapping idea further, for maximal confusion:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'stringio'
def shuffle_ruby(n=rand(50))
  mod, os, e, sio = Module, ObjectSpace, Exception, StringIO
  stderr, $stderr = $stderr, sio.new
  n.times{
    begin
      m1 = os.each_object(mod).to_a.sample
      m2 = os.each_object(mod).to_a.sample
      puts "Swap #{m1} and #{m2}"
      eval "#{m1}, #{m2} = #{m2}, #{m1}"
    rescue e
    end
  }
  $stderr = stderr
  puts "Ruby shuffled (#{n} swaps)"
end
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Top Level Binding</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/44-top-level-binding.html"/>
    <id>https://idiosyncratic-ruby.com/44-top-level-binding.html</id>
    <published>2016-05-13T00:00:00Z</published>
    <updated>2016-05-13T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;In case you have wondered, what this top-level constant &lt;code&gt;TOPLEVEL_BINDING&lt;/code&gt; is all about:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;It is, as its name suggest, the &lt;a href="https://ruby-doc.org/core/Binding.html"&gt;Binding&lt;/a&gt; of your script's main scope:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a = 42
p binding.local_variable_defined?(:a) # =&amp;gt; true
p TOPLEVEL_BINDING.local_variable_defined?(:a) # =&amp;gt; true

def example_method
  p binding.local_variable_defined?(:a) # =&amp;gt; false
  p TOPLEVEL_BINDING.local_variable_defined?(:a) # =&amp;gt; true
end

example_method
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="what-is-a-practical-use-of-it"&gt;What is a practical use of it?&lt;/h2&gt;

&lt;p&gt;Besides being a general default binding for your application (&lt;a href="https://github.com/ruby/ruby/blob/v2_3_1/lib/irb.rb#L373"&gt;which is used in IRB&lt;/a&gt;), it can act also as the missing &lt;code&gt;Binding.new&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;clean_binding = TOPLEVEL_BINDING.dup
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assuming a more complex/structured application (instead of a single-file script), the top-level binding is mostly empty or consists of just a few important variables.&lt;/p&gt;

&lt;p&gt;In fact, this is how &lt;a href="https://github.com/ruby/ruby/blob/v2_3_1/lib/erb.rb#L872-L875"&gt;it is utilized in stdlib's ERB implementation&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>New Ruby Startup</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/43-new-ruby-startup.html"/>
    <id>https://idiosyncratic-ruby.com/43-new-ruby-startup.html</id>
    <published>2016-05-12T00:00:00Z</published>
    <updated>2016-05-12T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;What happens when you invoke the Ruby interpreter, even before it executes your first line of code? Actually a lot! A few observations:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="initial-load-path"&gt;Initial Load Path&lt;/h2&gt;

&lt;p&gt;These are all locations you can &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-require"&gt;Kernel#require&lt;/a&gt; from:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts $LOAD_PATH.map{ |path| "- #{path}" }'
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/site_ruby/3.2.0&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/site_ruby/3.2.0/x86_64-linux&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/site_ruby&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/vendor_ruby/3.2.0&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/vendor_ruby/3.2.0/x86_64-linux&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/vendor_ruby&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/3.2.0&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/3.2.0/x86_64-linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="initial-loaded-features"&gt;Initial Loaded Features&lt;/h2&gt;

&lt;p&gt;These are core libraries that will always get loaded by Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts $LOADED_FEATURES.map{ |lib| "- #{lib} "}'
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;enumerator.so ¹&lt;/li&gt;
  &lt;li&gt;thread.rb ¹&lt;/li&gt;
  &lt;li&gt;fiber.so ¹&lt;/li&gt;
  &lt;li&gt;rational.so ¹&lt;/li&gt;
  &lt;li&gt;complex.so ¹&lt;/li&gt;
  &lt;li&gt;ruby2_keywords.rb ¹&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/3.2.0/x86_64-linux/enc/encdb.so&lt;/li&gt;
  &lt;li&gt;…/ruby-3.2.0/lib/ruby/3.2.0/x86_64-linux/enc/trans/transdb.so&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¹ Not actual files. They show up here for backward compatibility because they were moved from the standard library (thus had to be loaded first) to the core.&lt;/p&gt;

&lt;h2 id="initial-memory-consumption"&gt;Initial Memory Consumption&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/7220896/get-current-ruby-process-memory-usage"&gt;Measured with Ruby 3.2.2 on an ubuntu machine:&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e'puts"%.2f MB".%`ps -o rss -p#$$$$`.strip.split.last.to_f/1024'
&lt;/code&gt;&lt;/pre&gt;

&lt;!--- It's $$, not $$$$, markdown seems to be buggy here --&gt;

&lt;p&gt;&lt;strong&gt;20.14 MB&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id="initial-ruby-objects"&gt;Initial Ruby Objects&lt;/h2&gt;

&lt;p&gt;Via: &lt;a href="https://ruby-doc.org/core/ObjectSpace.html#method-c-each_object"&gt;ObjectSpace.each_object&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts \
" Ruby Object                   | Count\n" +
"-------------------------------|------\n" +
ObjectSpace.each_object.group_by(&amp;amp;:class).map{|k,v| [k, v.size]}.
sort_by(&amp;amp;:last).reverse.map{|k,v| "#{k.to_s.rjust(30)} | #{v}" }.
join("\n")'
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Ruby Object&lt;/th&gt;
      &lt;th&gt;Count&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;3327&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Array&lt;/td&gt;
      &lt;td&gt;1087&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Class&lt;/td&gt;
      &lt;td&gt;288&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Encoding&lt;/td&gt;
      &lt;td&gt;103&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Module&lt;/td&gt;
      &lt;td&gt;23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hash&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Float&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;IO&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Object&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Symbol&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fatal&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ARGF.class&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SystemStackError&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NoMemoryError&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ractor&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RubyVM&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Thread&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Binding&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;IOError&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ThreadGroup&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Integer&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Complex&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;File&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Enumerator&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Not listed in this table are "immediate" objects that are directly embedded in Ruby's underlying object system, for example, &lt;a href="https://ruby-doc.org/core/Fixnum.html"&gt;small integers&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="initial-numbers"&gt;Initial Numbers&lt;/h3&gt;

&lt;p&gt;Some interesting &lt;em&gt;magic numbers&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts ObjectSpace.each_object(Numeric).
map{ |n| "- #{n} (#{n.class})" }'
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;0+1i (Complex)&lt;/li&gt;
  &lt;li&gt;18446744073709551615 (Integer)&lt;/li&gt;
  &lt;li&gt;NaN (Float)&lt;/li&gt;
  &lt;li&gt;Infinity (Float)&lt;/li&gt;
  &lt;li&gt;1.7976931348623157e+308 (Float)&lt;/li&gt;
  &lt;li&gt;2.2250738585072014e-308 (Float)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="initial-internal-objects"&gt;Initial Internal Objects&lt;/h2&gt;

&lt;p&gt;Via: &lt;a href="https://ruby-doc.org/core/ObjectSpace.html#method-c-count_objects"&gt;ObjectSpace.count_objects&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts \
" Object    | Count\n" +
"-----------|------\n" +
ObjectSpace.count_objects.to_a.sort_by(&amp;amp;:last).
reverse.map{|k,v| "#{k.to_s.rjust(10)} | #{v}" }.
join("\n")'
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Object&lt;/th&gt;
      &lt;th&gt;Count&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;TOTAL&lt;/td&gt;
      &lt;td&gt;11460&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_IMEMO&lt;/td&gt;
      &lt;td&gt;3514&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_STRING&lt;/td&gt;
      &lt;td&gt;3328&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;FREE&lt;/td&gt;
      &lt;td&gt;2696&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_ARRAY&lt;/td&gt;
      &lt;td&gt;1113&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_CLASS&lt;/td&gt;
      &lt;td&gt;548&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_DATA&lt;/td&gt;
      &lt;td&gt;181&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_ICLASS&lt;/td&gt;
      &lt;td&gt;27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_MODULE&lt;/td&gt;
      &lt;td&gt;23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_HASH&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_OBJECT&lt;/td&gt;
      &lt;td&gt;7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_FILE&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_FLOAT&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_SYMBOL&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_COMPLEX&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;T_BIGNUM&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="initial-symbols"&gt;Initial Symbols&lt;/h2&gt;

&lt;p&gt;Via: &lt;a href="https://ruby-doc.org/core/Symbol.html#method-c-all_symbols"&gt;Symbol.all_symbols&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="/40-symbolic-validations.html"&gt;Grammar rules for symbols&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ puts Symbol.all_symbols.sort.
map{ |s| s.inspect.sub("`", "\\`").gsub(/'/,"\\'") }.join(" ")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All symbols:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:"" :! :!= :!~ :"\"" :"#" :"$" :$! :$" :$$ :$&amp;amp; :$ :$* :$+ :$, :$-0 :$-F :$-I :$-W :$-a :$-d :$-i :$-l :$-p :$-v :$-w :$. :$/ :$0 :$: :$; :$&amp;lt; :$= :$&amp;gt; :$? :$@ :$DEBUG :$FILENAME :$LOADED_FEATURES :$LOAD_PATH :$PROGRAM_NAME :$VERBOSE :$\ :$_ :$:$ :$stderr :$stdin :$stdout :$~ :% :&amp;amp; :"&amp;amp;&amp;amp;" :"&amp;amp;." :""" :"(" :")" :* :** :+ :+@ :"," :- :-@ :"." :".." :"..." :/ :":" :"::" :";" :&amp;lt; :&amp;lt;&amp;lt; :&amp;lt;= :&amp;lt;=&amp;gt; :"&amp;lt;CFUNC&amp;gt;" :"&amp;lt;IFUNC&amp;gt;" :"=" :== :=== :=~ :&amp;gt; :&amp;gt;= :&amp;gt;&amp;gt; :"?" :"@" :@CALL_DATA :@IC :@IVC :@RB_BUILTIN :@VALUE :@attr_index_t :@compile_branch :@compile_status :@denominator :@gem_prelude_index :@image :@inlined_call_context :@iseq_inline_constant_cache :@iseq_inline_constant_cache_entry :@iseq_inline_iv_cache_entry :@iseq_inline_storage_entry :@mjit_options :@numerator :@path :@ractor :@rb_builtin_function :@rb_call_data :@rb_callable_method_entry_struct :@rb_callcache :@rb_callinfo :@rb_control_frame_t :@rb_cref_t :@rb_execution_context_struct :@rb_execution_context_t :@rb_iseq_constant_body :@rb_iseq_location_t :@rb_iseq_struct :@rb_iseq_t :@rb_method_definition_struct :@rb_method_iseq_t :@rb_method_type_t :@rb_mjit_compile_info :@rb_mjit_unit :@rb_serial_t :@rb_shape :@rb_shape_t :@real :@shape_id_t :AFTER_OUTPUT :ALT_SEPARATOR :ANSI_X3_4_1968 :APPEND :ARGF :ARGV :ASCII :ASCII_8BIT :AbstractSyntaxTree :AccessError :AllocationError :ArgumentError :ArithmeticSequence :Array :BASE_SLOT_SIZE :BIG5 :BIG5_HKSCS :BIG5_HKSCS_2008 :BIG5_UAO :BIG_ENDIAN :BINARY :Backtrace :Base :BasicObject :Big5 :Big5_HKSCS :Big5_HKSCS_2008 :Big5_UAO :Binding :BitField :Bool :Buffer :C :CALL_DATA :CESU_8 :CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID :CLOCK_BOOTTIME :CLOCK_BOOTTIME_ALARM :CLOCK_MONOTONIC :CLOCK_MONOTONIC_COARSE :CLOCK_MONOTONIC_RAW :CLOCK_PROCESS_CPUTIME_ID :CLOCK_REALTIME :CLOCK_REALTIME_ALARM :CLOCK_REALTIME_COARSE :CLOCK_TAI :CLOCK_THREAD_CPUTIME_ID :CP1250 :CP1251 :CP1252 :CP1253 :CP1254 :CP1255 :CP1256 :CP1257 :CP1258 :CP437 :CP50220 :CP50221 :CP51932 :CP65000 :CP65001 :CP720 :CP737 :CP775 :CP850 :CP852 :CP855 :CP857 :CP860 :CP861 :CP862 :CP863 :CP864 :CP865 :CP866 :CP869 :CP874 :CP878 :CP932 :CP936 :CP949 :CP950 :CP951 :CREAT :CRLF_NEWLINE_DECORATOR :CR_NEWLINE_DECORATOR :CSWINDOWS31J :CType :CUR :Chain :Class :ClosedError :ClosedQueueError :Comparable :CompatibilityError :Complex :ConditionVariable :Constants :Converter :ConverterNotFoundError :CsWindows31J :DATA :DEBUG :DEFAULT_PARAMS :DEFAULT_SIZE :DIG :DIRECT :DSYNC :Data :Default :DidYouMean :Dir :DomainError :E :E2BIG :EACCES :EADDRINUSE :EADDRNOTAVAIL :EADV :EAFNOSUPPORT :EAGAIN :EAGAINWaitReadable :EAGAINWaitWritable :EALREADY :EAUTH :EBADARCH :EBADE :EBADEXEC :EBADF :EBADFD :EBADMACHO :EBADMSG :EBADR :EBADRPC :EBADRQC :EBADSLT :EBCDIC_CP_US :EBFONT :EBUSY :ECANCELED :ECAPMODE :ECHILD :ECHRNG :ECOMM :ECONNABORTED :ECONNREFUSED :ECONNRESET :EDEADLK :EDEADLOCK :EDESTADDRREQ :EDEVERR :EDOM :EDOOFUS :EDOTDOT :EDQUOT :EEXIST :EFAULT :EFBIG :EFTYPE :EHOSTDOWN :EHOSTUNREACH :EHWPOISON :EIDRM :EILSEQ :EINPROGRESS :EINPROGRESSWaitReadable :EINPROGRESSWaitWritable :EINTR :EINVAL :EIO :EIPSEC :EISCONN :EISDIR :EISNAM :EKEYEXPIRED :EKEYREJECTED :EKEYREVOKED :EL2HLT :EL2NSYNC :EL3HLT :EL3RST :ELAST :ELIBACC :ELIBBAD :ELIBEXEC :ELIBMAX :ELIBSCN :ELNRNG :ELOOP :EMACS_MULE :EMEDIUMTYPE :EMFILE :EMLINK :EMSGSIZE :EMULTIHOP :ENAMETOOLONG :ENAVAIL :END :ENEEDAUTH :ENETDOWN :ENETRESET :ENETUNREACH :ENFILE :ENOANO :ENOATTR :ENOBUFS :ENOCSI :ENODATA :ENODEV :ENOENT :ENOEXEC :ENOKEY :ENOLCK :ENOLINK :ENOMEDIUM :ENOMEM :ENOMSG :ENONET :ENOPKG :ENOPOLICY :ENOPROTOOPT :ENOSPC :ENOSR :ENOSTR :ENOSYS :ENOTBLK :ENOTCAPABLE :ENOTCONN :ENOTDIR :ENOTEMPTY :ENOTNAM :ENOTRECOVERABLE :ENOTSOCK :ENOTSUP :ENOTTY :ENOTUNIQ :ENV :ENXIO :EOFError :EOPNOTSUPP :EOVERFLOW :EOWNERDEAD :EPERM :EPFNOSUPPORT :EPIPE :EPROCLIM :EPROCUNAVAIL :EPROGMISMATCH :EPROGUNAVAIL :EPROTO :EPROTONOSUPPORT :EPROTOTYPE :EPSILON :EPWROFF :EQFULL :ERANGE :EREMCHG :EREMOTE :EREMOTEIO :ERESTART :ERFKILL :EROFS :ERPCMISMATCH :ESHLIBVERS :ESHUTDOWN :ESOCKTNOSUPPORT :ESPIPE :ESRCH :ESRMNT :ESTALE :ESTRPIPE :ETIME :ETIMEDOUT :ETOOMANYREFS :ETXTBSY :EUCCN :EUCJP :EUCJP_MS :EUCKR :EUCLEAN :EUCTW :EUC_CN :EUC_JISX0213 :EUC_JIS_2004 :EUC_JP :EUC_JP_MS :EUC_KR :EUC_TW :EUNATCH :EUSERS :EWOULDBLOCK :EWOULDBLOCKWaitReadable :EWOULDBLOCKWaitWritable :EXCL :EXDEV :EXFULL :EXTENDED :EXTERNAL :Emacs_Mule :Encoding :EncodingError :Enumerable :Enumerator :Errno :Error :ErrorHighlight :EucCN :EucJP :EucJP_ms :EucKR :EucTW :Exception :F32 :F64 :FIXEDENCODING :FNM_CASEFOLD :FNM_DOTMATCH :FNM_EXTGLOB :FNM_NOESCAPE :FNM_PATHNAME :FNM_SHORTNAME :FNM_SYSCASE :FalseClass :Fiber :FiberError :File :FileTest :Float :FloatDomainError :Formatter :FrozenError :GB12345 :GB18030 :GB1988 :GB2312 :GBK :GC :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID :GETTIMEOFDAY_BASED_CLOCK_REALTIME :GID :GMP_VERSION :Gem :Generator :HEAP_PAGE_BITMAP_SIZE :HEAP_PAGE_OBJ_LIMIT :HEAP_PAGE_SIZE :HOLE :HOST_ENDIAN :Hash :I :IBM037 :IBM437 :IBM720 :IBM737 :IBM775 :IBM850 :IBM852 :IBM855 :IBM857 :IBM860 :IBM861 :IBM862 :IBM863 :IBM864 :IBM865 :IBM866 :IBM869 :IC :ID :IGNORECASE :INFINITY :INSTRUCTION_NAMES :INTERNAL :INTERNAL_CONSTANTS :INVALID_MASK :INVALID_REPLACE :INVALID_SHAPE_ID :IO :IOError :ISO2022_JP :ISO2022_JP2 :ISO8859_1 :ISO8859_10 :ISO8859_11 :ISO8859_13 :ISO8859_14 :ISO8859_15 :ISO8859_16 :ISO8859_2 :ISO8859_3 :ISO8859_4 :ISO8859_5 :ISO8859_6 :ISO8859_7 :ISO8859_8 :ISO8859_9 :ISO_2022_JP :ISO_2022_JP_2 :ISO_2022_JP_KDDI :ISO_8859_1 :ISO_8859_10 :ISO_8859_11 :ISO_8859_13 :ISO_8859_14 :ISO_8859_15 :ISO_8859_16 :ISO_8859_2 :ISO_8859_3 :ISO_8859_4 :ISO_8859_5 :ISO_8859_6 :ISO_8859_7 :ISO_8859_8 :ISO_8859_9 :IVC :Immediate :IndexError :InstructionSequence :Integer :Interrupt :InvalidByteSequenceError :InvalidatedError :IsolationError :K :KOI8_R :KOI8_U :Kernel :KeyError :LF_NEWLINE_DECORATOR :LITTLE_ENDIAN :LOCKED :LOCK_EX :LOCK_NB :LOCK_SH :LOCK_UN :Lazy :LoadError :LocalJumpError :Location :LockedError :MACCENTEURO :MACCROATIAN :MACCYRILLIC :MACGREEK :MACICELAND :MACJAPAN :MACJAPANESE :MACROMAN :MACROMANIA :MACTHAI :MACTURKISH :MACUKRAINE :MAJOR_VERSION :MANT_DIG :MAPPED :MAX :MAX_10_EXP :MAX_EXP :MIN :MINOR_VERSION :MIN_10_EXP :MIN_EXP :MJIT :MULTILINE :MacCentEuro :MacCroatian :MacCyrillic :MacGreek :MacIceland :MacJapan :MacJapanese :MacRoman :MacRomania :MacThai :MacTurkish :MacUkraine :Marshal :MaskError :MatchData :Math :Method :Module :MovedError :MovedObject :Mutex :NAN :NETWORK_ENDIAN :NOATIME :NOCTTY :NOENCODING :NOERROR :NOFOLLOW :NONBLOCK :NOT_COMPILED_STACK_SIZE :NULL :NameError :NilClass :NoMatchingPatternError :NoMatchingPatternKeyError :NoMemoryError :NoMethodError :Node :NotImplementedError :Numeric :OPTS :Object :ObjectSpace :PAGE_SIZE :PARTIAL_INPUT :PATH_SEPARATOR :PCK :PI :PRIORITY :PRIO_PGRP :PRIO_PROCESS :PRIO_USER :PRIVATE :Pointer :Proc :Process :Producer :Product :Profiler :Queue :RADIX :RB_BUILTIN :RDONLY :RDWR :READABLE :READONLY :RLIMIT_AS :RLIMIT_CORE :RLIMIT_CPU :RLIMIT_DATA :RLIMIT_FSIZE :RLIMIT_MEMLOCK :RLIMIT_MSGQUEUE :RLIMIT_NICE :RLIMIT_NOFILE :RLIMIT_NPROC :RLIMIT_RSS :RLIMIT_RTPRIO :RLIMIT_RTTIME :RLIMIT_SIGPENDING :RLIMIT_STACK :RLIM_INFINITY :RLIM_SAVED_CUR :RLIM_SAVED_MAX :RSYNC :RUBY_COPYRIGHT :RUBY_DESCRIPTION :RUBY_ENGINE :RUBY_ENGINE_VERSION :RUBY_EVENT_CLASS :RUBY_PATCHLEVEL :RUBY_PLATFORM :RUBY_RELEASE_DATE :RUBY_REVISION :RUBY_VERSION :RVALUE_OVERHEAD :RVALUE_SIZE :RVARGC_MAX_ALLOCATE_SIZE :Ractor :Random :Range :RangeError :Rational :Refinement :Regexp :RegexpError :RemoteError :RubyVM :RuntimeError :S16 :S32 :S64 :S8 :SCRIPT_LINES__ :SEEK_CUR :SEEK_DATA :SEEK_END :SEEK_HOLE :SEEK_SET :SEPARATOR :SET :SHAPE_CAPACITY_CHANGE :SHAPE_FLAG_SHIFT :SHAPE_FROZEN :SHAPE_ID_NUM_BITS :SHAPE_INITIAL_CAPACITY :SHAPE_IVAR :SHAPE_MASK :SHAPE_ROOT :SHARED :SHARE_DELETE :SHIFT_JIS :SIZE_POOL_COUNT :SJIS :SJIS_DOCOMO :SJIS_DoCoMo :SJIS_KDDI :SJIS_SOFTBANK :SJIS_SoftBank :STATELESS_ISO_2022_JP :STATELESS_ISO_2022_JP_KDDI :STDERR :STDIN :STDOUT :SYNC :ScriptError :SecurityError :Separator :Set :Shift_JIS :Signal :SignalException :SizedQueue :StandardError :Stat :Stateless_ISO_2022_JP :Stateless_ISO_2022_JP_KDDI :Status :StopIteration :String :Struct :Stub :Symbol :SyntaxError :SyntaxSuggest :Sys :SystemCallError :SystemExit :SystemStackError :TIMES_BASED_CLOCK_MONOTONIC :TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID :TIME_BASED_CLOCK_REALTIME :TIS_620 :TMPFILE :TMP_RUBY_PREFIX :TOPLEVEL_BINDING :TRUNC :Thread :ThreadError :ThreadGroup :Time :TimeoutError :Tms :TracePoint :TrueClass :TypeError :U16 :U32 :U64 :U8 :UCS_2BE :UCS_4BE :UCS_4LE :UID :UNDEF_HEX_CHARREF :UNDEF_MASK :UNDEF_REPLACE :UNIVERSAL_NEWLINE_DECORATOR :USE_LAZY_LOAD :US_ASCII :UTF8_DOCOMO :UTF8_DoCoMo :UTF8_KDDI :UTF8_MAC :UTF8_SOFTBANK :UTF8_SoftBank :UTF_16 :UTF_16BE :UTF_16LE :UTF_32 :UTF_32BE :UTF_32LE :UTF_7 :UTF_8 :UTF_8_HFS :UTF_8_MAC :UnboundMethod :UncaughtThrowError :UndefinedConversionError :UnicodeNormalize :Union :UnsafeError :VALUE :VM_CALL_KW_SPLAT :VM_CALL_KW_SPLAT_bit :VM_CALL_TAILCALL :VM_CALL_TAILCALL_bit :VM_METHOD_TYPE_CFUNC :VM_METHOD_TYPE_ISEQ :WINDOWS_1250 :WINDOWS_1251 :WINDOWS_1252 :WINDOWS_1253 :WINDOWS_1254 :WINDOWS_1255 :WINDOWS_1256 :WINDOWS_1257 :WINDOWS_1258 :WINDOWS_31J :WINDOWS_874 :WNOHANG :WRITABLE :WRONLY :WUNTRACED :WaitReadable :WaitWritable :Waiter :Warning :WeakMap :Windows_1250 :Windows_1251 :Windows_1252 :Windows_1253 :Windows_1254 :Windows_1255 :Windows_1256 :Windows_1257 :Windows_1258 :Windows_31J :Windows_874 :XML_ATTR_CONTENT_DECORATOR :XML_ATTR_QUOTE_DECORATOR :XML_TEXT_DECORATOR :Yielder :ZeroDivisionError :"[" :[] :[]= :"\\" :"]" :^ :_ :_1 :_2 :_3 :_4 :_5 :_6 :_7 :_8 :_9 :_Bool :__attached__ :__autoload__ :__bp__ :__callee__ :__classpath__ :__dir__ :__id__ :__keyword_init__ :__members__ :__members_back__ :__memory_view__ :__method__ :__recursive_key__ :__refined_class__ :__send__ :__tmp_classpath__ :_alloc :_alone :_bf_addr :_captured_body_addr :_cc_addr :_ci_addr :_compiled_body_addr :_dump :_dump_data :_enumerable_collect :_enumerable_collect_concat :_enumerable_drop :_enumerable_drop_while :_enumerable_filter :_enumerable_filter_map :_enumerable_find_all :_enumerable_flat_map :_enumerable_grep :_enumerable_grep_v :_enumerable_map :_enumerable_reject :_enumerable_select :_enumerable_take :_enumerable_take_while :_enumerable_uniq :_enumerable_with_index :_enumerable_zip :_flags :_fork :_id2ref :_iseq_addr :_load :_load_data :_operands_addr :_opes_addr :_separator :_shape_id :_unused1 :_unused2 :: :a :abort :abort_on_exception :abort_on_exception= :abs :abs2 :absolute_path :absolute_path? :accepts_no_kwarg :acos :acosh :add :add_trace_func :addr :address_resolve :advise :after_output :alias :alias_count :alias_method :aliases :alive? :all? :all_symbols :all_tokens :allbits? :allocate :allow_reentry :ambiguous_param0 :ancestors :and :and! :angle :any? :anybits? :append :append_features :arg :argc :args :arguments :argv :argv0 :arity :ary :ascii :ascii_compatible? :ascii_only? :asciicompat_encoding :asctime :asin :asinh :assoc :at :at_exit :atan :atan2 :atanh :atime :attached_object :attr :attr_accessor :attr_index_t :attr_reader :attr_writer :auto_compact :auto_compact= :autoclose :autoclose= :autoclose? :autoload :autoload? :aux :aux_ :b :backtrace :backtrace_location :backtrace_locations :base :base_label :basename :begin :between? :bf_ptr :bin :bind :bind_call :binding :binmode :binmode? :binread :binwrite :birthtime :bit_length :blksize :block :block_code :block_given? :block_start :blockdev? :blocking :blocking? :blocks :bmethod :body :bottom :broadcast :bsearch :bsearch_index :bt :bt_locations :buf :buffer :builtin_compiler :builtin_inline_p :by :byteindex :byteoffset :byterindex :bytes :bytesize :byteslice :bytesplice :call :call_ :call_data :call_threshold :called_id :callee_id :caller :caller_locations :capacity :capitalize :capitalize! :captured_body :captures :casecmp :casecmp? :casefold? :catch :catch_except_p :catch_table :category :cause :cbrt :cc :cc_entries :cc_entries_index :cc_entries_size :cc_ptr :ccan_list_node :cdhash_addr :ceil :ceildiv :center :cfp :cfunc :chain :change_privilege :chardev? :chars :chdir :child :children :chmod :chomp :chomp! :chop :chop! :chown :chr :chroot :chunk :chunk_categorize :chunk_enumerable :chunk_while :ci :ci_ptr :ci_size :clamp :class :class_eval :class_exec :class_variable_defined? :class_variable_get :class_variable_set :class_variables :clear :clock_getres :clock_gettime :clone :close :close_incoming :close_on_exec= :close_on_exec? :close_others :close_outgoing :close_read :close_write :closed? :cme_ :code_location :codepoints :coerce :collect :collect! :collect_concat :combination :compact :compact! :compare_by_identity :compare_by_identity? :compatible :compatible? :compile :compile_branch :compile_data :compile_file :compile_info :compile_option :compile_option= :compile_status :compiled_body :compiled_id :compiled_iseq :compiler :complemented_count :concat :conj :conjugate :const_added :const_defined? :const_get :const_missing :const_set :const_source_location :constants :convert :convpath :copy :copy_stream :"core#define_method" :"core#define_singleton_method" :"core#hash_merge_kwd" :"core#hash_merge_ptr" :"core#raise" :"core#set_method_alias" :"core#set_postexe" :"core#set_variable_alias" :"core#sprintf" :"core#undef_method" :coredump? :cos :cosh :count :count_objects :cover? :coverage :coverage_enabled :cr :cr_newline :cref :crlf :crlf_newline :crypt :cstime :cstime= :ctime :current :current_scheduler :curry :custom :cutime :cutime= :cycle :daemon :day :debug :debug_flags :debug_frozen_string_literal :debug_level :deconstruct :deconstruct_keys :dedup :def :default :default= :default_external :default_external= :default_internal :default_internal= :default_proc :default_proc= :define :define_finalizer :define_method :define_singleton_method :defined_class :delete :delete! :delete_at :delete_if :delete_prefix :delete_prefix! :delete_suffix :delete_suffix! :denominator :deprecate_constant :deprecated :deq :destination_buffer_full :destination_encoding :destination_encoding_name :detach :detailed_message :detect :dev :dev_major :dev_minor :difference :dig :digits :dir :directory? :dirname :disable :disable_const_cache :disable_exivar_cache :disable_inlining :disable_ivar_cache :disable_send_cache :disasm :disassemble :display :div :divmod :dontneed :double_heap :downcase :downcase! :downto :drop :drop_while :dst :dst? :dummy? :dump :dup :e :each :each_byte :each_caller_location :each_char :each_child :each_codepoint :each_cons :each_entry :each_grapheme_cluster :each_index :each_key :each_line :each_object :each_pair :each_slice :each_value :each_with_index :each_with_object :eager :edge_name :edges :egid :egid= :eid :eid= :empty :empty? :enable :enabled? :enclose :enclosed? :encode :encode! :encoded :encoding :end :end_with? :enq :ensure_list :ensure_shareable :entries :entry :enum_for :eof :eof? :ep :eql? :equal? :erf :erfc :err :errinfo :errno :error_bytes :error_char :error_tolerant :escape :euid :euid= :eval :eval_script :even? :event :events :except :exception :excl :exclude_end :exclude_end? :exec :executable? :executable_real? :exist? :exit :exit! :exit_value :exited? :exitstatus :exp :expand_heap :expand_path :experimental :extend :extend_object :extended :external? :external_encoding :extname :f32 :f64 :fail :fallback :fastpath_applied_iseq_p :fatal :fcntl :fdatasync :fdiv :feed :fetch :fetch_values :fiber :fiber_machine_stack_size :fiber_ptr :fiber_vm_stack_size :file :file? :filename :fileno :fill :filter :filter! :filter_map :find :find_all :find_index :find_timezone :finish :finish_p :finished :finite? :first :first_column :first_lineno :fixed_encoding? :flag :flags :flat_map :flatten :flatten! :flip_count :float_microsecond :float_millisecond :float_second :flock :floor :flush :fmt :fnmatch :fnmatch? :fold :for :for_fd :force :force_encoding :foreach :fork :format :free :freeze :frexp :friday? :from_name :from_time :frozen? :frozen_string_literal :fsync :ftype :full_mark :full_message :func_ptr :gamma :garbage_collect :gcd :gcdlcm :get_string :get_value :get_values :getbyte :getc :getegid :geteuid :getgid :getgm :getlocal :getpgid :getpgrp :getpriority :getrlimit :gets :getsid :getuid :getutc :getwd :gid :gid= :glob :global_trace_events :global_variables :gm :gmt? :gmt_offset :gmtime :gmtoff :grant_privilege :grapheme_clusters :grep :grep_v :group :group_by :groups :groups= :grpowned? :gsub :gsub! :handle :handle_interrupt :has_block :has_cache_for_send :has_key? :has_kw :has_kwrest :has_lead :has_opt :has_post :has_rest :has_value? :hash :hash_or_key :heap_name :hertz :hex :hexdump :highlight :home :hour :hypot :i :ic_cache :ic_cref :ic_size :icvarc_size :id :id2name :identical? :ignore_deadlock :ignore_deadlock= :imag :imaginary :immediate :immediate_mark :immediate_sweep :import_methods :in :include :include? :included :included_modules :incomplete_input :incomplete_input? :index :infinite? :inherited :initgroups :initialize :initialize_clone :initialize_copy :initialize_dup :inject :inline_const_cache :inline_context :inlined_call_context :inlined_iseqs :ino :inplace_mode :inplace_mode= :insert :insert_output :insn :insn_may_depend_on_sp_or_pc :insns_info :inspect :instance_eval :instance_exec :instance_method :instance_methods :instance_of? :instance_variable_defined? :instance_variable_get :instance_variable_set :instance_variables :instruction_sequence :instructions_unification :integer? :intern :internal? :internal_encoding :interrupt_flag :interrupt_mask :intersect? :intersection :invalid :invalid_byte_sequence :invert :io_close :io_pread :io_pwrite :io_read :io_select :io_wait :io_write :ioctl :irb :is_a? :is_entries :isatty :isdst :ise_size :iseq :iseq_addr :iseq_bits_t :iseq_catch_table :iseq_compile_data :iseq_encoded :iseq_inline_constant_cache :iseq_inline_constant_cache_entry :iseq_inline_iv_cache_entry :iseq_inline_storage_entry :iseq_insn_info :iseq_overload :iseq_ptr :iseq_size :iseqptr :iseqw :issetugid :iterator? :itself :iv_cache :iv_set_name :ivc_size :jit_func :jit_return :join :keep_if :keep_script_lines :keep_script_lines= :keep_tokens :kernel_sleep :key :key? :keys :keyword :keyword_init? :kill :kind_of? :klass :klass_or_self :kwarg :label :lambda :lambda? :last :last_column :last_error :last_lineno :last_match :last_status :latest_compact_info :latest_gc_info :lazy :lchmod :lchown :lcm :ldexp :lead_num :left :len :length :lf :lf_newline :lgamma :limit :linear_time? :lineno :lineno= :lines :link :list :lithuanian :ljust :load :load_from_binary :load_from_binary_extra_data :load_iseq :loader :loc :local :local_hooks :local_iseq :local_size :local_stack_p :local_storage :local_storage_recursive_hash :local_storage_recursive_hash_for_trace :local_table :local_table_size :local_to_utc :local_variable_defined? :local_variable_get :local_variable_set :local_variables :locale_charmap :locals :localtime :location :lock :locked :locked? :log :log10 :log2 :loop :lstat :lstrip :lstrip! :lutime :machine :magnitude :main :make_shareable :make_shareable_copy :mandatory_only_iseq :map :map! :mapped? :mark_bits :marshal_dump :marshal_load :match :match? :match_length :matchee :max :max= :max_by :max_cache_size :maxgroups :maxgroups= :mday :me :measure_total_time :measure_total_time= :member? :members :memo :merge :merge! :mesg :message :method :method_added :method_defined? :method_id :method_missing :method_missing_reason :method_removed :method_serial :method_undefined :methods :microsecond :mid :millisecond :min :min_by :minmax :minmax_by :mjit_call_attribute_sp_inc :mjit_cancel_all :mjit_capture_cc_entries :mjit_options :mjit_opts :mjit_unit :mkdir :mkfifo :mktime :mode :module_eval :module_exec :module_function :modulo :mon :monday? :month :move :msgs :mtime :n :name :name= :name_list :named_captures :names :nan? :nano_den :nano_num :nanosecond :native_thread_id :negative? :nesting :never :new :new_seed :newline :next :next! :next_float :next_iv_index :next_values :nil :nil? :nlink :no_redef_warning :nobits? :node_id :node_id_for_backtrace_location :non_block :none? :nonzero? :noreuse :normal :normalize :normalized? :not :not! :now :nsec :null? :num_waiting :numerator :obj :object :object_id :objs :oct :odd? :of :offset :on :on_blocking :once :one? :open :open_args :operands :operands_unification :opes :opt_num :opt_table :optimized :options :or :or! :ord :orig_argc :original_id :original_iseq :original_name :other :out :outer_variables :owned? :owner :p :pack :param :param_size :parameters :parent_id :parent_iseq :parse :parse_file :partial_input :partition :pass :passed_block_handler :path :pathname :pathobj :pattern :pause :pc :pc2branchindex :peek :peek_values :peephole_optimization :pending_interrupt? :perm :permutation :pgroup :phase :pid :pipe :pipe? :polar :pool :pop :popen :pos :pos= :positive? :post_match :post_num :post_start :pow :pp :ppid :pre_match :pread :precision :pred :prepend :prepend_features :prepended :prev_float :primitive_convert :primitive_errinfo :print :printf :priority :priority= :private :private_call? :private_class_method :private_const_reference :private_constant :private_instance_methods :private_method_defined? :private_methods :proc :process_wait :produce :product :protected :protected_instance_methods :protected_method_defined? :protected_methods :public :public_class_method :public_constant :public_instance_method :public_instance_methods :public_method :public_method_defined? :public_methods :public_send :push :putback :putc :puts :pwd :pwrite :quo :quote :ractor :ractors :raise :raised_exception :raised_flag :rand :random :random_number :rassoc :rationalize :raw_data :rb_atomic_t :rb_builtin_function :rb_cFalseClass :rb_cFloat :rb_cInteger :rb_cNilClass :rb_cSymbol :rb_cTrueClass :rb_call_data :rb_callable_method_entry_struct :rb_callcache :rb_callinfo :rb_callinfo_kwarg :rb_code_location_t :rb_control_frame_t :rb_cref_struct :rb_cref_t :rb_ensure_list_t :rb_event_flag_t :rb_execution_context_struct :rb_execution_context_t :rb_fiber_t :rb_hash_values :rb_hook_list_struct :rb_id_table :rb_iseq_check :rb_iseq_constant_body :rb_iseq_first_lineno :rb_iseq_location_t :rb_iseq_param_keyword :rb_iseq_path :rb_iseq_struct :rb_iseq_t :rb_iseq_type :rb_iseqw_to_iseq :rb_method_alias_t :rb_method_attr_t :rb_method_bmethod_t :rb_method_cfunc_t :rb_method_definition_struct :rb_method_iseq_t :rb_method_optimized_t :rb_method_refined_t :rb_method_type_t :rb_mjit_compile_info :rb_mjit_unit :rb_mjit_unit_list :rb_mjit_unit_type :rb_scope_visibility_t :rb_serial_t :rb_shape :rb_shape_get_shape_by_id :rb_shape_t :rb_snum_t :rb_splat_or_kwargs_p :rb_thread_struct :rb_trace_arg_struct :rb_vm_insn_decode :rb_vm_insn_encode :rb_vm_tag :rdev :rdev_major :rdev_minor :re_exchange :re_exchangeable? :read :read_nonblock :readable? :readable_real? :readagain_bytes :readbyte :readchar :readline :readlines :readlink :readonly? :readpartial :real :real? :realdirpath :realpath :reason :receive :receive_if :receiver :rect :rectangular :recv :reduce :refine :refined :refined_class :refinements :regexp :rehash :reject :reject! :remainder :remove_class_variable :remove_const :remove_instance_variable :remove_method :rename :reopen :repeated_combination :repeated_permutation :replace :replacement :replacement= :replicate :report :report_on_exception :report_on_exception= :require :require_relative :resize :resolve_feature_path :respond_to? :respond_to_missing? :rest_start :restore :result :resume :return_value :reverse :reverse! :reverse_each :rewind :rid :rindex :rjust :rmdir :root_lep :root_svar :rotate :rotate! :round :rpartition :rstrip :rstrip! :ruby2_keywords :ruby2_keywords_hash :ruby2_keywords_hash? :run :running_thread :s :s16 :s32 :s64 :sample :saturday? :save_temps :scan :schedule :scheduler :scheduler_close :scope_visi :script_lines :scrub :scrub! :search_convpath :sec :second :seed :seek :segments :select :select! :self :send :sequential :set_backtrace :set_encoding :set_encoding_by_bom :set_scheduler :set_string :set_trace_func :set_value :set_values :setbyte :setegid :seteuid :setgid :setgid? :setpgid :setpgrp :setpriority :setproctitle :setregid :setresgid :setresuid :setreuid :setrgid :setrlimit :setruid :setsid :setuid :setuid? :shape_addr :shape_id :shape_id_t :shareable? :shared? :shift :shuffle :shuffle! :sid_available? :signal :signaled? :signame :signm :signo :sin :single :singleton_class :singleton_class? :singleton_method :singleton_method_added :singleton_method_removed :singleton_method_undefined :singleton_methods :singletonclass :sinh :size :size? :size_of :size_pool_index :skip :sleep :slice :slice! :slice_after :slice_before :slice_when :sliceafter_enum :sliceafter_pat :sliceafter_pred :slicebefore_enumerable :slicebefore_sep_pat :slicebefore_sep_pred :slicewhen_enum :slicewhen_inverted :slicewhen_pred :socket? :sort :sort! :sort_by :sort_by! :source :source_buffer_empty :source_encoding :source_encoding_name :source_location :sp :spawn :specialized_instruction :split :sprintf :sqrt :squeeze :squeeze! :srand :stack_caching :stack_end :stack_max :stack_maxsize :stack_size :stack_size_for_pos :stack_start :start :start_with? :stat :stat_heap :state :status :step :sticky? :stime :stime= :stop :stop? :stopped? :stopsig :storage :storage= :store :str :stress :stress= :strftime :string :strip :strip! :sub :sub! :subclasses :submicro :subsec :succ :succ! :success :success? :sum :sunday? :super_method :superclass :swapcase :swapcase! :switch :sym :symlink :symlink? :sync :sync= :synchronize :syscall :sysopen :sysread :sysseek :system :syswrite :tag :tailcall_optimization :take :take_while :tally :tan :tanh :tap :target :target_line :target_thread :tell :terminate :termsig :test :text :textmode :then :thread_machine_stack_size :thread_ptr :thread_variable? :thread_variable_get :thread_variable_set :thread_variables :thread_vm_stack_size :throw :thursday? :time :timeout :timeout= :timeout_after :times :tm :to :to_a :to_ary :to_binary :to_c :to_enum :to_f :to_h :to_hash :to_i :to_int :to_io :to_path :to_proc :to_r :to_ruby :to_s :to_set :to_str :to_sym :to_time :to_tty? :to_write_io :token :tokens :top :total_calls :total_time :toward :tr :tr! :tr_s :tr_s! :trace :trace_arg :trace_points :trace_var :transfer :transform_keys :transform_keys! :transform_values :transform_values! :translate :transpose :trap :truncate :try_convert :try_lock :tty? :tuesday? :turkic :tv_nsec :tv_sec :tv_usec :type :u16 :u32 :u64 :uid :uid= :umask :unbind :unblock :undef :undef_method :undefine_finalizer :undefined_conversion :undefined_instance_methods :undump :ungetbyte :ungetc :unicode_normalize :unicode_normalize! :unicode_normalized? :union :uniq :uniq! :unit :units :universal :universal_newline :unlink :unlock :unode :unpack :unpack1 :unsetenv_others :unshift :untrace_var :upcase :upcase! :update :uplevel :upto :urandom :usec :used_code_p :used_modules :used_refinements :using :using_rvargc? :utc :utc? :utc_offset :utc_to_local :utime :utime= :v :val :valid? :valid_encoding? :value :value? :values :values_at :variable :verbose :verify_compaction_references :verify_internal_consistency :verify_transient_heap_internal_consistency :vm_call_handler :vm_ci_argc :vm_ci_flag :vm_stack :vm_stack_size :wait :wait2 :wait_priority :wait_readable :wait_writable :waitall :waitpid :waitpid2 :wakeup :warn :warnings :wday :wednesday? :willneed :with :with_index :with_object :world_readable? :world_writable? :wrapper :writable? :writable_real? :write :write_nonblock :xml :xor! :yday :year :yield :yield_self :yield_unspecified :yield_value :zero? :zip :zone :"{" :| :"||" :"}" :~
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="initial-globalspecial-variables"&gt;Initial Global/Special Variables&lt;/h2&gt;

&lt;p&gt;&lt;a href="/9-globalization.html"&gt;More info&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby --disable-all -e 'puts global_variables.sort.
map{ |g| "`#{g.to_s.sub("`", "\\`")}`" }.join(", ")'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;$!&lt;/code&gt;, &lt;code&gt;$"&lt;/code&gt;, &lt;code&gt;$$&lt;/code&gt;, &lt;code&gt;$&amp;amp;&lt;/code&gt;, &lt;code&gt;$'&lt;/code&gt;, &lt;code&gt;$*&lt;/code&gt;, &lt;code&gt;$+&lt;/code&gt;, &lt;code&gt;$,&lt;/code&gt;, &lt;code&gt;$-0&lt;/code&gt;, &lt;code&gt;$-F&lt;/code&gt;, &lt;code&gt;$-I&lt;/code&gt;, &lt;code&gt;$-W&lt;/code&gt;, &lt;code&gt;$-a&lt;/code&gt;, &lt;code&gt;$-d&lt;/code&gt;, &lt;code&gt;$-i&lt;/code&gt;, &lt;code&gt;$-l&lt;/code&gt;, &lt;code&gt;$-p&lt;/code&gt;, &lt;code&gt;$-v&lt;/code&gt;, &lt;code&gt;$-w&lt;/code&gt;, &lt;code&gt;$.&lt;/code&gt;, &lt;code&gt;$/&lt;/code&gt;, &lt;code&gt;$0&lt;/code&gt;, &lt;code&gt;$:&lt;/code&gt;, &lt;code&gt;$;&lt;/code&gt;, &lt;code&gt;$&amp;lt;&lt;/code&gt;, &lt;code&gt;$=&lt;/code&gt;, &lt;code&gt;$&amp;gt;&lt;/code&gt;, &lt;code&gt;$?&lt;/code&gt;, &lt;code&gt;$@&lt;/code&gt;, &lt;code&gt;$DEBUG&lt;/code&gt;, &lt;code&gt;$FILENAME&lt;/code&gt;, &lt;code&gt;$LOADED_FEATURES&lt;/code&gt;, &lt;code&gt;$LOAD_PATH&lt;/code&gt;, &lt;code&gt;$PROGRAM_NAME&lt;/code&gt;, &lt;code&gt;$VERBOSE&lt;/code&gt;, &lt;code&gt;$\&lt;/code&gt;, &lt;code&gt;$_&lt;/code&gt;, &lt;code&gt;$$&lt;/code&gt;, &lt;code&gt;$stderr&lt;/code&gt;, &lt;code&gt;$stdin&lt;/code&gt;, &lt;code&gt;$stdout&lt;/code&gt;, &lt;code&gt;$~&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/32-no-more-errors.html"&gt;List of exceptions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/10-know-your-environment.html"&gt;The &lt;code&gt;ENV&lt;/code&gt; object&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>R(u)b(y)Config(uration)</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/42-ruby-config.html"/>
    <id>https://idiosyncratic-ruby.com/42-ruby-config.html</id>
    <published>2016-05-11T00:00:00Z</published>
    <updated>2016-05-11T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;At some point when working with Ruby, you come across this mysterious &lt;strong&gt;RbConfig&lt;/strong&gt; constant. A typical scenario is that you want to check which operating system your current program is executed on. You can do this with &lt;code&gt;RbConfig::CONFIG['host_os']&lt;/code&gt; or &lt;code&gt;RbConfig::CONFIG['arch']&lt;/code&gt;, see the &lt;a href="https://github.com/rubygems/rubygems/blob/v2.6.3/lib/rubygems/platform.rb#L19-L112"&gt;RubyGems source&lt;/a&gt; for an advanced example!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Ruby Configuration&lt;/em&gt; is a collection of low-level information about your operating system, which gets created by &lt;a href="https://github.com/ruby/ruby/blob/trunk/tool/mkconfig.rb"&gt;mkconfig.rb&lt;/a&gt; when Ruby is compiled. It mostly contains compiler flags generated by Ruby's &lt;a href="https://github.com/ruby/ruby/blob/trunk/Makefile.in"&gt;compile scripts&lt;/a&gt;. Its exact contents depend on your system, and also on your Ruby implementation and version. All major Ruby implementations have a &lt;strong&gt;RbConfig&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The majority of its data can be found in a hash called &lt;code&gt;RbConfig::CONFIG&lt;/code&gt; and you will need to &lt;code&gt;require "rbconfig"&lt;/code&gt; before using it. There is additional data in other constants, such as in &lt;code&gt;RbConfig::SIZEOF&lt;/code&gt;, which was added with Ruby 2.3. What follows is an overview of what can be found in &lt;strong&gt;RbConfig&lt;/strong&gt;:&lt;/p&gt;

&lt;h2 id="rbconfigruby"&gt;&lt;code&gt;RbConfig.ruby&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Returns the absolute pathname of the &lt;code&gt;ruby&lt;/code&gt; command, constructed from &lt;em&gt;bindir&lt;/em&gt;, &lt;em&gt;ruby_install_name&lt;/em&gt;, and &lt;em&gt;EXEEXT&lt;/em&gt; (see table below):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "rbconfig"
RbConfig.ruby #=&amp;gt; "/home/jan/.rvm/rubies/ruby-2.3.0/bin/ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="rbconfigexpandval"&gt;&lt;code&gt;RbConfig.expand(val)&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The RbConfig object has an internal method to substitute placeholders in values with other values from &lt;strong&gt;RbConfig&lt;/strong&gt;. For example,
the &lt;em&gt;LIBRUBY_SO&lt;/em&gt; value could be converted from &lt;code&gt;"lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY)"&lt;/code&gt; to &lt;code&gt;"libruby.so.2.3.0"&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="rbconfigtopdir"&gt;&lt;code&gt;RbConfig::TOPDIR&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Returns the directory where the Ruby interpreter is located:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "rbconfig"
RbConfig::TOPDIR #=&amp;gt; "/home/jan/.rvm/rubies/ruby-2.3.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="rbconfigdestdir"&gt;&lt;code&gt;RbConfig::DESTDIR&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;If you set the &lt;code&gt;::DESTDIR&lt;/code&gt; constant before loading "rbconfig", it will have an impact on some other values (see the table below).&lt;/p&gt;

&lt;h2 id="rbconfigmakefileconfig"&gt;&lt;code&gt;RbConfig::MAKEFILE_CONFIG&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;A copy of &lt;code&gt;RbConfig::CONFIG&lt;/code&gt; without expanded values (see table in next section).&lt;/p&gt;

&lt;h2 id="rbconfigconfig"&gt;&lt;code&gt;RbConfig::CONFIG&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The following table contains the example output on an ubuntu machine using Ruby 2.3.0, installed via RVM:&lt;/p&gt;

&lt;table class="table-20-40-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Config Key&lt;/th&gt;
      &lt;th&gt;Value Construction (Non-Expanded)&lt;/th&gt;
      &lt;th&gt;Final Value (Expanded)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;DESTDIR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;DESTDIR&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MAJOR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MINOR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"3"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"3"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;TEENY&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PATCHLEVEL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;INSTALL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;'/usr/bin/install -c'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/install -c"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXEEXT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;prefix&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;(TOPDIR || DESTDIR + "/home/jan/.rvm/rubies/ruby-2.3.0")&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ruby_install_name&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(RUBY_BASE_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_INSTALL_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(RUBY_BASE_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_SO_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(RUBY_BASE_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;exec&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"exec"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"exec"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ruby_pc&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby-2.3.pc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby-2.3.pc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BUILTIN_TRANSSRCS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" enc/trans/newline.c"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" enc/trans/newline.c"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;USE_RUBYGEMS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"YES"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"YES"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MANTYPE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"doc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"doc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NROFF&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/nroff"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/nroff"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vendorarchhdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(vendorhdrdir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0/vendor_ruby/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitearchhdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(sitehdrdir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0/site_ruby/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubyarchhdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubyhdrdir)/$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vendorhdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubyhdrdir)/vendor_ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0/vendor_ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitehdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubyhdrdir)/site_ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0/site_ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubyhdrdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(includedir)/$(RUBY_VERSION_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_SEARCH_PATH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;UNIVERSAL_INTS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;UNIVERSAL_ARCHNAMES&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;configure_args&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" '--prefix=/home/jan/.rvm/rubies/ruby-2.3.0' '--disable-install-doc' '--enable-shared'"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" '--prefix=/home/jan/.rvm/rubies/ruby-2.3.0' '--disable-install-doc' '--enable-shared'"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CONFIGURE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"configure"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"configure"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vendorarchdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(vendorlibdir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/vendor_ruby/2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vendorlibdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(vendordir)/$(ruby_version)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/vendor_ruby/2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vendordir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibprefix)/vendor_ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/vendor_ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitearchdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(sitelibdir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitelibdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(sitedir)/$(ruby_version)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibprefix)/site_ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubyarchdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibdir)/$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubylibdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibprefix)/$(ruby_version)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ruby_version&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2.3.0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitearch&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;arch&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-linux"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitearchincludedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(includedir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;archincludedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(includedir)/$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sitearchlibdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(libdir)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;archlibdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(libdir)/$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;libdirname&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libdir"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libdir"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_EXEC_PREFIX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_LIB_VERSION&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_LIB_VERSION_STYLE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"3\t/* full */"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"3\t/* full */"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RI_BASE_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ri"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ri"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ridir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)/$(RI_BASE_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/ri"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubysitearchprefix&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibprefix)/$(sitearch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubyarchprefix&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubylibprefix)/$(arch)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MAKEFILES&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Makefile GNUmakefile"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Makefile GNUmakefile"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PLATFORM_DIR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;THREAD_MODEL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pthread"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pthread"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SYMBOL_PREFIX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXPORT_PREFIX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;COMMON_HEADERS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;COMMON_MACROS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;COMMON_LIBS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MAINLIBS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ENABLE_SHARED&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLDLIBS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -lc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -lc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SOLIBS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(LIBS)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-lpthread -lgmp -ldl -lcrypt -lm "&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBYARG_SHARED&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wl,-R$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wl,-R/home/dan/.rvm/rubies/ruby-2.3.0/lib -L/home/dan/.rvm/rubies/ruby-2.3.0/lib -lruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBYARG_STATIC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wl,-R$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wl,-R/home/dan/.rvm/rubies/ruby-2.3.0/lib -L/home/dan/.rvm/rubies/ruby-2.3.0/lib -lruby-static"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBYARG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(LIBRUBYARG_SHARED)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wl,-R/home/dan/.rvm/rubies/ruby-2.3.0/lib -L/home/dan/.rvm/rubies/ruby-2.3.0/lib -lruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBY&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(LIBRUBY_SO)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libruby.so.2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBY_ALIASES&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libruby.so.2.3 libruby.so"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBY_SO&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libruby.so.2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBY_A&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"lib$(RUBY_SO_NAME)-static.a"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"libruby-static.a"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBYW_INSTALL_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubyw_install_name&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXTDLDFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXTLDFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;strict_warnflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-std=iso9899:1999"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-std=iso9899:1999"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;warnflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;debugflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-ggdb3"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-ggdb3"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;optflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-O3 -fno-fast-math"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-O3 -fno-fast-math"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NULLCMD&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLNOBJ&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"dln.o"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"dln.o"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXECUTABLE_EXTS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ARCHFILE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBRUBY_RELATIVE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"no"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"no"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXTOUT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;".ext"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;".ext"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PREP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"miniruby$(EXEEXT)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"miniruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CROSS_COMPILING&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"no"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"no"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;TEST_RUNNABLE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;rubylibprefix&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(libdir)/$(RUBY_BASE_NAME)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;setup&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Setup"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Setup"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ENCSTATIC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EXTSTATIC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;STRIP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"strip -S -x"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"strip -S -x"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;TRY_LINK&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRELOADENV&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"LD_PRELOAD"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"LD_PRELOAD"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBPATHENV&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"LD_LIBRARY_PATH"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"LD_LIBRARY_PATH"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RPATHFLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -Wl,-R%1$-s"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -Wl,-R%1$-s"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBPATHFLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -L%1$-s"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -L%1$-s"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LINK_SO&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ASMEXT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"S"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"S"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBEXT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"a"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"a"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLEXT2&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLEXT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"so"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"so"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LDSHAREDXX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(CXX) -shared"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"g++ -shared"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LDSHARED&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(CC) -shared"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"gcc -shared"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CCDLFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-fPIC"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-fPIC"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;STATIC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ARCH_FLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLDFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ALLOCA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;codesign&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;POSTLINK&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;WERRORFLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Werror"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-Werror"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CHDIR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"cd -P"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"cd -P"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RMALL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rm -fr"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rm -fr"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RMDIRS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rmdir --ignore-fail-on-non-empty -p"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rmdir --ignore-fail-on-non-empty -p"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RMDIR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rmdir --ignore-fail-on-non-empty"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rmdir --ignore-fail-on-non-empty"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"cp"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"cp"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RM&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rm -f"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rm -f"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PKG_CONFIG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pkg-config"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pkg-config"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PYTHON&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DOXYGEN&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DOT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"dot"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"dot"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MAKEDIRS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/mkdir -p"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/mkdir -p"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MKDIR_P&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/mkdir -p"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/mkdir -p"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;INSTALL_DATA&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(INSTALL) -m 644"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/install -c -m 644"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;INSTALL_SCRIPT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(INSTALL)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/install -c"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;INSTALL_PROGRAM&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(INSTALL)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/bin/install -c"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SET_MAKE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LN_S&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ln -s"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ln -s"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NM&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"nm"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"nm"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DLLWRAP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;WINDRES&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OBJCOPY&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OBJDUMP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"objdump"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"objdump"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ASFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"as"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"as"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ar"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ar"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RANLIB&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ranlib"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ranlib"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;try_header&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CC_VERSION&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(CC) -v"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"gcc -v"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;COUTFLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o "&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o "&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OUTFLAG&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o "&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o "&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CPPOUTFILE&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o conftest.i"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-o conftest.i"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GNU_LD&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LD&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ld"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ld"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GCC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"yes"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;EGREP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/grep -E"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/grep -E"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GREP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/grep"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/grep"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CPP&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(CC) -E"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"gcc -E"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CXXFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(cxxflags)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OBJEXT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"o"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"o"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CPPFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" $(DEFS) $(cppflags)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"  "&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LDFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-L. -fstack-protector -rdynamic -Wl,-export-dynamic"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-L. -fstack-protector -rdynamic -Wl,-export-dynamic"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CFLAGS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(cflags)  -fPIC"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized  -fPIC"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CXX&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"g++"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"g++"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CC&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"gcc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"gcc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NACL_LIB_PATH&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NACL_SDK_VARIANT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NACL_SDK_ROOT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NACL_TOOLCHAIN&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;target_os&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;target_vendor&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;target_cpu&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;target&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;host_os&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux-gnu"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux-gnu"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;host_vendor&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;host_cpu&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;host&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_VERSION_NAME&lt;/td&gt;
      &lt;td&gt;"$(RUBY_BASE_NAME)-$(ruby_version)"&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBYW_BASE_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rubyw"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"rubyw"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_BASE_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build_os&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux-gnu"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"linux-gnu"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build_vendor&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"pc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build_cpu&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"x86_64-pc-linux-gnu"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RUBY_PROGRAM_VERSION&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2.3.0"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;cxxflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" $(optflags) $(debugflags) $(warnflags)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;cppflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;cflags&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" $(optflags) $(debugflags) $(warnflags)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;" -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat -Wno-maybe-uninitialized"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;target_alias&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;host_alias&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build_alias&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LIBS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-lpthread -lgmp -ldl -lcrypt -lm "&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-lpthread -lgmp -ldl -lcrypt -lm "&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ECHO_T&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ECHO_N&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-n"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"-n"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ECHO_C&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DEFS&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;mandir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)/man"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/man"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;localedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)/locale"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/locale"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;libdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(exec_prefix)/lib"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;psdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(docdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/doc/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;pdfdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(docdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/doc/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dvidir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(docdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/doc/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;htmldir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(docdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/doc/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;infodir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)/info"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/info"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;docdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)/doc/$(PACKAGE)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share/doc/ruby"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;oldincludedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/include"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/usr/include"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;includedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)/include"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/include"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;localstatedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)/var"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/var"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sharedstatedir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)/com"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/com"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sysconfdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)/etc"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/etc"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;datadir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(datarootdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;datarootdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)/share"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/share"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;libexecdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(exec_prefix)/libexec"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/libexec"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sbindir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(exec_prefix)/sbin"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/sbin"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;bindir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(exec_prefix)/bin"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/bin"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;exec_prefix&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(prefix)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_URL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_BUGREPORT&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_STRING&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_VERSION&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_TARNAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PACKAGE_NAME&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PATH_SEPARATOR&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;":"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SHELL&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/bash"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/bin/bash"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;archdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"$(rubyarchdir)"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;topdir&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;File.dirname(__FILE__)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"/home/jan/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-linux"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="rbconfigsizeof"&gt;&lt;code&gt;RbConfig::SIZEOF&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;This hash contains the &lt;a href="https://github.com/ruby/ruby/blob/trunk/template/sizes.c.tmpl"&gt;byte sizes of low-level data structures&lt;/a&gt; of your system. This is useful when interacting with external libraries via &lt;a href="https://github.com/ffi/ffi"&gt;FFI&lt;/a&gt;/&lt;a href="https://ruby-doc.org/stdlib/libdoc/fiddle/rdoc/Fiddle.html"&gt;Fiddle&lt;/a&gt;. I needs to be explicitly required:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "rbconfig/sizeof"
RbConfig::SIZEOF # =&amp;gt; {"int"=&amp;gt;4, "short"=&amp;gt;2, "long"=&amp;gt;8, "long long"=&amp;gt;8, ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The following table contains example values from an ubuntu machine using Ruby 2.3.0:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;int&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;short&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;long&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;long long&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;off_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;void*&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;float&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;double&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;time_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;clock_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;size_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ptrdiff_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int8_t&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;uint8_t&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int16_t&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;uint16_t&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int32_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;uint32_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int64_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;uint64_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;intptr_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;uintptr_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ssize_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_least8_t&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_least16_t&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_least32_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_least64_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_fast8_t&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_fast16_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_fast32_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int_fast64_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;intmax_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sig_atomic_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wchar_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wint_t&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wctrans_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wctype_t&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;_Bool&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;long double&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;float _Complex&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;double _Complex&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;long double _Complex&lt;/td&gt;
      &lt;td&gt;32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;__int128&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;__float128&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;_Decimal32&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;_Decimal64&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;_Decimal128&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;__float80&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  <entry>
    <title>Proper Unicoding</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/41-proper-unicoding.html"/>
    <id>https://idiosyncratic-ruby.com/41-proper-unicoding.html</id>
    <published>2016-05-10T00:00:00Z</published>
    <updated>2016-05-10T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's Regexp engine has a powerful feature built in: It can match for &lt;a href="https://www.unicode.org/reports/tr44/#Property_List_Table"&gt;Unicode character properties&lt;/a&gt;. But what exactly are properties you can match for?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://unicode.org/"&gt;Unicode consortium&lt;/a&gt; not only assigns all &lt;a href="https://en.wikipedia.org/wiki/Code_point"&gt;codepoints&lt;/a&gt;, it also publishes &lt;a href="https://www.unicode.org/Public/UNIDATA/"&gt;additional data&lt;/a&gt; about their assigned characters. When searching through a string, Ruby allows you to utilize some of this extra knowledge.&lt;/p&gt;

&lt;h2 id="property-regexp-syntax"&gt;Property Regexp Syntax&lt;/h2&gt;

&lt;p&gt;Within a regular expression, use the &lt;code&gt;\p&lt;/code&gt; directive:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;/\p{ PROPERTY NAME }/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To invert the property (matching characters that do &lt;strong&gt;not&lt;/strong&gt; fit), you can either use a big &lt;code&gt;\P&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;/\P{ PROPERTY NAME }/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or add the &lt;code&gt;^&lt;/code&gt; sign:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;/\p{ ^PROPERTY NAME }/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ruby will strip all spaces, dashes, underscores from the given property and convert it to a lowercased string. So the following examples are all valid syntax:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;/\p{AGE = 6.3}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\p{^In Supplementary Private Use Area-B}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\p{In_Egyptian_Hieroglyphs}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\P{inemoticons}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\P{inno   block}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\p{^zzzz}/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/\p{ z___    y-y-y   }/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="supported-unicode-versions"&gt;Supported Unicode Versions&lt;/h2&gt;

&lt;p&gt;See table at &lt;a href="/73-unicode-version-mapping.html"&gt;Episode 73: Unicode Version Mapping&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="list-of-properties-as-of-ruby-30--unicode-121"&gt;List of Properties as of Ruby 3.0 / Unicode 12.1&lt;/h2&gt;

&lt;h3 id="general-category"&gt;General Category&lt;/h3&gt;

&lt;p&gt;Each code point has a &lt;a href="https://en.wikipedia.org/wiki/Unicode_character_property#General_Category"&gt;General Category&lt;/a&gt;, one of the most basic categorizations. Codepoints without an explicit general category will implicitly get &lt;strong&gt;Cn&lt;/strong&gt; (Unassigned):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Find decimal numbers (like 2 or 3)".scan(/\p{Nd}+/) # =&amp;gt; ["2", "3"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the &lt;a href="https://github.com/janlelis/unicode-categories"&gt;Unicode::Categories&lt;/a&gt; micro gem for a way find all general categories a string belongs to and a list of possible categories.&lt;/p&gt;

&lt;h3 id="major-category"&gt;Major Category&lt;/h3&gt;

&lt;p&gt;The Major category is basically the first letter of the general category:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;L&lt;/strong&gt;: Letter&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;M&lt;/strong&gt;: Mark&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;N&lt;/strong&gt;: Number&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;: Punctuation&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;: Symbol&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Z&lt;/strong&gt;: Separator&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;C&lt;/strong&gt;: Other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Find punctuation characters (like : or ;)".scan(/\p{P}+/) # =&amp;gt; ["(", ":", ";)"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="block"&gt;Block&lt;/h3&gt;

&lt;p&gt;Unicode codepoints are also structured as &lt;a href="https://en.wikipedia.org/wiki/Unicode_block"&gt;contiguous blocks&lt;/a&gt;: Each codepoint is part of one or has the special value &lt;strong&gt;No_Block&lt;/strong&gt;. To make the block name a Unicode property, you have to prefix it with "in":&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Do not look directly into the ☼".scan /\p{In Miscellaneous Symbols}/ # =&amp;gt; ["☼"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the &lt;a href="https://github.com/janlelis/unicode-blocks"&gt;Unicode::Blocks&lt;/a&gt; micro gem for a way to retrieve the blocks of a string and a list of all valid block names.&lt;/p&gt;

&lt;h3 id="script"&gt;Script&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Script_%28Unicode%29"&gt;script&lt;/a&gt; of a character can also be matched:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ᴦ".scan/\p{Greek}/ # =&amp;gt; "ᴦ"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the &lt;a href="https://github.com/janlelis/unicode-scripts"&gt;Unicode::Scripts&lt;/a&gt; micro gem for a way to find all scripts a string contains and a list of valid script names. A great way to explore the different scripts is &lt;a href="https://codepoints.net/scripts"&gt;codepoints.net&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="age"&gt;Age&lt;/h3&gt;

&lt;p&gt;The age property lets you find out the required Unicode version to display a string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Train: 🛲 " =~ /\A\p{age=3.1}*\z/ # =&amp;gt; nil
"Train: 🛲 " =~ /\A\p{age=7.0}*\z/ # =&amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="combinedposix-like-properties"&gt;Combined/POSIX like Properties&lt;/h3&gt;

&lt;p&gt;All properties of the &lt;a href="https://www.regular-expressions.info/posixbrackets.html"&gt;POSIX brackets syntax&lt;/a&gt; are available with the &lt;code&gt;\p&lt;/code&gt; syntax: For example, &lt;code&gt;[[:print:]]&lt;/code&gt; simply becomes &lt;code&gt;\p{print}&lt;/code&gt;. You can find the full list of properties in &lt;a href="/30-regex-with-class.html#posix-and--unicode-property-style"&gt;Episode 30: Regex with Class&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="generic-properties"&gt;Generic Properties&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Any&lt;/li&gt;
  &lt;li&gt;Assigned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While &lt;code&gt;\p{Any}&lt;/code&gt; will just match any representable codepoint, &lt;code&gt;\p{Assigned}&lt;/code&gt; will ignore &lt;a href="/66-ruby-has-character.html#types-of-unstandardized-codepoints"&gt;&lt;em&gt;Reserved&lt;/em&gt; codepoints and &lt;em&gt;Non-Characters&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="derived-core-properties"&gt;Derived Core Properties&lt;/h3&gt;

&lt;p&gt;These can be found in &lt;a href="https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt"&gt;DerivedCoreProperties.txt&lt;/a&gt; (&lt;a href="ftp://unicode.org/Public/3.2-Update/DerivedProperties-3.2.0.html"&gt;explanation&lt;/a&gt;), along with a comment how the property gets constructed. Possible values are (short form in parenthesis):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Math&lt;/li&gt;
  &lt;li&gt;Alphabetic (Alpha)&lt;/li&gt;
  &lt;li&gt;Lowercase (Lower)&lt;/li&gt;
  &lt;li&gt;Uppercase (Upper)&lt;/li&gt;
  &lt;li&gt;Cased&lt;/li&gt;
  &lt;li&gt;Case Ignorable&lt;/li&gt;
  &lt;li&gt;Changes When Lowercased (CWL)&lt;/li&gt;
  &lt;li&gt;Changes When Uppercased (CWU)&lt;/li&gt;
  &lt;li&gt;Changes When Titlecased (CWT)&lt;/li&gt;
  &lt;li&gt;Changes When Casefolded (CWCF)&lt;/li&gt;
  &lt;li&gt;Changes When Casemapped (CWCF)&lt;/li&gt;
  &lt;li&gt;ID Start (IDS)&lt;/li&gt;
  &lt;li&gt;ID Continue (IDC)&lt;/li&gt;
  &lt;li&gt;XID Start (XIDS)&lt;/li&gt;
  &lt;li&gt;XID Continue (XIDC)&lt;/li&gt;
  &lt;li&gt;Default Ignorable Code Point (DI)&lt;/li&gt;
  &lt;li&gt;Grapheme Extend (Gr Ext)&lt;/li&gt;
  &lt;li&gt;Grapheme Base (Gr Base)&lt;/li&gt;
  &lt;li&gt;Grapheme Link (Gr Link)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="grapheme-related"&gt;Grapheme Related&lt;/h3&gt;

&lt;p&gt;Ruby's regex engine supports &lt;a href="/66-ruby-has-character.html#grapheme-clusters"&gt;matching for grapheme clusters&lt;/a&gt; using &lt;code&gt;\X&lt;/code&gt;. But it can also match for very specific grapheme related properties:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Grapheme Cluster Break = Prepend&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = CR&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = LF&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = Control&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = Extend&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = Regional Indicator&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = SpacingMark&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = L&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = V&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = T&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = LV&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = LVT&lt;/li&gt;
  &lt;li&gt;Grapheme Cluster Break = ZWJ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="binary-properties"&gt;Binary Properties&lt;/h3&gt;

&lt;p&gt;Other &lt;a href="https://en.wikipedia.org/wiki/Unicode_character_property"&gt;matchable character properties&lt;/a&gt; are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;White Space (W Space)&lt;/li&gt;
  &lt;li&gt;Bidi Control (Bidi C)&lt;/li&gt;
  &lt;li&gt;Join Control (Join C)&lt;/li&gt;
  &lt;li&gt;Dash&lt;/li&gt;
  &lt;li&gt;Hyphen&lt;/li&gt;
  &lt;li&gt;Quotation Mark (Q Mark)&lt;/li&gt;
  &lt;li&gt;Terminal Punctuation (Term)&lt;/li&gt;
  &lt;li&gt;Other Math (O Math)&lt;/li&gt;
  &lt;li&gt;Hex Digit (Hex)&lt;/li&gt;
  &lt;li&gt;ASCII Hex Digit (A Hex)&lt;/li&gt;
  &lt;li&gt;Other Alphabetic (O Alpha)&lt;/li&gt;
  &lt;li&gt;Ideographic (Ideo)&lt;/li&gt;
  &lt;li&gt;Diacritic (Dia)&lt;/li&gt;
  &lt;li&gt;Extender (Ext)&lt;/li&gt;
  &lt;li&gt;Other Lowercase (O Lower)&lt;/li&gt;
  &lt;li&gt;Other Uppercase (O Upper)&lt;/li&gt;
  &lt;li&gt;Noncharacter Code Point (N Char)&lt;/li&gt;
  &lt;li&gt;Other Grapheme Extend (O Gr Ext)&lt;/li&gt;
  &lt;li&gt;IDS Binary Operator (IDSB)&lt;/li&gt;
  &lt;li&gt;IDS Trinary Operator (IDST)&lt;/li&gt;
  &lt;li&gt;Radical&lt;/li&gt;
  &lt;li&gt;Unified Ideograph (U Ideo)&lt;/li&gt;
  &lt;li&gt;Other Default Ignorable Code Point (ODI)&lt;/li&gt;
  &lt;li&gt;Deprecated (Dep)&lt;/li&gt;
  &lt;li&gt;Soft Dotted (SD)&lt;/li&gt;
  &lt;li&gt;Logical Order Exception (LOE)&lt;/li&gt;
  &lt;li&gt;Other ID Start (OIDS)&lt;/li&gt;
  &lt;li&gt;Other ID Continue (OIDC)&lt;/li&gt;
  &lt;li&gt;Sentence Terminal (S Term)&lt;/li&gt;
  &lt;li&gt;Variation Selector (VS)&lt;/li&gt;
  &lt;li&gt;Pattern White Space (Pat WS)&lt;/li&gt;
  &lt;li&gt;Pattern Syntax (Pat Syn)&lt;/li&gt;
  &lt;li&gt;Prepended Concatenation Mark (PCM)&lt;/li&gt;
  &lt;li&gt;Regional Indicator (RI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="emoji-properties"&gt;Emoji Properties&lt;/h2&gt;

&lt;p&gt;Also see: &lt;a href="https://github.com/janlelis/unicode-emoji"&gt;unicode-emoji&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Emoji&lt;/li&gt;
  &lt;li&gt;Emoji Presentation&lt;/li&gt;
  &lt;li&gt;Emoji Modifier&lt;/li&gt;
  &lt;li&gt;Emoji Modifier_Base&lt;/li&gt;
  &lt;li&gt;Emoji Component&lt;/li&gt;
  &lt;li&gt;Extended Pictographic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Character+Properties"&gt;RDoc: Regexp (Character Properties)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/tool/enc-unicode.rb"&gt;Source: tool/enc-unicode.rb&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr44/"&gt;Unicode® Standard Annex #44: Unicode Character Database&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Unicode_character_property"&gt;Wikipedia: Unicode character property&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/twitter/twitter-cldr-rb#unicode-regular-expressions"&gt;Alternative: TwitterCldr Regexes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://codepoints.net/"&gt;Codepoint Browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Symbolic Validations</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/40-symbolic-validations.html"/>
    <id>https://idiosyncratic-ruby.com/40-symbolic-validations.html</id>
    <published>2016-05-09T00:00:00Z</published>
    <updated>2016-05-09T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;When exactly don't you have to &lt;code&gt;:"escape"&lt;/code&gt; a Ruby symbol?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Because this question is somehow related to the Ruby interpreter's internal usage of symbols, the rules are not the most obvious ones:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;:&lt;/code&gt; + Identifier¹, optionally appended by &lt;code&gt;!&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, or &lt;code&gt;=&lt;/code&gt; (→ methods)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:@&lt;/code&gt; + Identifier¹ (→ instance variables)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:@@&lt;/code&gt; + Identifier¹ (→ class variables)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:$&lt;/code&gt; + Identifier¹ (→ global variables)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:$&lt;/code&gt; + Single identifier¹ character or &lt;code&gt;0-9&lt;/code&gt; (→ &lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;Perl-style special variables&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:$-&lt;/code&gt; + Single identifier¹ character or &lt;code&gt;0-9&lt;/code&gt; (→ &lt;a href="https://idiosyncratic-ruby.com/9-globalization.html#other-special-global-variables"&gt;Ruby interpreter CLI options&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;:!&lt;/code&gt;, &lt;code&gt;:!=&lt;/code&gt;, &lt;code&gt;:!~&lt;/code&gt;, &lt;code&gt;:%&lt;/code&gt;, &lt;code&gt;:&amp;amp;&lt;/code&gt;, &lt;code&gt;:*&lt;/code&gt;, &lt;code&gt;:+&lt;/code&gt;, &lt;code&gt;:-&lt;/code&gt;, &lt;code&gt;:/&lt;/code&gt;, &lt;code&gt;:&amp;lt;&lt;/code&gt;, &lt;code&gt;:&amp;gt;&lt;/code&gt;, &lt;code&gt;:^&lt;/code&gt;, &lt;code&gt;:`&lt;/code&gt;, &lt;code&gt;:|&lt;/code&gt;, &lt;code&gt;:~&lt;/code&gt;, &lt;code&gt;:$!&lt;/code&gt;, &lt;code&gt;:$"&lt;/code&gt;, &lt;code&gt;:$$&lt;/code&gt;, &lt;code&gt;:$&amp;amp;&lt;/code&gt;, &lt;code&gt;:$'&lt;/code&gt;, &lt;code&gt;:$*&lt;/code&gt;, &lt;code&gt;:$+&lt;/code&gt;, &lt;code&gt;:$,&lt;/code&gt;, &lt;code&gt;:$.&lt;/code&gt;, &lt;code&gt;:$/&lt;/code&gt;, &lt;code&gt;:$:&lt;/code&gt;, &lt;code&gt;:$;&lt;/code&gt;, &lt;code&gt;:$&amp;lt;&lt;/code&gt;, &lt;code&gt;:$=&lt;/code&gt;, &lt;code&gt;:$&amp;gt;&lt;/code&gt;, &lt;code&gt;:$?&lt;/code&gt;, &lt;code&gt;:$@&lt;/code&gt;, &lt;code&gt;:$\&lt;/code&gt;, &lt;code&gt;:$`&lt;/code&gt;, &lt;code&gt;:$~&lt;/code&gt;, &lt;code&gt;:**&lt;/code&gt;, &lt;code&gt;:+@&lt;/code&gt;, &lt;code&gt;:-@&lt;/code&gt;, &lt;code&gt;:&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;:&amp;lt;=&lt;/code&gt;², &lt;code&gt;:&amp;lt;=&amp;gt;&lt;/code&gt;², &lt;code&gt;:==&lt;/code&gt;, &lt;code&gt;:===&lt;/code&gt;, &lt;code&gt;:=~&lt;/code&gt;, &lt;code&gt;:&amp;gt;=&lt;/code&gt;, &lt;code&gt;:&amp;gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;:[]&lt;/code&gt;, &lt;code&gt;:[]=&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¹ Valid for identifiers: &lt;code&gt;A-Z&lt;/code&gt;, &lt;code&gt;a-z&lt;/code&gt;, &lt;code&gt;0-9&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, non-ASCII characters. Not allowed to start with &lt;code&gt;0-9&lt;/code&gt;.&lt;br /&gt;
² &lt;a href="https://idiosyncratic-ruby.com/29-limitations-of-language.html#no-simple-rule-if-a-symbol-can-be-displayed-without-the-explicit--syntax"&gt;Example of a syntactical edge case that is not 100% clear&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Fixed Numbers</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/39-fixed-numbers.html"/>
    <id>https://idiosyncratic-ruby.com/39-fixed-numbers.html</id>
    <published>2016-05-08T00:00:00Z</published>
    <updated>2016-05-08T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;A quick reminder that number literals in Ruby can be pretty fancy!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;table class="table-20-20-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Example&lt;/th&gt;
      &lt;th&gt;Evaluates To&lt;/th&gt;
      &lt;th&gt;Class&lt;/th&gt;
      &lt;th&gt;Purpose&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0x10&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Integer.html"&gt;Integer&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Integers in hexadecimal (0-16) format&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0o10&lt;/code&gt;¹&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Integer.html"&gt;Integer&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Integers in octal (0-8) format&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0b10&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Integer.html"&gt;Integer&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Integers in binary (0-1) format&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;1e1000&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Float::INFINITY&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Float.html"&gt;Float&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Floats in &lt;a href="https://en.wikipedia.org/wiki/Scientific_notation#E_notation"&gt;exponential notation&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;1i&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;(0+1i)&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Complex.html"&gt;Complex&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Shorthand for creating complex numbers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;3/6r&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;(1/2)&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Rational.html"&gt;Rational&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Shorthand for creating rational numbers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;0_0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;Visually separate digits&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Also: &lt;code&gt;010&lt;/code&gt;&lt;br /&gt;
² While the representation of a complex number (e.g. &lt;code&gt;(0+1i)&lt;/code&gt;) is a valid way to create the same number again, this is not true for &lt;code&gt;(1/2)&lt;/code&gt; which will just evaluate to &lt;code&gt;0&lt;/code&gt;³. Also note that the &lt;a href="https://github.com/whitequark/parser/issues/287"&gt;&lt;code&gt;r&lt;/code&gt; only makes the &lt;code&gt;6&lt;/code&gt; a rational&lt;/a&gt;, which in turn "rationalizes" the result. An equivalent way of expressing the same fraction would be &lt;code&gt;3r/6&lt;/code&gt;&lt;br /&gt;
³ Except when you &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/mathn.rb"&gt;&lt;code&gt;require "mathn"&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Sad Methods</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/38-sad-methods.html"/>
    <id>https://idiosyncratic-ruby.com/38-sad-methods.html</id>
    <published>2016-05-07T00:00:00Z</published>
    <updated>2016-05-07T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;In general, Ruby's &lt;a href="https://en.wikipedia.org/wiki/Reflection_%28computer_programming%29"&gt;reflection capabilities&lt;/a&gt; are pretty powerful, although &lt;a href="https://idiosyncratic-ruby.com/25-meta-methodology.html"&gt;not always logical&lt;/a&gt;. However, when reflecting on a method's (or proc's) usage, you are sometimes stuck with &lt;strong&gt;sad methods&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sad methods only work for code, that is written in Ruby itself. And Ruby itself (official MRI) is written in C, which limits such methods' usefulness quite a lot. This is an implementation specific problem, and it naturally does not occur in implementations like &lt;a href="http://rubinius.com/"&gt;Rubinius&lt;/a&gt;. The following three methods are affected:&lt;/p&gt;

&lt;h2 id="arity"&gt;Arity&lt;/h2&gt;

&lt;p&gt;The arity of a method (or proc) will return:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A positive number if the method has a fixed number of arguments&lt;/li&gt;
  &lt;li&gt;A negative number if the method has a variable number of arguments, the value denoting the number of required arguments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;method(:require).arity # =&amp;gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However: &lt;a href="https://ruby-doc.org/core/Method.html#method-i-arity"&gt;For methods written in C, returns -1 if the call takes a variable number of arguments&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;method(:puts).arity # =&amp;gt; -1
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="source-location"&gt;Source Location&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;source_location&lt;/code&gt; of a method (or proc) returns a two-element array containing the path to the source file and the line number, where it is defined:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;method(:require).source_location
# =&amp;gt; ["/home/jan/.rvm/rubies/ruby-2.3.0/lib/.../core_ext/kernel_require.rb", 39]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However: &lt;a href="https://ruby-doc.org/core/Method.html#method-i-source_location"&gt;Returns […] nil if this method was not defined in Ruby (i.e. native)&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;method(:puts).source_location # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Method#parameters&lt;/code&gt; method lets inspect what kind of parameters a method (or proc) takes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;FileUtils.method(:cd).parameters
# =&amp;gt; [[:req, :dir], [:opt, :options], [:block, :block]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However: Like &lt;code&gt;arity&lt;/code&gt;, it will treat all C methods with multiple arguments as "variable number of arguments", instead of providing exact information:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Module.instance_method(:define_method).parameters
#=&amp;gt; [[:rest]]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/banister/method_source"&gt;method_source: Retrieve the method source via source_location&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/debugging#howtocallobj--self-method_or_proc"&gt;howtocall: Extended version of &lt;code&gt;Method#parameters&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Static Monkeys vs. Strong Ducks</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/37-static-monkeys-vs-strong-ducks.html"/>
    <id>https://idiosyncratic-ruby.com/37-static-monkeys-vs-strong-ducks.html</id>
    <published>2016-05-06T00:00:00Z</published>
    <updated>2016-05-06T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Programming languages have been, and will always be categorized by their &lt;a href="https://en.wikipedia.org/wiki/Type_system"&gt;typing system&lt;/a&gt;. Naturally, large parts of the Ruby community (including myself) have some kind of aversion against static typing. But while Ruby goes down the route of being dynamically typed that does not mean that you are not allowed to use some form of types!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2020 update:&lt;/strong&gt; &lt;a href="https://rubyreferences.github.io/rubychanges/3.0.html#types"&gt;Ruby 3.0 introduced types&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Put differently, nothing is wrong with ensuring a specific behavior of arguments given to, or received from a method. You sometimes do it anyways, for example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;When you raise an error, because the argument given is not a &lt;code&gt;Numeric&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;When you raise an error, because an argument does not respond to &lt;code&gt;:to_i&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;When you check that something has a trueish value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second example is checking if an object has a specific method, you could call it &lt;a href="https://en.wikipedia.org/wiki/Duck_typing"&gt;duck type checking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The third example might not look logical at first glance, but: As soon as you check if an object is not "falsy", you are doing some kind of type checking. The type is "trueish" and it is very implicit (every object that is not &lt;code&gt;nil&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;) . Such &lt;em&gt;type checks&lt;/em&gt; are normal, not necessarily a bad thing, and it also does not mean static typing is much better, and we all should use &lt;a href="https://en.wikipedia.org/wiki/Haskell_%28programming_language%29"&gt;Haskell&lt;/a&gt;. It is more about how to think about types and how to have conversations about types.&lt;/p&gt;

&lt;h2 id="almighty-staticness"&gt;Almighty Staticness?&lt;/h2&gt;

&lt;p&gt;Static type systems often use compile time type checking, which lets you catch a specific type of bugs earlier. It also opens the room for a much better performance. There are some very Ruby-like languages that use static types and achieve a much better performance, namely &lt;a href="http://www.mirah.org/"&gt;Mirah&lt;/a&gt; and &lt;a href="http://crystal-lang.org/"&gt;Crystal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, having to annotate everything is a very strict requirement. It is not &lt;strong&gt;Don't Repeat Yourself&lt;/strong&gt;. It is harder to work with and less flexible. It is not backwards-compatible with existing Ruby code. Unless you put an unrealistically huge effort into it, it will not proof your software is correct. It will not free you from the responsibility to ensure your program is working properly (for instance, by writing tests).&lt;/p&gt;

&lt;p&gt;Yet, it will check types for you.&lt;/p&gt;

&lt;h2 id="manual-type-checking-at-runtime"&gt;Manual Type Checking at Runtime&lt;/h2&gt;

&lt;p&gt;There are some options out there that can assist you with explicitly and optionally checking the type of method arguments and return values, for example &lt;a href="https://github.com/gogotanaka/Rubype"&gt;Rubype&lt;/a&gt;, or my very similar &lt;a href="https://github.com/janlelis/sig"&gt;sig&lt;/a&gt; library:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# On main object
sig [:to_i, :to_i], Integer,
def sum(a, b)
  a.to_i + b.to_i
end

sum(42, false)
# Sig::ArgumentTypeError:
# - Expected false to respond to :to_i

# In modules
class A
  sig [Numeric, Numeric], Numeric,
  def mul(a, b)
    a * b
  end
end

A.new.mul(4,"3")
# Sig::ArgumentTypeError:
# - Expected "3" to be a Numeric, but is a String


# Explicitely define signature for singleton_class
class B
  sig_self [:reverse],
  def self.rev(object)
    object.reverse
  end
end

B.rev 42
# Sig::ArgumentTypeError:
# - Expected 42 to respond to :reverse
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is also some &lt;a href="http://www.cs.umd.edu/~jfoster/papers/oops13.pdf"&gt;academic work&lt;/a&gt; that explores advanced runtime checking (like "gradual" typing) and resulted in the &lt;a href="https://github.com/plum-umd/rtc"&gt;Ruby Type Checker&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="future"&gt;Future&lt;/h2&gt;

&lt;p&gt;But isn't the point of Ruby being a dynamic language and not having to care about types?&lt;/p&gt;

&lt;p&gt;…which is true and false at the same time. We are still dealing with types, since we do type checks all the time. Type checking is not a binary question. As a matter of fact, some form of static typing will &lt;a href="http://confreaks.tv/videos/rubyconf2014-opening-keynote"&gt;perhaps be introduced in Ruby 3.0&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Types are not evil, they are all around us. Ruby 3.0 may include a new typing system. That is great news! In order to be as &lt;em&gt;rubyistic&lt;/em&gt; as possible, it should:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Be optional&lt;/li&gt;
  &lt;li&gt;Support duck types&lt;/li&gt;
  &lt;li&gt;Have an intuitive syntax&lt;/li&gt;
  &lt;li&gt;Perhaps use &lt;a href="https://en.wikipedia.org/wiki/Gradual_typing"&gt;gradual typing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Help us all writing better programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2020 update:&lt;/strong&gt; &lt;a href="https://rubyreferences.github.io/rubychanges/3.0.html#types"&gt;Ruby 3.0 introduced types&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Official: &lt;a href="https://github.com/ruby/rbs"&gt;rbs&lt;/a&gt; and &lt;a href="https://github.com/ruby/typeprof"&gt;typeprof&lt;/a&gt; gems&lt;/li&gt;
  &lt;li&gt;Alternative: &lt;a href="https://sorbet.org/"&gt;sorbet&lt;/a&gt; type checker&lt;/li&gt;
  &lt;li&gt;Older approach: &lt;a href="http://blog.codeclimate.com/blog/2014/05/06/gradual-type-checking-for-ruby/"&gt;Gradual Type Checking for Ruby&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;How it is done in a close language: &lt;a href="http://crystal-lang.org/2016/05/05/crystal-0.16.0-released.html"&gt;Types in Crystal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>ERB Render Standard</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/36-erb-render-standard.html"/>
    <id>https://idiosyncratic-ruby.com/36-erb-render-standard.html</id>
    <published>2016-05-05T00:00:00Z</published>
    <updated>2016-05-05T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;ERB stands for &lt;em&gt;&amp;lt;%# Embedded Ruby %&amp;gt;&lt;/em&gt; and is the templating engine included in the Ruby Standard Library. While there are more recent gems that provide a better templating experience (see &lt;a href="https://github.com/rtomayko/tilt"&gt;tilt&lt;/a&gt; for an abstraction, and &lt;a href="http://www.kuwata-lab.com/erubis/"&gt;erubis&lt;/a&gt;/&lt;a href="https://github.com/apotonick/erbse"&gt;erbse&lt;/a&gt; for an updated ERB), it is also convenient to have basic support directly in the standard library.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;However, it does not directly support rendering data from a &lt;a href="https://ruby-doc.org/core/Hash.html"&gt;Hash&lt;/a&gt;, but only from a &lt;a href="https://ruby-doc.org/core/Binding.html"&gt;Binding&lt;/a&gt; object:¹&lt;/p&gt;

&lt;p&gt;¹ &lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="#how-to-render-an-erb-template-post-25"&gt;It is now possible with Ruby 2.5 – click here to see the best best practice&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="how-to-render-an-erb-template-pre-21"&gt;How to Render an ERB Template² (Pre 2.1)&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;require "erb"
require "ostruct"

def render_erb(template, data = nil)
  ERB.new(template, nil, "%&amp;lt;&amp;gt;").result(
    OpenStruct.new(data).instance_eval { binding }
  )
end

example_data = {
  idiosyncratic: "Ruby"
}

example_template = &amp;lt;&amp;lt;TEMPLATE
&amp;lt;%= idiosyncratic %&amp;gt; 3.0
TEMPLATE

render_erb(example_template, example_data) # =&amp;gt; "Ruby 3.0\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;² Actually, this also supports a (quite useful) additional syntax of ERB templates, "percent-lines":&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;example_template2 =&amp;lt;&amp;lt;TEMPLATE
% calculation = 2 + 1
Result is: &amp;lt;%= calculation %&amp;gt;
TEMPLATE

render_erb(example_template2) # =&amp;gt; "Result is: 3\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="how-to-render-an-erb-template-post-21"&gt;How to Render an ERB Template (Post 2.1)&lt;/h2&gt;

&lt;p&gt;Ruby 2.1 came with &lt;a href="https://ruby-doc.org/core/Binding.html#method-i-local_variable_set"&gt;Binding#local_variable_set&lt;/a&gt;, so we can remove &lt;a href="https://ruby-doc.org/stdlib/libdoc/ostruct/rdoc/OpenStruct.html"&gt;OpenStruct&lt;/a&gt; from the equation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "erb"

def render_erb(template, data = {})
  render_binding = binding
  data.each{ |key, value| render_binding.local_variable_set(key.to_sym, value) }
  ERB.new(template, nil, "%&amp;lt;&amp;gt;").result(render_binding)
end

example_data = {
  idiosyncratic: "Ruby"
}

example_template = &amp;lt;&amp;lt;TEMPLATE
&amp;lt;%= idiosyncratic %&amp;gt; 3.0
TEMPLATE

render_erb(example_template, example_data) # =&amp;gt; "Ruby 3.0\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Both versions' bindings also contain the method arguments of &lt;code&gt;render_erb&lt;/code&gt;, so you can access &lt;code&gt;template&lt;/code&gt; and &lt;code&gt;data&lt;/code&gt; from within the template. If you don't like this, you can can use &lt;a href="/44-top-level-binding.html"&gt;&lt;code&gt;TOPLEVEL_BINDING.dup&lt;/code&gt; to work around the local parameters&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="how-to-render-an-erb-template-post-25"&gt;How to Render an ERB Template (Post 2.5)&lt;/h2&gt;

&lt;p&gt;Ruby 2.5 finally introduces a way to render hashes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "erb"

def render_erb(template, data = {})
  ERB.new(template, nil, "%&amp;lt;&amp;gt;").result_with_hash(data)
end

example_data = {
  idiosyncratic: "Ruby"
}

example_template = &amp;lt;&amp;lt;TEMPLATE
&amp;lt;%= idiosyncratic %&amp;gt; 3.0
TEMPLATE

render_erb(example_template, example_data) # =&amp;gt; "Ruby 3.0\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/erb/rdoc/ERB.html"&gt;RDoc: ERB&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/derb/blob/master/bin/derb"&gt;Tiny command-line tool that renders an ERB template with data from a YAML file&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/productive-sublime-snippets-erb"&gt;Snippets for Sublime Text&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Identification</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/35-identification.html"/>
    <id>https://idiosyncratic-ruby.com/35-identification.html</id>
    <published>2016-05-04T00:00:00Z</published>
    <updated>2016-05-04T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Is it a hash? Or is it a hash?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hash = {"Idiosyncratic" =&amp;gt; "Ruby"}
hash["Idiosyncratic"] # =&amp;gt; "Ruby"

hash.compare_by_identity
idiosyncratic_in_variable = "Idiosyncratic"
hash[idiosyncratic_in_variable] # =&amp;gt; nil
hash["Idiosyncratic"] # =&amp;gt; "Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://ruby-doc.org/core/Hash.html#method-i-compare_by_identity"&gt;&lt;code&gt;Hash#compare_by_identity&lt;/code&gt;&lt;/a&gt; changes the semantics of what is equal in a hash and what not. Only if exact the same object is passed in, the value will be retrieved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please note:&lt;/strong&gt; The above example works for the key of&lt;code&gt;"Idiosyncratic"&lt;/code&gt;, because every string literal returns the same object. This behaviour has been introduced with Ruby 2.2, so running it in 2.1 or lower will return &lt;code&gt;nil&lt;/code&gt; for the last line.&lt;/p&gt;

&lt;h2 id="hash-surprise"&gt;Hash Surprise&lt;/h2&gt;

&lt;p&gt;Identity hashes can feel very unnatural as the following snippet illustrates:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hash = {}.compare_by_identity

a="Idiosyncratic"
b="Idiosyncratic"
c="Idiosyncratic"

hash[a] = "Ruby1"
hash[b] = "Ruby2"
hash[c] = "Ruby3"

hash #=&amp;gt; {"Idiosyncratic"=&amp;gt;"Ruby1",
     #    "Idiosyncratic"=&amp;gt;"Ruby2",
     #    "Idiosyncratic"=&amp;gt;"Ruby3"}

# Quiz: What is the result of: hash["Idiosyncratic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="explicit-identity-hashes"&gt;Explicit Identity Hashes&lt;/h2&gt;

&lt;p&gt;What can be done to improve readability and reduce surprise? A starting point can be using an extra class:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class IdentityHash &amp;lt; Hash
  def initialize(*)
    super.compare_by_identity
  end

  def inspect
    "#&amp;lt;IdentityHash: #{super}&amp;gt;"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For this class to be really useful it would need some more Hash-like features, like ActiveSupport does with &lt;a href="https://github.com/rails/rails/blob/master/activesupport/lib/active_support/hash_with_indifferent_access.rb"&gt;HashWithIndifferentAccess&lt;/a&gt;. Still, it is already less confusable than some hash that looks like a normal hash and that you haven't checked &lt;code&gt;compare_by_identity?&lt;/code&gt; for.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Utility Gems</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/34-utility-gems.html"/>
    <id>https://idiosyncratic-ruby.com/34-utility-gems.html</id>
    <published>2016-05-03T00:00:00Z</published>
    <updated>2016-05-03T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href="https://rubygems.org/"&gt;RubyGems&lt;/a&gt; is bundled with core Ruby since 1.9, which was first released in 2007. As long as you do not run Ruby with the &lt;code&gt;$ ruby --disable-gems&lt;/code&gt; flag, it is available to you without having to install anything. This also means that you can use some of RubyGems' support utilities for free!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="current-platform-info"&gt;1) Current Platform Info&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;Gem::Platform.local.os # =&amp;gt; "linux"
Gem::Platform.local.cpu # =&amp;gt; "x86_64"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The value is derived from &lt;a href="/42-ruby-config.html"&gt;RbConfig&lt;/a&gt;. Also see the &lt;a href="https://github.com/rdp/os"&gt;OS&lt;/a&gt; gem, which provides similar functionality.&lt;/p&gt;

&lt;h2 id="gemutilgzip-and-gemutilgunzip"&gt;2) &lt;code&gt;Gem::Util.gzip&lt;/code&gt; and &lt;code&gt;Gem::Util.gunzip&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Super simple access to text compression functionality:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "rubygems/util"
s = "Ruby"*99
s.size #=&amp;gt; 396
c = Gem::Util.gzip(s)
c.size #=&amp;gt; 29
Gem::Util.gunzip(c) == s #=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="console-use-interface"&gt;3) Console Use Interface&lt;/h2&gt;

&lt;p&gt;If you don't feel like reinventing the wheel today, use RubyGems' neat user_interaction helpers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "rubygems/user_interaction"
ui = Gem::ConsoleUI.new

# Get Yes or No from the user
ui.ask_yes_no "Install, this script?", false
# -&amp;gt;
# Install, this script? [yN]

# Password Prompt
password = ui.ask_for_password "Master password:"
# -&amp;gt;
# Master password:

# Select Option
selected = ui.choose_from_list "How to move on?", [
"Go",
"Elixir",
"EcmaScript 2016",
"Real World Haskell"
]
# -&amp;gt;
# How to move on?
#  1. Go
#  2. Elixir
#  3. EcmaScript 2016
#  4. Real World Haskell
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="a-list-of-licenses"&gt;4) A List of Licenses&lt;/h2&gt;

&lt;p&gt;RubyGems includes some &lt;a href="http://spdx.org/spdx-license-list"&gt;common license identifiers&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Gem::Licenses::LICENSE_IDENTIFIERS # =&amp;gt;
["0BSD", "AAL", "ADSL", "AFL-1.1", "AFL-1.2", "AFL-2.0", "AFL-2.1", "AFL-3.0", "AGPL-1.0", "AGPL-3.0", "AGPL-3.0-only", "AGPL-3.0-or-later", "AMDPLPA", "AML", "AMPAS", "ANTLR-PD", "APAFML", "APL-1.0", "APSL-1.0", "APSL-1.1", "APSL-1.2", "APSL-2.0", "Abstyles", "Adobe-2006", "Adobe-Glyph", "Afmparse", "Aladdin", "Apache-1.0", "Apache-1.1", "Apache-2.0", "Artistic-1.0", "Artistic-1.0-Perl", "Artistic-1.0-cl8", "Artistic-2.0", "BSD-1-Clause", "BSD-2-Clause", "BSD-2-Clause-FreeBSD", "BSD-2-Clause-NetBSD", "BSD-2-Clause-Patent", "BSD-3-Clause", "BSD-3-Clause-Attribution", "BSD-3-Clause-Clear", "BSD-3-Clause-LBNL", "BSD-3-Clause-No-Nuclear-License", "BSD-3-Clause-No-Nuclear-License-2014", "BSD-3-Clause-No-Nuclear-Warranty", "BSD-4-Clause", "BSD-4-Clause-UC", "BSD-Protection", "BSD-Source-Code", "BSL-1.0", "Bahyph", "Barr", "Beerware", "BitTorrent-1.0", "BitTorrent-1.1", "Borceux", "CATOSL-1.1", "CC-BY-1.0", "CC-BY-2.0", "CC-BY-2.5", "CC-BY-3.0", "CC-BY-4.0", "CC-BY-NC-1.0", "CC-BY-NC-2.0", "CC-BY-NC-2.5", "CC-BY-NC-3.0", "CC-BY-NC-4.0", "CC-BY-NC-ND-1.0", "CC-BY-NC-ND-2.0", "CC-BY-NC-ND-2.5", "CC-BY-NC-ND-3.0", "CC-BY-NC-ND-4.0", "CC-BY-NC-SA-1.0", "CC-BY-NC-SA-2.0", "CC-BY-NC-SA-2.5", "CC-BY-NC-SA-3.0", "CC-BY-NC-SA-4.0", "CC-BY-ND-1.0", "CC-BY-ND-2.0", "CC-BY-ND-2.5", "CC-BY-ND-3.0", "CC-BY-ND-4.0", "CC-BY-SA-1.0", "CC-BY-SA-2.0", "CC-BY-SA-2.5", "CC-BY-SA-3.0", "CC-BY-SA-4.0", "CC0-1.0", "CDDL-1.0", "CDDL-1.1", "CDLA-Permissive-1.0", "CDLA-Sharing-1.0", "CECILL-1.0", "CECILL-1.1", "CECILL-2.0", "CECILL-2.1", "CECILL-B", "CECILL-C", "CNRI-Jython", "CNRI-Python", "CNRI-Python-GPL-Compatible", "CPAL-1.0", "CPL-1.0", "CPOL-1.02", "CUA-OPL-1.0", "Caldera", "ClArtistic", "Condor-1.1", "Crossword", "CrystalStacker", "Cube", "D-FSL-1.0", "DOC", "DSDP", "Dotseqn", "ECL-1.0", "ECL-2.0", "EFL-1.0", "EFL-2.0", "EPL-1.0", "EPL-2.0", "EUDatagrid", "EUPL-1.0", "EUPL-1.1", "EUPL-1.2", "Entessa", "ErlPL-1.1", "Eurosym", "FSFAP", "FSFUL", "FSFULLR", "FTL", "Fair", "Frameworx-1.0", "FreeImage", "GFDL-1.1", "GFDL-1.1-only", "GFDL-1.1-or-later", "GFDL-1.2", "GFDL-1.2-only", "GFDL-1.2-or-later", "GFDL-1.3", "GFDL-1.3-only", "GFDL-1.3-or-later", "GL2PS", "GPL-1.0", "GPL-1.0+", "GPL-1.0-only", "GPL-1.0-or-later", "GPL-2.0", "GPL-2.0+", "GPL-2.0-only", "GPL-2.0-or-later", "GPL-2.0-with-GCC-exception", "GPL-2.0-with-autoconf-exception", "GPL-2.0-with-bison-exception", "GPL-2.0-with-classpath-exception", "GPL-2.0-with-font-exception", "GPL-3.0", "GPL-3.0+", "GPL-3.0-only", "GPL-3.0-or-later", "GPL-3.0-with-GCC-exception", "GPL-3.0-with-autoconf-exception", "Giftware", "Glide", "Glulxe", "HPND", "HaskellReport", "IBM-pibs", "ICU", "IJG", "IPA", "IPL-1.0", "ISC", "ImageMagick", "Imlib2", "Info-ZIP", "Intel", "Intel-ACPI", "Interbase-1.0", "JSON", "JasPer-2.0", "LAL-1.2", "LAL-1.3", "LGPL-2.0", "LGPL-2.0+", "LGPL-2.0-only", "LGPL-2.0-or-later", "LGPL-2.1", "LGPL-2.1+", "LGPL-2.1-only", "LGPL-2.1-or-later", "LGPL-3.0", "LGPL-3.0+", "LGPL-3.0-only", "LGPL-3.0-or-later", "LGPLLR", "LPL-1.0", "LPL-1.02", "LPPL-1.0", "LPPL-1.1", "LPPL-1.2", "LPPL-1.3a", "LPPL-1.3c", "Latex2e", "Leptonica", "LiLiQ-P-1.1", "LiLiQ-R-1.1", "LiLiQ-Rplus-1.1", "Libpng", "MIT", "MIT-CMU", "MIT-advertising", "MIT-enna", "MIT-feh", "MITNFA", "MPL-1.0", "MPL-1.1", "MPL-2.0", "MPL-2.0-no-copyleft-exception", "MS-PL", "MS-RL", "MTLL", "MakeIndex", "MirOS", "Motosoto", "Multics", "Mup", "NASA-1.3", "NBPL-1.0", "NCSA", "NGPL", "NLOD-1.0", "NLPL", "NOSL", "NPL-1.0", "NPL-1.1", "NPOSL-3.0", "NRL", "NTP", "Naumen", "Net-SNMP", "NetCDF", "Newsletr", "Nokia", "Noweb", "Nunit", "OCCT-PL", "OCLC-2.0", "ODbL-1.0", "OFL-1.0", "OFL-1.1", "OGTSL", "OLDAP-1.1", "OLDAP-1.2", "OLDAP-1.3", "OLDAP-1.4", "OLDAP-2.0", "OLDAP-2.0.1", "OLDAP-2.1", "OLDAP-2.2", "OLDAP-2.2.1", "OLDAP-2.2.2", "OLDAP-2.3", "OLDAP-2.4", "OLDAP-2.5", "OLDAP-2.6", "OLDAP-2.7", "OLDAP-2.8", "OML", "OPL-1.0", "OSET-PL-2.1", "OSL-1.0", "OSL-1.1", "OSL-2.0", "OSL-2.1", "OSL-3.0", "OpenSSL", "PDDL-1.0", "PHP-3.0", "PHP-3.01", "Plexus", "PostgreSQL", "Python-2.0", "QPL-1.0", "Qhull", "RHeCos-1.1", "RPL-1.1", "RPL-1.5", "RPSL-1.0", "RSA-MD", "RSCPL", "Rdisc", "Ruby", "SAX-PD", "SCEA", "SGI-B-1.0", "SGI-B-1.1", "SGI-B-2.0", "SISSL", "SISSL-1.2", "SMLNJ", "SMPPL", "SNIA", "SPL-1.0", "SWL", "Saxpath", "Sendmail", "SimPL-2.0", "Sleepycat", "Spencer-86", "Spencer-94", "Spencer-99", "StandardML-NJ", "SugarCRM-1.1.3", "TCL", "TCP-wrappers", "TMate", "TORQUE-1.1", "TOSL", "UPL-1.0", "Unicode-DFS-2015", "Unicode-DFS-2016", "Unicode-TOU", "Unlicense", "VOSTROM", "VSL-1.0", "Vim", "W3C", "W3C-19980720", "W3C-20150513", "WTFPL", "Watcom-1.0", "Wsuipa", "X11", "XFree86-1.1", "XSkat", "Xerox", "Xnet", "YPL-1.0", "YPL-1.1", "ZPL-1.1", "ZPL-2.0", "ZPL-2.1", "Zed", "Zend-2.0", "Zimbra-1.3", "Zimbra-1.4", "Zlib", "bzip2-1.0.5", "bzip2-1.0.6", "curl", "diffmark", "dvipdfm", "eCos-2.0", "eGenix", "gSOAP-1.3b", "gnuplot", "iMatix", "libtiff", "mpich2", "psfrag", "psutils", "wxWindows", "xinetd", "xpp", "zlib-acknowledgement"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The data is also accessible via a special regex:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;!!Gem::Licenses::REGEXP.match?("MIT") # =&amp;gt; true
Gem::Licenses.match? "Ruby" # =&amp;gt; true
Gem::Licenses.match? "Crossword" # =&amp;gt; true
Gem::Licenses.match? "Idiosyncratic" # =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, it can also assist you with finding the right license:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Gem::Licenses.suggestions "ABC" #=&amp;gt; ["AAL", "AML", "DOC", "ISC", "W3C"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="gemutilsilentsystem"&gt;5) &lt;code&gt;Gem::Util.silent_system&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Like &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-system"&gt;Kernel#system&lt;/a&gt;, but without printing to &lt;code&gt;STDOUT&lt;/code&gt;/&lt;code&gt;STDERR&lt;/code&gt;. It will temporary replace &lt;code&gt;STDOUT&lt;/code&gt; and &lt;code&gt;STDERR&lt;/code&gt; with a null device:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rubygems/util'
# create file 123, but output nothing
Gem::Util.silent_system "touch 123"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you don't want to print anything, but you are still interested in the commands output, you can use &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-60"&gt;backticks&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id="gemutiltraverseparents"&gt;6) &lt;code&gt;Gem::Util.traverse_parents&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Get a list of parent directories of a specific directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rubygems/util'
puts Gem::Util.traverse_parents('.').to_a

# example

/home/jan/dev/idiosyncratic/source/posts
/home/jan/dev/idiosyncratic/source
/home/jan/dev/idiosyncratic
/home/jan/dev
/home/jan
/home
/
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="deprecation-helper"&gt;7) Deprecation Helper&lt;/h2&gt;

&lt;p&gt;RubyGems also provides a &lt;a href="http://docs.seattlerb.org/rubygems/Gem/Deprecate.html"&gt;&lt;code&gt;deprecate&lt;/code&gt; method&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$VERBOSE = true # activate interpreter warnings

module Kernel
  extend Gem::Deprecate
  deprecate :puts, :none, 2020, 12
  deprecate :format, :sprintf, 2016, 5
end

puts "test"
# NOTE: Object#puts is deprecated with no replacement. It will be removed on or after 2020-12-01.
# Object#puts called from (irb):9.

format "%.2f", 1
# NOTE: Object#format is deprecated; use sprintf instead. It will be removed on or after 2015-05-01.
# Object#format called from (irb):13.
&lt;/code&gt;&lt;/pre&gt;

</content>
  </entry>
  <entry>
    <title>Too Expressive &amp; * _ ?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/33-too-expressive.html"/>
    <id>https://idiosyncratic-ruby.com/33-too-expressive.html</id>
    <published>2016-05-02T00:00:00Z</published>
    <updated>2016-05-02T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's syntax is so expressive — it utilizes every printable, non-alphanumeric ASCII character as much as it cans. Sometimes, this can be confusing for beginners.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The next sections show 4+ different meanings of every portrayed single character (not counting different meaning as &lt;a href="https://idiosyncratic-ruby.com/15-207-ways-to-rome.html"&gt;custom string delimiter&lt;/a&gt; or meaning within a regex):&lt;/p&gt;

&lt;h2 id="question-mark-4-syntactical-meanings"&gt;Question Mark (4 Syntactical Meanings)&lt;/h2&gt;

&lt;p&gt;The question mark is a sure way to &lt;a href="https://idiosyncratic-ruby.com/1-test-highlights.html"&gt;confuse your syntax highlighter&lt;/a&gt;!&lt;/p&gt;

&lt;h3 id="valid-ending-of-a-method-name"&gt;Valid ending of a method name&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[].empty? # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="part-of-the-ternary-operator"&gt;&lt;code&gt;?:&lt;/code&gt; Part of the Ternary Operator&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;nil ? true : false # =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="char-literals"&gt;&lt;code&gt;?&lt;/code&gt; char literals&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;?? # =&amp;gt; "?"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="part-of-special-variable-"&gt;Part of Special Variable &lt;code&gt;$?&lt;/code&gt;&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;system "ls"
$? #=&amp;gt; #&amp;lt;Process::Status: pid 5223 exit 0&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="underscore-5-syntactical-meanings"&gt;Underscore (5 Syntactical Meanings)&lt;/h2&gt;

&lt;p&gt;Underscores serve as a good example of having multiple uses: No purpose interferes with another.&lt;/p&gt;

&lt;h3 id="valid-part-of-an-identifier-and-"&gt;Valid Part of an Identifier (and &lt;code&gt;$_&lt;/code&gt;)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;variable_name = 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="part-of-special-keywords-end-file-caller"&gt;Part of Special Keywords (&lt;code&gt;__END__&lt;/code&gt;, &lt;code&gt;__FILE__&lt;/code&gt;, &lt;code&gt;__caller__&lt;/code&gt;)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;File.dirname(__FILE__)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="allowed-to-visually-separate-numbers"&gt;Allowed to Visually Separate Numbers&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;1_000_000 # =&amp;gt; 1000000
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="ignored-parameter"&gt;Ignored Parameter&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;# other names would raise a SyntaxError (duplicated argument name)
def method_name(_,_)
  p _
end

method_name(42, 23)
# -&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="numbered-parameter"&gt;2.7: Numbered Parameter&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;def method_name(param)
  p _1
end

method_name(42)
# -&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="ampersand-6-syntactical-meanings"&gt;Ampersand (6 Syntactical Meanings)&lt;/h2&gt;

&lt;h3 id="methodoperator"&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; Method/Operator&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;p true &amp;amp;&amp;amp; false
# =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="methodoperator-for-numbers-arrays-booleans"&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; Method/Operator for Numbers, Arrays, Booleans&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;# set operation "and"
[1, 2] &amp;amp; [2] # =&amp;gt; 2

# bit operation "and"
2 &amp;amp; 3 # =&amp;gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="explicit-block-param"&gt;Explicit Block Param&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;def method_name(&amp;amp;block)
  p block.call(1)
  p block.call(2)
end

method_name{ |x| x.odd? }
# -&amp;gt; true
# -&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="toproc-shortcut"&gt;&lt;code&gt;to_proc&lt;/code&gt; Shortcut&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;class Class
  def to_proc
    lambda{ |*args| self.new(*args) }
  end
end

[[1,2],[3,5,6,7,3]].map(&amp;amp;Set) # =&amp;gt; [Set[1,2], Set[5,6,7,3]]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="part-of-special-variable--1"&gt;Part of Special Variable &lt;code&gt;$&amp;amp;&lt;/code&gt;&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;/sync/ =~ "Idiosyncratic"
$&amp;amp; # =&amp;gt; "sync"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="safe-navigation-operator"&gt;2.3: &lt;code&gt;&amp;amp;.&lt;/code&gt; Safe Navigation Operator&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;nil&amp;amp;.blank? # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="star-7-syntactical-meanings"&gt;Star (7 Syntactical Meanings)&lt;/h2&gt;

&lt;p&gt;The record holder!&lt;/p&gt;

&lt;h3 id="methodoperator-for-numbers-strings-arrays"&gt;&lt;code&gt;.*&lt;/code&gt; Method/Operator for Numbers, Strings, Arrays&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;4 * 4 # =&amp;gt; 16
["4", "2"] * "." # =&amp;gt; "4.2"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="methodoperator-for-numbers"&gt;&lt;code&gt;.**&lt;/code&gt; Method/Operator for Numbers&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;4 ** 4 # =&amp;gt; 256
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="rest-arguments"&gt;&lt;code&gt;*&lt;/code&gt; Rest Arguments&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;def method_name(*arguments)
  p arguments
end

method_name(42, 23)
# -&amp;gt; [42, 23]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="splat-arguments"&gt;&lt;code&gt;*&lt;/code&gt; Splat Arguments&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1, *2..4] # =&amp;gt; [1, 2, 3, 4]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="keyword-rest-arguments"&gt;&lt;code&gt;**&lt;/code&gt; Keyword Rest Arguments&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;def method_name(**arguments)
  p arguments
end

method_name(a: 42, b: 23)
# -&amp;gt; { a: 42, b: 23 }
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="keyword-splat-arguments"&gt;&lt;code&gt;**&lt;/code&gt; Keyword Splat Arguments&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;hash1 = { a: 1, b: 2 }
hash2 = { c: 3, **hash1 } # =&amp;gt; { a: 1, b: 2, c: 3 }
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="part-of-special-variable--2"&gt;Part of Special Variable &lt;code&gt;$*&lt;/code&gt;&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -e "p $*" -- 42 23
["42", "23"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/JuanitoFatas/what-do-you-call-this-in-ruby"&gt;What do you call this in Ruby?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://raw.githubusercontent.com/ruby/ruby/trunk/parse.y"&gt;Ruby's Grammar Definition&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;Special Global Variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>No More Errors</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/32-no-more-errors.html"/>
    <id>https://idiosyncratic-ruby.com/32-no-more-errors.html</id>
    <published>2016-05-01T00:00:00Z</published>
    <updated>2016-05-01T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;If you don't like errors in your code, you will have to fix them. This handy list of Ruby's errors will hopefully help you do so! (And welcome back for the second season of &lt;strong&gt;Idiosyncratic Ruby&lt;/strong&gt;!)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="built-in-exceptions"&gt;Built-in Exceptions&lt;/h2&gt;

&lt;table class="table-24-38-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Exception&lt;/th&gt;
      &lt;th&gt;Thrown by core Ruby when&lt;/th&gt;
      &lt;th&gt;Remarks&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/NoMemoryError.html"&gt;NoMemoryError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;The Ruby interpreter could not allocate the required memory&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Idiosyncratic" * 100_000_000_000&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/ScriptError.html"&gt;ScriptError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;Not thrown directly&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/LoadError.html"&gt;ScriptError → LoadError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A source file could not be &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-load"&gt;loaded&lt;/a&gt;, &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-require"&gt;required&lt;/a&gt;, or &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-require_relative"&gt;required relatively&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;It is meant for source code the current program is running and therefore should not be used for other kinds of files&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/NotImplementedError.html"&gt;ScriptError → NotImplementedError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A feature of Ruby does not work on this platform/OS, for example, &lt;a href="https://ruby-doc.org/core/Process.html#method-c-fork"&gt;fork&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Although it is often used as "I have not implemented it (yet)", its original purpose is low-level platform support errors&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SyntaxError.html"&gt;ScriptError → SyntaxError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Invalid Ruby syntax was found&lt;/td&gt;
      &lt;td&gt;Do not raise when parsing some other file format fails. It is meant for source code that the current program is running.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SecurityError.html"&gt;SecurityError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Mostly raised when attempting a forbidden &lt;a href="http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html"&gt;$SAFE level 1&lt;/a&gt; operation&lt;/td&gt;
      &lt;td&gt;Use as base class for critical security issues, which should intentionally not be rescued by default&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SignalException.html"&gt;SignalException&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A signal is received&lt;/td&gt;
      &lt;td&gt;The common way to catch a signal is the &lt;a href="https://ruby-doc.org/core/Signal.html#method-c-trap"&gt;trap&lt;/a&gt; method&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Interrupt.html"&gt;SignalException → Interrupt&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;An interrupt signal (SIGINT) is received&lt;/td&gt;
      &lt;td&gt;The common way to catch a signal is the &lt;a href="https://ruby-doc.org/core/Signal.html#method-c-trap"&gt;trap&lt;/a&gt; method&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/StandardError.html"&gt;StandardError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;Base class for normal exceptions. See next table.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SystemExit.html"&gt;SystemExit&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Thrown by &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-exit"&gt;Kernel#exit&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Not thrown by &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-exit-21"&gt;Kernel#exit!&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SystemStackError.html"&gt;SystemStackError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised for stack overflows, for example, in case of infinite recursion&lt;/td&gt;
      &lt;td&gt;Cannot always be caught by the interpreter&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/fatal.html"&gt;fatal&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;When a &lt;a href="https://github.com/ruby/ruby/blob/v2_3_0/thread.c#L4752-L4753"&gt;deadlock&lt;/a&gt; is discovered or &lt;a href="https://github.com/ruby/ruby/blob/v2_3_0/eval.c#L1651"&gt;this special vm exception&lt;/a&gt; is triggered&lt;/td&gt;
      &lt;td&gt;Never rescuable. You can use this hack to get a reference to the error object: &lt;code&gt;ObjectSpace.each_object(Class){|c| break c if c.ancestors.include?(Exception) &amp;amp;&amp;amp; c.name == 'fatal' }&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="standarderror"&gt;StandardError&lt;/h3&gt;

&lt;p&gt;These will be caught by the &lt;code&gt;rescue&lt;/code&gt; statement without defining an explicit error class.&lt;/p&gt;

&lt;table class="table-24-38-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Exception&lt;/th&gt;
      &lt;th&gt;Thrown by core Ruby when&lt;/th&gt;
      &lt;th&gt;Remarks&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/ArgumentError.html"&gt;ArgumentError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when a method is not given the proper arguments, for example, a wrong argument count&lt;/td&gt;
      &lt;td&gt;Best class to inherit from for custom errors describing that the method usage was wrong&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/UncaughtThrowError.html"&gt;ArgumentError → UncaughtThrowError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;When &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-throw"&gt;throw&lt;/a&gt; is used without the proper &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-catch"&gt;catch&lt;/a&gt; around&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/EncodingError.html"&gt;EncodingError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Sometimes raised directly in &lt;a href="https://github.com/ruby/ruby/blob/v2_3_0/encoding.c#L182-L189"&gt;unicode edge cases&lt;/a&gt; or when &lt;a href="https://github.com/ruby/ruby/blob/v2_3_0/symbol.c#L433"&gt;symbols are broken&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Encoding/CompatibilityError.html"&gt;EncodingError → Encoding:: CompatibilityError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when trying to combine strings of two incompatible encodings&lt;/td&gt;
      &lt;td&gt;Example: &lt;code&gt;"Idiosyn" +"crätic".encode("UTF-16LE")&lt;/code&gt; under UTF-8 leads to &lt;code&gt;Encoding::CompatibilityError: incompatible character encodings: UTF-8 and UTF-16LE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Encoding/ConverterNotFoundError.html"&gt;EncodingError → Encoding:: ConverterNotFoundError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when no encoding converter is available&lt;/td&gt;
      &lt;td&gt;Example: &lt;code&gt;"Idiosyncrätic".encode("ABC")&lt;/code&gt; under UTF-8 leads to &lt;code&gt;Encoding::ConverterNotFoundError: code converter not found (UTF-8 to ABC)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Encoding/InvalidByteSequenceError.html"&gt;EncodingError → Encoding:: InvalidByteSequenceError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;String contains byte sequences not valid in the current encoding&lt;/td&gt;
      &lt;td&gt;Example: &lt;code&gt;"Idiosyncr\u{D800}tic".encode("ASCII")&lt;/code&gt; under UTF-8 leads to &lt;code&gt;Encoding::InvalidByteSequenceError: "\xED" followed by "\xA0" on UTF-8&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Encoding/UndefinedConversionError.html"&gt;EncodingError → Encoding:: UndefinedConversionError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an encoding converter is available, but it cannot convert a specific codepoint&lt;/td&gt;
      &lt;td&gt;Example: &lt;code&gt;"\u{00A0}".encode("EUC-JP")&lt;/code&gt; under UTF-8 leads to &lt;code&gt;Encoding::UndefinedConversionError: U+00A0 from UTF-8 to EUC-JP&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Fiber.html"&gt;FiberError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an invalid operation is attempted on a &lt;a href="https://ruby-doc.org/core/Fiber.html"&gt;Fiber&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Such as: Attempting to call/resume a dead Fiber, yield from the root fiber, calling a Fiber across threads&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IOError.html"&gt;IOError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an &lt;a href="https://ruby-doc.org/core/IO.html"&gt;IO&lt;/a&gt; operation fails, like opening a file&lt;/td&gt;
      &lt;td&gt;Pay attention that there are some failures will raise a &lt;code&gt;SystemCallError&lt;/code&gt;, which is not a sub-class of &lt;code&gt;IOError&lt;/code&gt;!&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/EOFError.html"&gt;IOError → EOFError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised by many &lt;a href="https://ruby-doc.org/core/IO.html"&gt;IO&lt;/a&gt; operations when reaching the end of file&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IndexError.html"&gt;IndexError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an element or deducted value cannot be retrieved, for example, when using &lt;a href="https://ruby-doc.org/core/Array.html#method-i-fetch"&gt;Array#fetch&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Thrown by many core classes like Array, Regex, String, Struct or some standard libraries like &lt;a href="https://ruby-doc.org/stdlib/libdoc/strscan/rdoc/StringScanner.html"&gt;strscan&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/KeyError.html"&gt;IndexError → KeyError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an element cannot be retrieved (by a key), for example, when using &lt;a href="https://ruby-doc.org/core/Hash.html#method-i-fetch"&gt;Hash#fetch&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Mainly used by hashes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/StopIteration.html"&gt;IndexError → StopIteration&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when an &lt;a href="https://ruby-doc.org/core/Enumerator.html"&gt;external iterator&lt;/a&gt; has &lt;a href="https://ruby-doc.org/core/StopIteration.html"&gt;reached its end&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;You can use the &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-loop"&gt;Kernel#loop&lt;/a&gt; method to automatically catch &lt;code&gt;StopIteration&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/ClosedQueueError.html"&gt;IndexError → StopIteration → ClosedQueueError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when trying to modify a &lt;a href="https://ruby-doc.org/core/Queue.html#method-i-close"&gt;closed Queue&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/LocalJumpError.html"&gt;LocalJumpError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Thrown when an invalid control flow operation is attempted, like calling &lt;code&gt;yield&lt;/code&gt; from a method that was not passed a block to&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;LocalJumpError&lt;/code&gt;s contains a &lt;code&gt;reason&lt;/code&gt; and an &lt;code&gt;exit_value&lt;/code&gt; property from the last valid context&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Math/DomainError.html"&gt;Math::DomainError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;An invalid mathematical operation was attempted, for example, trying to calculate the &lt;a href="https://en.wikipedia.org/wiki/Inverse_trigonometric_functions"&gt;arctan&lt;/a&gt; of a value greater than 1&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/NameError.html"&gt;NameError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when referencing things that do not exist, like unknown constants&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/NoMethodError.html"&gt;NameError → NoMethodError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised if trying to call a method that does not exist, and no &lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-method_missing"&gt;&lt;code&gt;method_missing&lt;/code&gt;&lt;/a&gt; is defined&lt;/td&gt;
      &lt;td&gt;Trying to call non-existent private methods of &lt;code&gt;self&lt;/code&gt; (like &lt;code&gt;Kernel#puts&lt;/code&gt;) will result in &lt;code&gt;NameError&lt;/code&gt; instead of &lt;code&gt;NoMethodError&lt;/code&gt;, because it could also have been a local variable&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/RangeError.html"&gt;RangeError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A numerical number is off, most often it is too small or big&lt;/td&gt;
      &lt;td&gt;For example, &lt;code&gt;[].pack("C100000000000000000000")&lt;/code&gt; does not work, because &lt;a href="https://idiosyncratic-ruby.com/4-what-the-pack.html#c--an-unsigned-integer-per-byte"&gt;pack&lt;/a&gt; requires the number to fit into &lt;code&gt;long&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/FloatDomainError.html"&gt;RangeError → FloatDomainError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when trying to convert a special Float value (&lt;code&gt;NaN&lt;/code&gt;, &lt;code&gt;Float::INFINITY&lt;/code&gt;) to another number format that does not support special values&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/RegexpError.html"&gt;RegexpError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when trying to dynamically create an invalid regex&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/RuntimeError.html"&gt;RuntimeError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Unspecific occurrences&lt;/td&gt;
      &lt;td&gt;Default error class that will be used when raising a string: &lt;code&gt;raise "something"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/FrozenError.html"&gt;RuntimeError → FrozenError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised when trying to modify a frozen object&lt;/td&gt;
      &lt;td&gt;Introduced with Ruby 2.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/SystemCallError.html"&gt;SystemCallError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;Lower level system call errors. See next table.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/ThreadError.html"&gt;ThreadError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Raised for invalid &lt;a href="https://ruby-doc.org/core/Thread.html"&gt;Thread&lt;/a&gt; operations&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/TypeError.html"&gt;TypeError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Violations against Ruby's type system&lt;/td&gt;
      &lt;td&gt;For example, &lt;code&gt;"" + nil&lt;/code&gt; will lead to "TypeError: no implicit conversion of nil into String"&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/ZeroDivisionError.html"&gt;ZeroDivisionError&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;An integer, complex, or rational number was tried to divide by another integer, complex, or rational number&lt;/td&gt;
      &lt;td&gt;Floats and BigDecimal return Infinity, negative Infinity, or &lt;code&gt;NaN&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="systemcallerror"&gt;SystemCallError&lt;/h3&gt;

&lt;p&gt;These errors are thrown by the operating system under certain circumstances. The exact list depends on your platform and can be found in &lt;a href="https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html"&gt;a file called &lt;code&gt;errno.h&lt;/code&gt;&lt;/a&gt;. You get such errors when working with processes, &lt;a href="https://ruby-doc.org/stdlib/libdoc/socket/rdoc/Socket.html#method-i-connect-label-Unix-based+Exceptions"&gt;sockets&lt;/a&gt;, files, and other functionality that relies on low level system operations.&lt;/p&gt;

&lt;p&gt;What follows is the list of errors that are known by Ruby. The error numbers and messages were generated on a recent ubuntu Linux machine. All system call errors are namespaced under &lt;code&gt;Errno::&lt;/code&gt; and can be dynamically created using &lt;code&gt;SystemCallError.new(number)&lt;/code&gt;.&lt;/p&gt;

&lt;table class="table-30-8-36-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Exception&lt;/th&gt;
      &lt;th&gt;No&lt;/th&gt;
      &lt;th&gt;Message&lt;/th&gt;
      &lt;th&gt;Example One-Liner¹&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::E2BIG&lt;/td&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Argument list too long&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EACCES&lt;/td&gt;
      &lt;td&gt;13&lt;/td&gt;
      &lt;td&gt;Permission denied&lt;/td&gt;
      &lt;td&gt;As non-root: &lt;code&gt;File.read('/root')&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EADDRINUSE&lt;/td&gt;
      &lt;td&gt;98&lt;/td&gt;
      &lt;td&gt;Address already in use&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;require "socket"; 2.times{ TCPServer.new("", 3003) }&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EADDRNOTAVAIL&lt;/td&gt;
      &lt;td&gt;99&lt;/td&gt;
      &lt;td&gt;Cannot assign requested address&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EADV&lt;/td&gt;
      &lt;td&gt;68&lt;/td&gt;
      &lt;td&gt;Advertise error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EAFNOSUPPORT&lt;/td&gt;
      &lt;td&gt;97&lt;/td&gt;
      &lt;td&gt;Address family not supported by protocol&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EAGAIN&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;Resource temporarily unavailable&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO/EAGAINWaitReadable.html"&gt;Errno::EAGAIN → IO::EAGAINWaitReadable&lt;/a&gt;²&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;STDIN.read_nonblock(1)&lt;/code&gt; (if blocking)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO/EAGAINWaitWritable.html"&gt;Errno::EAGAIN → IO::EAGAINWaitWritable&lt;/a&gt;²&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EALREADY&lt;/td&gt;
      &lt;td&gt;114&lt;/td&gt;
      &lt;td&gt;Operation already in progress&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADE&lt;/td&gt;
      &lt;td&gt;52&lt;/td&gt;
      &lt;td&gt;Invalid exchange&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADF&lt;/td&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;Bad file descriptor&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;IO.new(-1)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADFD&lt;/td&gt;
      &lt;td&gt;77&lt;/td&gt;
      &lt;td&gt;File descriptor in bad state&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADMSG&lt;/td&gt;
      &lt;td&gt;74&lt;/td&gt;
      &lt;td&gt;Bad message&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADR&lt;/td&gt;
      &lt;td&gt;53&lt;/td&gt;
      &lt;td&gt;Invalid request descriptor&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADRQC&lt;/td&gt;
      &lt;td&gt;56&lt;/td&gt;
      &lt;td&gt;Invalid request code&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBADSLT&lt;/td&gt;
      &lt;td&gt;57&lt;/td&gt;
      &lt;td&gt;Invalid slot&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBFONT&lt;/td&gt;
      &lt;td&gt;59&lt;/td&gt;
      &lt;td&gt;Bad font file format&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EBUSY&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;Device or resource busy&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECANCELED&lt;/td&gt;
      &lt;td&gt;125&lt;/td&gt;
      &lt;td&gt;Operation canceled&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECHILD&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;No child processes&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Process.wait&lt;/code&gt; (with no child processes)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECHRNG&lt;/td&gt;
      &lt;td&gt;44&lt;/td&gt;
      &lt;td&gt;Channel number out of range&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECOMM&lt;/td&gt;
      &lt;td&gt;70&lt;/td&gt;
      &lt;td&gt;Communication error on send&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECONNABORTED&lt;/td&gt;
      &lt;td&gt;103&lt;/td&gt;
      &lt;td&gt;Software caused connection abort&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECONNREFUSED&lt;/td&gt;
      &lt;td&gt;111&lt;/td&gt;
      &lt;td&gt;Connection refused&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;require "socket"; TCPSocket.new("", rand(987654321))&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ECONNRESET&lt;/td&gt;
      &lt;td&gt;104&lt;/td&gt;
      &lt;td&gt;Connection reset by peer&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDEADLK&lt;/td&gt;
      &lt;td&gt;35&lt;/td&gt;
      &lt;td&gt;Resource deadlock avoided&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDEADLOCK&lt;/td&gt;
      &lt;td&gt;35&lt;/td&gt;
      &lt;td&gt;Resource deadlock avoided&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDESTADDRREQ&lt;/td&gt;
      &lt;td&gt;89&lt;/td&gt;
      &lt;td&gt;Destination address required&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDOM&lt;/td&gt;
      &lt;td&gt;33&lt;/td&gt;
      &lt;td&gt;Numerical argument out of domain&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDOTDOT&lt;/td&gt;
      &lt;td&gt;73&lt;/td&gt;
      &lt;td&gt;RFS specific error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EDQUOT&lt;/td&gt;
      &lt;td&gt;122&lt;/td&gt;
      &lt;td&gt;Disk quota exceeded&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EEXIST&lt;/td&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;File exists&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Dir.mkdir("/")&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EFAULT&lt;/td&gt;
      &lt;td&gt;14&lt;/td&gt;
      &lt;td&gt;Bad address&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EFBIG&lt;/td&gt;
      &lt;td&gt;27&lt;/td&gt;
      &lt;td&gt;File too large&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EHOSTDOWN&lt;/td&gt;
      &lt;td&gt;112&lt;/td&gt;
      &lt;td&gt;Host is down&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EHOSTUNREACH&lt;/td&gt;
      &lt;td&gt;113&lt;/td&gt;
      &lt;td&gt;No route to host&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EHWPOISON&lt;/td&gt;
      &lt;td&gt;133&lt;/td&gt;
      &lt;td&gt;Memory page has hardware error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EIDRM&lt;/td&gt;
      &lt;td&gt;43&lt;/td&gt;
      &lt;td&gt;Identifier removed&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EILSEQ&lt;/td&gt;
      &lt;td&gt;84&lt;/td&gt;
      &lt;td&gt;Invalid or incomplete multibyte or wide character&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EINPROGRESS&lt;/td&gt;
      &lt;td&gt;115&lt;/td&gt;
      &lt;td&gt;Operation now in progress&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO/EINPROGRESSWaitReadable.html"&gt;Errno::EINPROGRESS → IO::EINPROGRESSWaitReadable&lt;/a&gt;²&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO/EINPROGRESSWaitWritable.html"&gt;Errno::EINPROGRESS → IO::EINPROGRESSWaitWritable&lt;/a&gt;²&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EINTR&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;Interrupted system call&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EINVAL&lt;/td&gt;
      &lt;td&gt;22&lt;/td&gt;
      &lt;td&gt;Invalid argument&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Process.clock_gettime(42)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EIO&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;Input/output error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EISCONN&lt;/td&gt;
      &lt;td&gt;106&lt;/td&gt;
      &lt;td&gt;Transport endpoint is already connected&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EISDIR&lt;/td&gt;
      &lt;td&gt;21&lt;/td&gt;
      &lt;td&gt;Is a directory&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;File.read("/")&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EISNAM&lt;/td&gt;
      &lt;td&gt;120&lt;/td&gt;
      &lt;td&gt;Is a named type file&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EKEYEXPIRED&lt;/td&gt;
      &lt;td&gt;127&lt;/td&gt;
      &lt;td&gt;Key has expired&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EKEYREJECTED&lt;/td&gt;
      &lt;td&gt;129&lt;/td&gt;
      &lt;td&gt;Key was rejected by service&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EKEYREVOKED&lt;/td&gt;
      &lt;td&gt;128&lt;/td&gt;
      &lt;td&gt;Key has been revoked&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EL2HLT&lt;/td&gt;
      &lt;td&gt;51&lt;/td&gt;
      &lt;td&gt;Level 2 halted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EL2NSYNC&lt;/td&gt;
      &lt;td&gt;45&lt;/td&gt;
      &lt;td&gt;Level 2 not synchronized&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EL3HLT&lt;/td&gt;
      &lt;td&gt;46&lt;/td&gt;
      &lt;td&gt;Level 3 halted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EL3RST&lt;/td&gt;
      &lt;td&gt;47&lt;/td&gt;
      &lt;td&gt;Level 3 reset&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELIBACC&lt;/td&gt;
      &lt;td&gt;79&lt;/td&gt;
      &lt;td&gt;Can not access a needed shared library&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELIBBAD&lt;/td&gt;
      &lt;td&gt;80&lt;/td&gt;
      &lt;td&gt;Accessing a corrupted shared library&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELIBEXEC&lt;/td&gt;
      &lt;td&gt;83&lt;/td&gt;
      &lt;td&gt;Cannot exec a shared library directly&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELIBMAX&lt;/td&gt;
      &lt;td&gt;82&lt;/td&gt;
      &lt;td&gt;Attempting to link in too many shared libraries&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELIBSCN&lt;/td&gt;
      &lt;td&gt;81&lt;/td&gt;
      &lt;td&gt;.lib section in a.out corrupted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELNRNG&lt;/td&gt;
      &lt;td&gt;48&lt;/td&gt;
      &lt;td&gt;Link number out of range&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ELOOP&lt;/td&gt;
      &lt;td&gt;40&lt;/td&gt;
      &lt;td&gt;Too many levels of symbolic links&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EMEDIUMTYPE&lt;/td&gt;
      &lt;td&gt;124&lt;/td&gt;
      &lt;td&gt;Wrong medium type&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EMFILE&lt;/td&gt;
      &lt;td&gt;24&lt;/td&gt;
      &lt;td&gt;Too many open files&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EMLINK&lt;/td&gt;
      &lt;td&gt;31&lt;/td&gt;
      &lt;td&gt;Too many links&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EMSGSIZE&lt;/td&gt;
      &lt;td&gt;90&lt;/td&gt;
      &lt;td&gt;Message too long&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EMULTIHOP&lt;/td&gt;
      &lt;td&gt;72&lt;/td&gt;
      &lt;td&gt;Multihop attempted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENAMETOOLONG&lt;/td&gt;
      &lt;td&gt;36&lt;/td&gt;
      &lt;td&gt;File name too long&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;File.read("Ruby"*1000)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENAVAIL&lt;/td&gt;
      &lt;td&gt;119&lt;/td&gt;
      &lt;td&gt;No XENIX semaphores available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENETDOWN&lt;/td&gt;
      &lt;td&gt;100&lt;/td&gt;
      &lt;td&gt;Network is down&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENETRESET&lt;/td&gt;
      &lt;td&gt;102&lt;/td&gt;
      &lt;td&gt;Network dropped connection on reset&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENETUNREACH&lt;/td&gt;
      &lt;td&gt;101&lt;/td&gt;
      &lt;td&gt;Network is unreachable&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENFILE&lt;/td&gt;
      &lt;td&gt;23&lt;/td&gt;
      &lt;td&gt;Too many open files in system&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOANO&lt;/td&gt;
      &lt;td&gt;55&lt;/td&gt;
      &lt;td&gt;No anode&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOBUFS&lt;/td&gt;
      &lt;td&gt;105&lt;/td&gt;
      &lt;td&gt;No buffer space available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOCSI&lt;/td&gt;
      &lt;td&gt;50&lt;/td&gt;
      &lt;td&gt;No CSI structure available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENODATA&lt;/td&gt;
      &lt;td&gt;61&lt;/td&gt;
      &lt;td&gt;No data available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENODEV&lt;/td&gt;
      &lt;td&gt;19&lt;/td&gt;
      &lt;td&gt;No such device&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOENT&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;No such file or directory&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;File.read("does not exist")&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOEXEC&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;Exec format error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOKEY&lt;/td&gt;
      &lt;td&gt;126&lt;/td&gt;
      &lt;td&gt;Required key not available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOLCK&lt;/td&gt;
      &lt;td&gt;37&lt;/td&gt;
      &lt;td&gt;No locks available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOLINK&lt;/td&gt;
      &lt;td&gt;67&lt;/td&gt;
      &lt;td&gt;Link has been severed&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOMEDIUM&lt;/td&gt;
      &lt;td&gt;123&lt;/td&gt;
      &lt;td&gt;No medium found&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOMEM&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;Cannot allocate memory&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOMSG&lt;/td&gt;
      &lt;td&gt;42&lt;/td&gt;
      &lt;td&gt;No message of desired type&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENONET&lt;/td&gt;
      &lt;td&gt;64&lt;/td&gt;
      &lt;td&gt;Machine is not on the network&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOPKG&lt;/td&gt;
      &lt;td&gt;65&lt;/td&gt;
      &lt;td&gt;Package not installed&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOPROTOOPT&lt;/td&gt;
      &lt;td&gt;92&lt;/td&gt;
      &lt;td&gt;Protocol not available&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOSPC&lt;/td&gt;
      &lt;td&gt;28&lt;/td&gt;
      &lt;td&gt;No space left on device&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOSR&lt;/td&gt;
      &lt;td&gt;63&lt;/td&gt;
      &lt;td&gt;Out of streams resources&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOSTR&lt;/td&gt;
      &lt;td&gt;60&lt;/td&gt;
      &lt;td&gt;Device not a stream&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOSYS&lt;/td&gt;
      &lt;td&gt;38&lt;/td&gt;
      &lt;td&gt;Function not implemented&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTBLK&lt;/td&gt;
      &lt;td&gt;15&lt;/td&gt;
      &lt;td&gt;Block device required&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTCONN&lt;/td&gt;
      &lt;td&gt;107&lt;/td&gt;
      &lt;td&gt;Transport endpoint is not connected&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTDIR&lt;/td&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;Not a directory&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTEMPTY&lt;/td&gt;
      &lt;td&gt;39&lt;/td&gt;
      &lt;td&gt;Directory not empty&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTNAM&lt;/td&gt;
      &lt;td&gt;118&lt;/td&gt;
      &lt;td&gt;Not a XENIX named type file&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTRECOVERABLE&lt;/td&gt;
      &lt;td&gt;131&lt;/td&gt;
      &lt;td&gt;State not recoverable&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTSOCK&lt;/td&gt;
      &lt;td&gt;88&lt;/td&gt;
      &lt;td&gt;Socket operation on non-socket&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTSUP&lt;/td&gt;
      &lt;td&gt;95&lt;/td&gt;
      &lt;td&gt;Operation not supported&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTTY&lt;/td&gt;
      &lt;td&gt;25&lt;/td&gt;
      &lt;td&gt;Inappropriate ioctl for device&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENOTUNIQ&lt;/td&gt;
      &lt;td&gt;76&lt;/td&gt;
      &lt;td&gt;Name not unique on network&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ENXIO&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;No such device or address&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EOPNOTSUPP&lt;/td&gt;
      &lt;td&gt;95&lt;/td&gt;
      &lt;td&gt;Operation not supported&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EOVERFLOW&lt;/td&gt;
      &lt;td&gt;75&lt;/td&gt;
      &lt;td&gt;Value too large for defined data type&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EOWNERDEAD&lt;/td&gt;
      &lt;td&gt;130&lt;/td&gt;
      &lt;td&gt;Owner died&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPERM&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Operation not permitted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPFNOSUPPORT&lt;/td&gt;
      &lt;td&gt;96&lt;/td&gt;
      &lt;td&gt;Protocol family not supported&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPIPE&lt;/td&gt;
      &lt;td&gt;32&lt;/td&gt;
      &lt;td&gt;Broken pipe&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPROTO&lt;/td&gt;
      &lt;td&gt;71&lt;/td&gt;
      &lt;td&gt;Protocol error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPROTONOSUPPORT&lt;/td&gt;
      &lt;td&gt;93&lt;/td&gt;
      &lt;td&gt;Protocol not supported&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EPROTOTYPE&lt;/td&gt;
      &lt;td&gt;91&lt;/td&gt;
      &lt;td&gt;Protocol wrong type for socket&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ERANGE&lt;/td&gt;
      &lt;td&gt;34&lt;/td&gt;
      &lt;td&gt;Numerical result out of range&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EREMCHG&lt;/td&gt;
      &lt;td&gt;78&lt;/td&gt;
      &lt;td&gt;Remote address changed&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EREMOTE&lt;/td&gt;
      &lt;td&gt;66&lt;/td&gt;
      &lt;td&gt;Object is remote&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EREMOTEIO&lt;/td&gt;
      &lt;td&gt;121&lt;/td&gt;
      &lt;td&gt;Remote I/O error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ERESTART&lt;/td&gt;
      &lt;td&gt;85&lt;/td&gt;
      &lt;td&gt;Interrupted system call should be restarted&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ERFKILL&lt;/td&gt;
      &lt;td&gt;132&lt;/td&gt;
      &lt;td&gt;Operation not possible due to RF-kill&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EROFS&lt;/td&gt;
      &lt;td&gt;30&lt;/td&gt;
      &lt;td&gt;Read-only file system&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESHUTDOWN&lt;/td&gt;
      &lt;td&gt;108&lt;/td&gt;
      &lt;td&gt;Cannot send after transport endpoint shutdown&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESOCKTNOSUPPORT&lt;/td&gt;
      &lt;td&gt;94&lt;/td&gt;
      &lt;td&gt;Socket type not supported&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESPIPE&lt;/td&gt;
      &lt;td&gt;29&lt;/td&gt;
      &lt;td&gt;Illegal seek&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESRCH&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;No such process&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Process.kill(:KILL, 987654321)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESRMNT&lt;/td&gt;
      &lt;td&gt;69&lt;/td&gt;
      &lt;td&gt;Surmount error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESTALE&lt;/td&gt;
      &lt;td&gt;116&lt;/td&gt;
      &lt;td&gt;Stale file handle&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ESTRPIPE&lt;/td&gt;
      &lt;td&gt;86&lt;/td&gt;
      &lt;td&gt;Streams pipe error&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ETIME&lt;/td&gt;
      &lt;td&gt;62&lt;/td&gt;
      &lt;td&gt;Timer expired&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ETIMEDOUT&lt;/td&gt;
      &lt;td&gt;110&lt;/td&gt;
      &lt;td&gt;Connection timed out&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ETOOMANYREFS&lt;/td&gt;
      &lt;td&gt;109&lt;/td&gt;
      &lt;td&gt;Too many references: cannot splice&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::ETXTBSY&lt;/td&gt;
      &lt;td&gt;26&lt;/td&gt;
      &lt;td&gt;Text file busy&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EUCLEAN&lt;/td&gt;
      &lt;td&gt;117&lt;/td&gt;
      &lt;td&gt;Structure needs cleaning&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EUNATCH&lt;/td&gt;
      &lt;td&gt;49&lt;/td&gt;
      &lt;td&gt;Protocol driver not attached&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EUSERS&lt;/td&gt;
      &lt;td&gt;87&lt;/td&gt;
      &lt;td&gt;Too many users&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EWOULDBLOCK³&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;Resource temporarily unavailable&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EXDEV&lt;/td&gt;
      &lt;td&gt;18&lt;/td&gt;
      &lt;td&gt;Invalid cross-device link&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::EXFULL&lt;/td&gt;
      &lt;td&gt;54&lt;/td&gt;
      &lt;td&gt;Exchange full&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Errno::NOERROR&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Success&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Feel free to &lt;a href="https://github.com/janlelis/idiosyncratic-ruby.com/issues/new"&gt;suggest more one-liners&lt;/a&gt;&lt;br /&gt;
² These include &lt;code&gt;IO::WaitReadable&lt;/code&gt;/&lt;code&gt;IO::WaitWritable&lt;/code&gt;. See &lt;a href="https://ruby-doc.org/core/IO.html#method-i-read_nonblock"&gt;IO#read_nonblock&lt;/a&gt;.&lt;br /&gt;
³ EAGAIN == EWOULDBLOCK &lt;a href="https://stackoverflow.com/questions/7003234/which-systems-define-eagain-and-ewouldblock-as-different-values"&gt;on most systems&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Exception.html"&gt;RDoc: Exception&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/defs/known_errors.def"&gt;Source: defs/known_errors.def&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.ioplex.com/~miallen/errcmpp.html"&gt;Popular Errno Codes by Platform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Roots of Rubyism</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/31-roots-of-rubyism.html"/>
    <id>https://idiosyncratic-ruby.com/31-roots-of-rubyism.html</id>
    <published>2015-05-31T00:00:00Z</published>
    <updated>2015-05-31T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;This is a summary of reasons why you should still use Ruby:&lt;/p&gt;

&lt;p&gt;It is a language with a &lt;strong&gt;terrific community&lt;/strong&gt; (welcoming and always questioning itself) and &lt;strong&gt;ecosystem&lt;/strong&gt; (a lot of problems &lt;a href="https://rubygems.org/"&gt;already&lt;/a&gt; &lt;a href="https://www.ruby-toolbox.com/"&gt;solved&lt;/a&gt;), which is &lt;strong&gt;beautiful&lt;/strong&gt; (focus on productivity), a little &lt;strong&gt;conservative&lt;/strong&gt; (in the sense that it is easy to work with), and &lt;strong&gt;general purpose&lt;/strong&gt; (a good choice in most cases).&lt;/p&gt;

&lt;p&gt;For a deeper understanding of Ruby's principles, reading &lt;a href="https://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;matz&lt;/a&gt; is highly recommended:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="the-philosophy-behind-ruby"&gt;The Philosophy Behind Ruby&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.safaribooksonline.com/library/view/beautiful-code/9780596510046/ch29.html"&gt;Essay: Treating Code As an Essay (excerpt)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.artima.com/intv/ruby.html"&gt;Interview: The Philosophy of Ruby&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://confreaks.tv/videos/rubyconf2009-keynote-address"&gt;Talk: The 0.8 True Language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Regex with Class</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/30-regex-with-class.html"/>
    <id>https://idiosyncratic-ruby.com/30-regex-with-class.html</id>
    <published>2015-05-30T00:00:00Z</published>
    <updated>2015-05-30T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's regex engine defines a lot of shortcut character classes. Besides the common meta characters (&lt;code&gt;\w&lt;/code&gt;, etc.), there is also the &lt;a href="http://www.regular-expressions.info/posix.html"&gt;POSIX style expressions&lt;/a&gt; and the &lt;a href="https://en.wikipedia.org/wiki/Unicode_character_property"&gt;unicode property&lt;/a&gt; syntax. This is an overview of all character classes:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="meta-chars"&gt;Meta Chars&lt;/h2&gt;

&lt;table class="table-11-11-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Char&lt;/th&gt;
      &lt;th&gt;Negation&lt;/th&gt;
      &lt;th&gt;ASCII&lt;/th&gt;
      &lt;th&gt;Unicode&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;¹ Any&lt;/td&gt;
      &lt;td&gt;¹ Any&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\X&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;Any&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries"&gt;Grapheme clusters&lt;/a&gt; (&lt;code&gt;\P{M}\p{M}*&lt;/code&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\d&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\D&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;² ASCII plus &lt;strong&gt;Decimal_Number&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Nd/list.htm"&gt;Nd&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\h&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\H&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9a-fA-F]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Like ASCII&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\w&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\W&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9a-zA-Z_]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;² ASCII plus &lt;strong&gt;Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/LC/list.htm"&gt;LC&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Ll/list.htm"&gt;Ll&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lm/list.htm"&gt;Lm&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lo/list.htm"&gt;Lo&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lt/list.htm"&gt;Lt&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lu/list.htm"&gt;Lu&lt;/a&gt;), &lt;strong&gt;Mark&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Mc/list.htm"&gt;Mc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Me/list.htm"&gt;Me&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Mn/list.htm"&gt;Mn&lt;/a&gt;), &lt;strong&gt;Number&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Nd/list.htm"&gt;Nd&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Nl/list.htm"&gt;Nl&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/No/list.htm"&gt;No&lt;/a&gt;), &lt;strong&gt;Connector_Punctuation&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Pc/list.htm"&gt;Pc&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\s&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\S&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[ \t\r\v\n\f]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;² ASCII plus &lt;strong&gt;Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zl/list.htm"&gt;Zl&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zp/list.htm"&gt;Zp&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;\R&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[\n\v\f\r]&lt;/code&gt;,&lt;code&gt;\r\n&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ASCII plus &lt;code&gt;…&lt;/code&gt;, &lt;strong&gt;Line_Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zl/list.htm"&gt;Zl&lt;/a&gt;), &lt;strong&gt;Paragraph_Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zp/list.htm"&gt;Zp&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Will only match linebreaks with &lt;code&gt;/m&lt;/code&gt; flag&lt;br /&gt;
² You'll need to &lt;a href="https://idiosyncratic-ruby.com/11-regular-extremism.html#turn-on-unicode-matching-for-w-d-s-and-b"&gt;manually turn on unicode matching&lt;/a&gt; for these to work&lt;/p&gt;

&lt;h2 id="posix-and--unicode-property-style"&gt;POSIX and  Unicode Property Style&lt;/h2&gt;

&lt;table class="table-13-13-13-13-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;POSIX&lt;/th&gt;
      &lt;th&gt;Negation&lt;/th&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Negation³&lt;/th&gt;
      &lt;th&gt;ASCII&lt;/th&gt;
      &lt;th&gt;Unicode&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:alnum:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^alnum:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Alnum}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Alnum}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9a-zA-Z]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/LC/list.htm"&gt;LC&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Ll/list.htm"&gt;Ll&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lm/list.htm"&gt;Lm&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lo/list.htm"&gt;Lo&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lt/list.htm"&gt;Lt&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lu/list.htm"&gt;Lu&lt;/a&gt;), &lt;strong&gt;Mark&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Mc/list.htm"&gt;Mc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Me/list.htm"&gt;Me&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Mn/list.htm"&gt;Mn&lt;/a&gt;), &lt;strong&gt;Decimal_Number&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Nd/list.htm"&gt;Nd&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:alpha:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^alpha:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Alpha}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Alpha}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[a-zA-Z]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/LC/list.htm"&gt;LC&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Ll/list.htm"&gt;Ll&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lm/list.htm"&gt;Lm&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lo/list.htm"&gt;Lo&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lt/list.htm"&gt;Lt&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lu/list.htm"&gt;Lu&lt;/a&gt;), &lt;strong&gt;Mark&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Mc/list.htm"&gt;Mc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Me/list.htm"&gt;Me&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Mn/list.htm"&gt;Mn&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:ascii:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^ascii:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{ASCII}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^ASCII}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[\x00-\x7F]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Like ASCII&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:blank:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^blank:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Blank}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Blank}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[ \t]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\t&lt;/code&gt;, &lt;strong&gt;Space_Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:cntrl&lt;/code&gt;]&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^cntrl:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Cntrl}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Cntrl}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[\x00-\x1F]&lt;/code&gt;, &lt;code&gt;\x7F&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Other&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cc/list.htm"&gt;Cc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Cf/list.htm"&gt;Cf&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Cn/list.htm"&gt;Cn&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Co/list.htm"&gt;Co&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Cs/list.htm"&gt;Cs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:digit:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^digit:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Digit}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Digit}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ASCII plus &lt;strong&gt;Decimal_Number&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Nd/list.htm"&gt;Nd&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:graph:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^graph:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Graph}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Graph}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[\x21-\x7E]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ALL, EXCEPT:&lt;/em&gt; &lt;strong&gt;Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zl/list.htm"&gt;Zl&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zp/list.htm"&gt;Zp&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zs&lt;/a&gt;), &lt;strong&gt;Control&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cc/list.htm"&gt;Cc&lt;/a&gt;), &lt;strong&gt;Unassigned&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cn/list.htm"&gt;Cn&lt;/a&gt;), &lt;strong&gt;Surrogate&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cs/list.htm"&gt;Cs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:lower:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^lower:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Lower}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Lower}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[a-z]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Lowercase_Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Ll/list.htm"&gt;Ll&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:print:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^print:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Print}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Print}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[\x20-\x7E]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;ALL, EXCEPT:&lt;/em&gt;  &lt;strong&gt;Line_Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zl&lt;/a&gt;), &lt;strong&gt;Paragraph_Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zp&lt;/a&gt;) , &lt;strong&gt;Control&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cc/list.htm"&gt;Cc&lt;/a&gt;), &lt;strong&gt;Unassigned&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cn/list.htm"&gt;Cn&lt;/a&gt;), &lt;strong&gt;Surrogate&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Cs/list.htm"&gt;Cs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:punct:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^punct:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Punct}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Punct}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[!-/:-@\[-`{-~]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Punctuation&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Pc/list.htm"&gt;Pc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Pd/list.htm"&gt;Pd&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Pe/list.htm"&gt;Pe&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Pf/list.htm"&gt;Pf&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Pi/list.htm"&gt;Pi&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Po/list.htm"&gt;Po&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Ps/list.htm"&gt;Ps&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:space:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^space:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Space}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Space}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[ \t\r\v\n\f]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ASCII plus &lt;strong&gt;Separator&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Zl/list.htm"&gt;Zl&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zp/list.htm"&gt;Zp&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Zs/list.htm"&gt;Zs&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:upper:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^upper:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Upper}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Upper}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[A-Z]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Uppercase_Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Lu/list.htm"&gt;Lu&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:xdigit:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^xdigit:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{XDigit}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^XDigit}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9a-fA-F]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Like ASCII&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;[:word:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[:^word:]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{Word}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;\p{^Word}&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;[0-9a-zA-Z_]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;ASCII plus &lt;strong&gt;Letter&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/LC/list.htm"&gt;LC&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Ll/list.htm"&gt;Ll&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lm/list.htm"&gt;Lm&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lo/list.htm"&gt;Lo&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lt/list.htm"&gt;Lt&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Lu/list.htm"&gt;Lu&lt;/a&gt;), &lt;strong&gt;Mark&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Mc/list.htm"&gt;Mc&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Me/list.htm"&gt;Me&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Mn/list.htm"&gt;Mn&lt;/a&gt;), &lt;strong&gt;Number&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Nd/list.htm"&gt;Nd&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/Nl/list.htm"&gt;Nl&lt;/a&gt; / &lt;a href="http://www.fileformat.info/info/unicode/category/No/list.htm"&gt;No&lt;/a&gt;), &lt;strong&gt;Connector_Punctuation&lt;/strong&gt; (&lt;a href="http://www.fileformat.info/info/unicode/category/Pc/list.htm"&gt;Pc&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;³ An alternative way of negating unicode properties is &lt;code&gt;\P{Property}&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="more-properties"&gt;More Properties&lt;/h3&gt;

&lt;p&gt;The above groups are only the tip of the iceberg. Using the &lt;code&gt;\p{}&lt;/code&gt; syntax, you can match for a lot more unicode properties, see &lt;a href="/41-proper-unicoding.html"&gt;Episode 41: Proper Unicoding&lt;/a&gt; for details!&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/k-takata/Onigmo/blob/master/doc/RE"&gt;Onigmo Documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://unicode.org/reports/tr23/"&gt;Unicode Character Property Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Character+Properties"&gt;RDoc: Regexp (Character Properties)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt"&gt;Unicode Data&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt"&gt;Unicode Property List&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/Public/UCD/latest/ucd/PropertyAliases.txt"&gt;Unicode Property Aliases&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt"&gt;Unicode Property Values Aliases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Limitations of Language</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/29-limitations-of-language.html"/>
    <id>https://idiosyncratic-ruby.com/29-limitations-of-language.html</id>
    <published>2015-05-29T00:00:00Z</published>
    <updated>2015-05-29T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;If you take a closer look, you'll notice that Ruby's grammar has quite a few edge-case where its syntax is inconsistent or ambiguous:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="binary-minus-vs-minus-taken-as-unary-method-argument"&gt;Binary Minus vs Minus taken as Unary Method Argument&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; [1,3,4,5].size - 1
# =&amp;gt; 3

&amp;gt;&amp;gt; [1,3,4,5].size -1
# wrong number of arguments(1 for 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="no-simple-rule-if-a-symbol-can-be-displayed-without-the-explicit--syntax"&gt;No Simple Rule, if a Symbol can be Displayed Without the Explicit &lt;code&gt;:""&lt;/code&gt; Syntax&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; {:&amp;lt; =&amp;gt; 0}
# =&amp;gt; {:&amp;lt;=&amp;gt;0}

&amp;gt;&amp;gt; {:&amp;lt;=&amp;gt;0}
# syntax error, unexpected tINTEGER,
# expecting tASSOC
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="ambiguous-if-to-parse--unary-or-as-part-of-binary-match-operator"&gt;Ambiguous if to Parse &lt;code&gt;~&lt;/code&gt; Unary or as Part of Binary Match Operator&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; $_="Eurucamp X"
&amp;gt;&amp;gt; ~/X/ # =&amp;gt; 9

&amp;gt;&amp;gt; a=~/X/ # undefined local variable or method `a'
&amp;gt;&amp;gt; a= ~/X/ # =&amp;gt; 9
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="global-variables-can-break-string-and-regex-syntax"&gt;Global Variables can "Break" String and Regex Syntax&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; a = "Eurucamp #\n"
&amp;gt;&amp;gt; a.gsub /#$/, ''
# =&amp;gt; ?

&amp;gt;&amp;gt; a = "Eurucamp #\n"
&amp;gt;&amp;gt; a.gsub /#$/, ''
# unterminated regexp meets end of file

&amp;gt;&amp;gt; a = "Eurucamp #\n"
&amp;gt;&amp;gt; a.gsub /#$//, ''
# =&amp;gt; "Eurucamp #"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="unary-or-binary-plus-part-2"&gt;Unary or Binary Plus, Part 2&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; p +21
# =&amp;gt; 21

&amp;gt;&amp;gt; p = 21
&amp;gt;&amp;gt; p +21
# =&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="string-creation-vs-format-method"&gt;String Creation vs Format Method&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; puts%[1]
# undefined method `%' for nil:NilClass

&amp;gt;&amp;gt; puts %[1]
# =&amp;gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="hash-vs-block"&gt;Hash vs Block&lt;/h2&gt;

&lt;p&gt;Ruby uses curly braces for both, blocks as well as hashes. Sometimes, this leads to confusing cases:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; def identity(a) a end

&amp;gt;&amp;gt; identity(1)
#=&amp;gt; 1
&amp;gt;&amp;gt; identity 1
#=&amp;gt; 1
&amp;gt;&amp;gt; identity({})
#=&amp;gt; {}
&amp;gt;&amp;gt; identity {}
#=&amp;gt; wrong number of arguments (0 for 1) (ArgumentError)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="regex-vs-division"&gt;Regex vs Division&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; puts /4/i
# =&amp;gt; (?i-mx:4)

&amp;gt;&amp;gt; puts, i = 42, 2
&amp;gt;&amp;gt; puts /4/i
# =&amp;gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/parse.y"&gt;Ruby's grammar definition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Operating Nothing</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/28-operating-nothing.html"/>
    <id>https://idiosyncratic-ruby.com/28-operating-nothing.html</id>
    <published>2015-05-28T00:00:00Z</published>
    <updated>2015-05-28T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;There is an operator in Ruby, that does nothing: The &lt;a href="https://github.com/ruby/ruby/blob/v2_2_2/numeric.c#L367-L371"&gt;unary plus operator&lt;/a&gt;. It is part of the language for &lt;a href="https://stackoverflow.com/questions/5680587/whats-the-point-of-unary-plus-operator-in-ruby"&gt;keeping symmetry with the unary minus operator&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This is awesome, an operator for free! How can we utilize it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; In Ruby 2.3, the plus operator got its first purpose: &lt;a href="https://bugs.ruby-lang.org/issues/11782"&gt;Create an unfrozen copy of a string&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;string = "frozen string".freeze
string.object_id # =&amp;gt; 19066860
string.frozen? # =&amp;gt; true

copy = +string
copy.object_id # =&amp;gt; 19012140
copy.frozen? # =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="logging"&gt;1 | Logging&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;require 'logger'

# Definition
$logger = Logger.new(STDOUT)

class Object
  def +@
    $logger.warn(self.inspect)
  end
end

# Usage
+/Ruby/
# =&amp;gt; W, [2015-05-28T10:52:51.115334 #16630]  WARN -- : /Ruby/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We could use it for logging. But this is more of the category &lt;em&gt;nice, but feels like there is no real reason for the syntactic sugar&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id="null-objects"&gt;2 | Null Objects&lt;/h2&gt;

&lt;p&gt;A more useful case would be to simplify often done object conversions, for example, converting &lt;a href="http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/"&gt;null objects&lt;/a&gt; to actual &lt;code&gt;nil&lt;/code&gt; for comparisons:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Definition
class Object
  def +@
    null? ? nil : self
  end

  def null?
    false
  end
end

class NilClass
  def null?
    true
  end
end

# Usage
class CustomNullObject
  def null?
    true
  end
end

null = CustomNullObject.new

+nil #=&amp;gt; nil
+null #=&amp;gt; nil
+"Ruby" #=&amp;gt; "Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See &lt;a href="https://github.com/janlelis/null_question"&gt;null_question&lt;/a&gt; and &lt;a href="https://github.com/janlelis/null_plus"&gt;null_plus&lt;/a&gt; for a gemified version of the code above.&lt;/p&gt;

&lt;h2 id="symbol-conversion"&gt;3 | Symbol Conversion&lt;/h2&gt;

&lt;p&gt;Another conversion related use of &lt;code&gt;+@&lt;/code&gt; is the following snippet, which also defines &lt;code&gt;-@&lt;/code&gt;. It will convert &lt;code&gt;String&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; into each other's representation. It can be used as some kind of alternative to libraries that provide &lt;a href="http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html"&gt;HashWithIndifferentAccess&lt;/a&gt;-kind functionality, by always explicitly converting the key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Definition
class String
  def +@
    self
  end

  def -@
    to_sym
  end
end

class Symbol
  def +@
    to_s
  end

  def -@
    self
  end
end

# Usage
hash   = { key: "value" }
symbol = :key
string = "key"

hash[-symbol] # =&amp;gt; "value"
hash[-string] # =&amp;gt; "value"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By the way, this would not be needed, if we &lt;a href="https://speakerdeck.com/sferik/symbols"&gt;make symbols frozen strings&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id="test-rocket"&gt;4 | Test Rocket!&lt;/h2&gt;

&lt;p&gt;Thinking further: How to get most of out operators? How about a testing framework:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'testrocket'

# BASIC USAGE
# +-&amp;gt; { block that should succeed }
# --&amp;gt; { block that should fail }

+-&amp;gt; { Die.new(2) }
--&amp;gt; { raise }
+-&amp;gt; { 2 + 2 == 4 }

# These two tests will deliberately fail
+-&amp;gt; { raise }
--&amp;gt; { true }

# A 'pending' test
~-&amp;gt; { "this is a pending test" }

# A description
!-&amp;gt; { "use this for descriptive output and to separate your test parts" }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See &lt;a href="https://github.com/peterc/testrocket"&gt;peterc/testrocket&lt;/a&gt; for further info!&lt;/p&gt;

&lt;h2 id="superators"&gt;5 | Superators!&lt;/h2&gt;

&lt;p&gt;There was a library that carried operator magic to the extremes: It let you define &lt;em&gt;superators&lt;/em&gt;, which are new binary operators that use a chain of unary operators as their name! This is what it looked like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Definition
class Array
  superator "&amp;lt;---" do |operand|
    if operand.kind_of? Array
      self + operand.map { |x| x.inspect }
    else
      operand.inspect
    end
  end
end

# Usage
[1,2,3] &amp;lt;--- [4,5,6]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The library is not maintained, anymore, but it is the craziest leveraging of Ruby's capabilities I've ever seen! The repo is at &lt;a href="https://github.com/jicksta/superators"&gt;jicksta/superators&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Golfing Basics</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/27-golfing-basics.html"/>
    <id>https://idiosyncratic-ruby.com/27-golfing-basics.html</id>
    <published>2015-05-27T00:00:00Z</published>
    <updated>2015-05-27T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;Code Golf&lt;/strong&gt; is the art of writing the shortest program possible. The less bytes the better. And the competition is just ridiculously strong! Head over to &lt;a href="https://golf.shinh.org/"&gt;Anarchy Golf&lt;/a&gt; if you want to see more!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A good beginner's problem is printing out &lt;a href="https://golf.shinh.org/p.rb?pascal+triangle"&gt;Pascal's Triangle&lt;/a&gt;: Spend a few days to get to &lt;strong&gt;45&lt;/strong&gt; bytes. Spend a few &lt;em&gt;months&lt;/em&gt; to get to &lt;strong&gt;43&lt;/strong&gt; bytes!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attention:&lt;/strong&gt; A new golf course has opened at &lt;a href="https://code.golf"&gt;code.golf&lt;/a&gt;. Why not give it a try 😉?&lt;/p&gt;

&lt;h2 id="ruby-tricks-youll-learn-by-playing-code-golf"&gt;10 Ruby Tricks You'll Learn by Playing Code Golf&lt;/h2&gt;

&lt;p&gt;While code golfing does not necessarily make you a better programmer, you can learn a lot about the programming language you are using. Here are some things that were new to me:&lt;/p&gt;

&lt;h2 id="dirty-interpolation"&gt;Dirty Interpolation&lt;/h2&gt;

&lt;p&gt;String interpolation (&lt;code&gt;#{}&lt;/code&gt;) is sometimes possible without using curlies:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"You can directly interpolate #@instance variables, " \
"#@@class variables, and #$global variables!"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I must admit, this can confuse newcomers, but it looks fantastic!&lt;/p&gt;

&lt;h2 id="constant-assignment-in-modifiers"&gt;Constant Assignment in Modifiers&lt;/h2&gt;

&lt;p&gt;It is perfectly legit to use assignments in conditions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if a = 42
  p a
end
# =&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, this won't work with the shorter &lt;em&gt;modifier&lt;/em&gt; syntax:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p b if b = 42
# NameError: undefined local variable or method `b'...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unless… you use constants:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p C if C = 42
# =&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="shebang-require"&gt;Shebang &lt;code&gt;require&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;What could possibly be shorter than:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require'json'; require 'yaml'
p JSON,YAML
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It's inlined command-line options:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!ruby -rjson -ryaml
p JSON,YAML
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="iterating-input-lines"&gt;Iterating Input Lines&lt;/h2&gt;

&lt;p&gt;Finding the shortest way to read user input is a common problem for golfers and solutions vary, depending on how to process the input. My favorite one is to iterate over the input's lines:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;lt;.each{|e|p e}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="appending-output"&gt;Appending Output&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;puts&lt;/code&gt; and &lt;code&gt;p&lt;/code&gt; are already good candidates to output content. However, sometimes, using &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; on &lt;code&gt;STDOUT&lt;/code&gt; is a tiny bit (or byte) more efficient:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;?a.upto(?z){|o|$&amp;gt;&amp;lt;&amp;lt;o}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="regex-always-wins"&gt;Regex Always Wins&lt;/h2&gt;

&lt;p&gt;This is one of the golden rules of golfing. Especially, combining the &lt;a href="https://ruby-doc.org/core/String.html#method-i-gsub"&gt;block syntax of &lt;code&gt;gsub&lt;/code&gt;&lt;/a&gt; with the &lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;perlish regex variables&lt;/a&gt; can be very expressive!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"some_string".gsub(/(^|_)(\w)/){$2.upcase}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="stringtr"&gt;&lt;code&gt;String#tr&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;However, it's not true - regexes do not always win. If you need to perform some simple character substitutions, &lt;a href="https://en.wikipedia.org/wiki/Tr_%28Unix%29"&gt;tr&lt;/a&gt; is an extremely short (and also clean) way to do so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# ROT13 Cipher
"Vqvbflapengvp Ehol".tr'a-zA-Z','n-za-mN-ZA-M'
# =&amp;gt; "Idiosyncratic Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="one-more-or-less"&gt;One More or Less&lt;/h2&gt;

&lt;p&gt;In some instances, you cannot use &lt;code&gt;i+1&lt;/code&gt; or &lt;code&gt;i-1&lt;/code&gt; without wrapping them in parenthesis. No problem, &lt;a href="https://ruby-doc.org/core/Fixnum.html#method-i-7E"&gt;unary complement&lt;/a&gt; to the rescue:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-~42 # =&amp;gt; 43
~-42 # =&amp;gt; 41
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="flexible-precedence"&gt;Flexible Precedence&lt;/h2&gt;

&lt;p&gt;This is one of my favorites: Explicitly call (&lt;code&gt;.&lt;/code&gt;) operators for alternative precedence semantics:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;3*(2+1) #=&amp;gt; 9
3.*2+1 #=&amp;gt; 9
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="quick-quit"&gt;Quick Quit&lt;/h2&gt;

&lt;p&gt;What's a shorter way to quit a Ruby script than the 4 bytes long &lt;code&gt;exit&lt;/code&gt; method?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1/0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Although this is longer than &lt;code&gt;z&lt;/code&gt; (calling an undefined method), it's often easier to trigger programmatically.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>File Encoding Magic</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/26-file-encoding-magic.html"/>
    <id>https://idiosyncratic-ruby.com/26-file-encoding-magic.html</id>
    <published>2015-05-26T00:00:00Z</published>
    <updated>2015-05-26T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby has &lt;a href="http://graysoftinc.com/character-encodings/ruby-19s-three-default-encodings"&gt;three default encodings&lt;/a&gt;. One of them is the default &lt;a href="https://ruby-doc.org/core/Encoding.html#class-Encoding-label-Script+encoding"&gt;source encoding&lt;/a&gt;, which can be set using a &lt;strong&gt;magic comment&lt;/strong&gt; in the file's first line, or in the second line if the first line is taken by a &lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;shebang&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Default source encoding (UTF-8):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p "".encoding #=&amp;gt; #&amp;lt;Encoding:UTF-8&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With encoding comment (&lt;code&gt;file_with_magic_comment.rb&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# coding: cp1252
p "".encoding #=&amp;gt; #&amp;lt;Encoding:Windows-1252&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See &lt;a href="/58-magic-instructions.html"&gt;Magic Instructions&lt;/a&gt; for more information about magic comments in general.&lt;/p&gt;

&lt;h2 id="respecting-the-encoding-comment-when-reading-a-file"&gt;Respecting the Encoding Comment when Reading a File&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;REMOVED IN RUBY 3.3!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might come across a situation, where you want to read in a source file using Ruby's &lt;a href="https://ruby-doc.org/core/File.html"&gt;File&lt;/a&gt; class, but also want to set the proper encoding from the magic comment. Fortunately, Ruby's standard library supports this. Unfortunately, it is not a stand-alone module, but a part of IRB:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; require 'irb/magic-file'
# =&amp;gt; false
&amp;gt;&amp;gt; IRB::MagicFile
# =&amp;gt; #&amp;lt;Object:0x00000001a6bb10&amp;gt;
&amp;gt;&amp;gt; File.open('file_with_magic_comment.rb').read.encoding
# =&amp;gt; #&amp;lt;Encoding:UTF-8&amp;gt;
&amp;gt;&amp;gt; IRB::MagicFile.open('file_with_magic_comment.rb').read.encoding
# =&amp;gt; #&amp;lt;Encoding:Windows-1252&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/irb/magic-file.rb"&gt;Source: irb/magic-file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Meta Methodology</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/25-meta-methodology.html"/>
    <id>https://idiosyncratic-ruby.com/25-meta-methodology.html</id>
    <published>2015-05-25T00:00:00Z</published>
    <updated>2015-05-25T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby &lt;strong&gt;clutters&lt;/strong&gt; its objects a lot with methods for metaprogramming other methods:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Class.instance_methods.grep /method/
=&amp;gt; [:instance_methods, :public_instance_methods,
:protected_instance_methods, :private_instance_methods,
:method_defined?, :public_method_defined?,
:private_method_defined?, :protected_method_defined?,
:public_class_method, :private_class_method, :instance_method,
:public_instance_method, :methods, :singleton_methods,
:protected_methods, :private_methods, :public_methods,
:method, :public_method, :singleton_method,
:define_singleton_method]

Class.private_instance_methods.grep /method/
=&amp;gt; [:method_added, :method_removed, :method_undefined,
:remove_method, :undef_method, :alias_method, :define_method,
:instance_methods_for, :__method__, :singleton_method_added,
:singleton_method_removed, :singleton_method_undefined,
:method_missing]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It's so many methods, because working with methods is a multi-dimensional problem:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Where are the modules, in the current instance or if a class/module, in its instances?&lt;/li&gt;
  &lt;li&gt;Or in its &lt;a href="https://www.devalot.com/articles/2008/09/ruby-singleton"&gt;singleton class&lt;/a&gt;?&lt;/li&gt;
  &lt;li&gt;What about the method visibility?&lt;/li&gt;
  &lt;li&gt;Should the inheritance chain be considered?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's put everything in some order:&lt;/p&gt;

&lt;h2 id="method-lists"&gt;Method Lists&lt;/h2&gt;

&lt;p&gt;Methods returning method lists always take a boolean argument, which will prevent inheritance if set to &lt;code&gt;false&lt;/code&gt;¹&lt;/p&gt;

&lt;table class="table-38-15-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
      &lt;th&gt;Visibility&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-singleton_methods"&gt;Object#singleton_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
      &lt;td&gt;public + protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-methods"&gt;Object#methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;public + protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-public_methods"&gt;Object#public_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-protected_methods"&gt;Object#protected_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-private_methods"&gt;Object#private_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;private&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-instance_methods"&gt;Module#instance_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;public + protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-public_instance_methods"&gt;Module#public_instance_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-protected_instance_methods"&gt;Module#protected_instance_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-private_instance_methods"&gt;Module#private_instance_methods&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;private&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;There is no API for getting a list of private singleton methods&lt;/li&gt;
  &lt;li&gt;¹ A special case is the &lt;code&gt;methods&lt;/code&gt; method: If &lt;code&gt;false&lt;/code&gt; is given as argument, it will switch target to &lt;em&gt;singleton&lt;/em&gt; only&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="method-defined-checks"&gt;Method Defined? Checks&lt;/h2&gt;

&lt;p&gt;Instead of listing all methods and checking if the resulting array contains a specific method, you can also directly check if a method is defined.&lt;/p&gt;

&lt;p&gt;Since Ruby 2.6, you can also pass in a boolean as second argument which will ignore the inheritance chain (similar like it is with the method listings above).&lt;/p&gt;

&lt;table class="table-38-15-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
      &lt;th&gt;Visibility&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-method_defined-3F"&gt;Module#method_defined?&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;all&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-public_method_defined-3F"&gt;Module#public_method_defined?&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-protected_method_defined-3F"&gt;Module#protected_method_defined?&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;protected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-private_method_defined-3F"&gt;Module#private_method_defined?&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;private&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;This is also the best way to get the visibility of a method&lt;/li&gt;
  &lt;li&gt;There is no direct way to check for singleton methods&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="method-getters"&gt;Method Getters&lt;/h2&gt;

&lt;p&gt;These methods will return method objects for further metaprogramming action:&lt;/p&gt;

&lt;table class="table-34-15-20-14-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
      &lt;th&gt;Visibility&lt;/th&gt;
      &lt;th&gt;Returns&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-singleton_method"&gt;Object#singleton_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
      &lt;td&gt;all&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Method.html"&gt;Method&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-method"&gt;Object#method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;all&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Method.html"&gt;Method&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-public_method"&gt;Object#public_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;self + singleton&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Method.html"&gt;Method&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-instance_method"&gt;Module#instance_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;all&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/UnboundMethod.html"&gt;UnboundMethod&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-public_instance_method"&gt;Module#public_instance_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/UnboundMethod.html"&gt;UnboundMethod&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;There are no methods to explicitly get private methods&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="method-manipulation"&gt;Method Manipulation&lt;/h2&gt;

&lt;p&gt;These methods will actually modify your objects:&lt;/p&gt;

&lt;table class="table-38-15-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
      &lt;th&gt;Visibility&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Object.html#method-i-define_singleton_method"&gt;Object#define_singleton_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
      &lt;td&gt;public&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-define_method"&gt;Module#define_method&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;public (see notes)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-remove_method"&gt;Module#remove_method&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-undef_method"&gt;Module#undef_method&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-alias_method"&gt;Module#alias_method&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
      &lt;td&gt;same&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;No direct way to define a non-public method, but &lt;code&gt;define_method&lt;/code&gt; respects visibility modifiers&lt;/li&gt;
  &lt;li&gt;No direct way to define a non-public singleton method&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;remove_method&lt;/code&gt; only deletes the method from the current module, while &lt;code&gt;undef_method&lt;/code&gt; also deletes it from all ancestors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="method-hooks"&gt;Method Hooks&lt;/h2&gt;

&lt;p&gt;Hook methods can be defined and will be called by the Ruby interpreter when the respective event happens:&lt;/p&gt;

&lt;table class="table-38-15-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_added"&gt;BasicObject#singleton_method_added&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_undefined"&gt;BasicObject#singleton_method_undefined&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_removed"&gt;BasicObject#singleton_method_removed&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-method_added"&gt;Module#method_added&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-method_undefined"&gt;Module#method_undefined&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-method_removed"&gt;Module#method_removed&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/BasicObject.html#method-i-method_missing"&gt;BasicObject#method_missing&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;instances&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;As long as you haven't defined a hook, Ruby considers it as an empty private method&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="method-visibility-modifiers"&gt;Method Visibility Modifiers&lt;/h2&gt;

&lt;p&gt;Besides &lt;code&gt;public&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt;, and &lt;code&gt;private&lt;/code&gt;, there are two additional methods with the sole purpose of changing a method's visibility:&lt;/p&gt;

&lt;table class="table-34-12-12-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-public_class_method"&gt;Module#public_class_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
      &lt;td&gt;Makes a class's singleton method public&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Module.html#method-i-private_class_method"&gt;Module#private_class_method&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;class&lt;/td&gt;
      &lt;td&gt;singleton&lt;/td&gt;
      &lt;td&gt;Makes a class's singleton method private&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="current-method-name"&gt;Current Method Name&lt;/h2&gt;

&lt;p&gt;There are two underscore-wrapped methods that return the current method's name:&lt;/p&gt;

&lt;table class="table-35-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;From&lt;/th&gt;
      &lt;th&gt;Returns&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-__method__"&gt;Kernel#__method__&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;Original method name&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-__callee__"&gt;Kernel#__callee__&lt;/a&gt; (private)&lt;/td&gt;
      &lt;td&gt;any&lt;/td&gt;
      &lt;td&gt;Aliased method name&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;Also see &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-caller"&gt;Kernel#caller&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-caller_locations"&gt;Kernel#caller_locations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="a-better-api-for-metaprogramming-methods"&gt;A Better API for Metaprogramming Methods?&lt;/h2&gt;

&lt;p&gt;Metaprogramming in Ruby has evolved over time, but it might be a good idea to clean it up a little - A good example of how to clean up one of Ruby's other metaprogramming APIs is the &lt;a href="https://github.com/rubyworks/instance/"&gt;instance gem&lt;/a&gt;. It gives you a neat API for working with an object's state, like setting instance variables. Someone feels like building a similar gem for Ruby's Method APIs? &lt;strong&gt;2019 Update:&lt;/strong&gt; I gave it a try! You can see the results here: &lt;a href="https://github.com/janlelis/object_shadow"&gt;object_shadow&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Goto Fail</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/24-goto-fail.html"/>
    <id>https://idiosyncratic-ruby.com/24-goto-fail.html</id>
    <published>2015-05-24T00:00:00Z</published>
    <updated>2015-05-24T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;If you change one line in Ruby's source, it will support &lt;strong&gt;goto&lt;/strong&gt; statements!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You can install a patched version via &lt;strong&gt;RVM&lt;/strong&gt;'s patch feature:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rvm install 2.2.2 -n goto --patch http://git.io/vfxF2
$ rvm use 2.2.2-goto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What to do to play around with this new feature? Let's reimplement &lt;a href="https://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto-fail-apples-ssl-bug-explained-plus-an-unofficial-patch/"&gt;this famous bug&lt;/a&gt; in Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# prepare some dummy data
hashCtx = hashOut = clientRandom = serverRandom = signedRandom = Object.new
SSLHashSHA1 = Class.new do def update(*) end; alias final update end.new

# how the goto fail bug would look like if it was implemented in ruby
__goto__(:fail) if ((err = SSLHashSHA1.update(hashCtx, clientRandom)) != 0);
__goto__(:fail) if ((err = SSLHashSHA1.update(hashCtx, serverRandom)) != 0);
__goto__(:fail) if ((err = SSLHashSHA1.update(hashCtx, signedParams)) != 0);
__goto__(:fail);
__goto__(:fail) if ((err = SSLHashSHA1.final(hashCtx, hashOut)) != 0);

puts "Verified" # never reached
# ...

__label__(:fail);
puts "Failed";
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Executing this with gotoruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rvm use 2.2.2-goto
$ ruby gotofail.rb
Failed
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://patshaughnessy.net/2012/2/29/the-joke-is-on-us-how-ruby-1-9-supports-the-goto-statement"&gt;Article: The Joke Is On Us: How Ruby 1.9 Supports the Goto Statement&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ruby's other goto: &lt;a href="http://gnuu.org/2009/03/21/demystifying-continuations-in-ruby/"&gt;Article: Demystifying Continuations in Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby Lookalikes</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/23-ruby-lookalikes.html"/>
    <id>https://idiosyncratic-ruby.com/23-ruby-lookalikes.html</id>
    <published>2015-05-23T00:00:00Z</published>
    <updated>2015-05-23T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Tired of good old, but slow Ruby? Try one of Ruby's successors:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Compiles To&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://crystal-lang.org"&gt;Crystal&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Machine&lt;/td&gt;
      &lt;td&gt;Fast Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://www.mirah.org"&gt;Mirah&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;JVM&lt;/td&gt;
      &lt;td&gt;Fast Ruby in Java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://opalrb.org"&gt;Opal&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;JS&lt;/td&gt;
      &lt;td&gt;Ruby for JavaScript&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;JS&lt;/td&gt;
      &lt;td&gt;JavaScript for Rubyists&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://elixir-lang.org/"&gt;Elixir&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;BEAM&lt;/td&gt;
      &lt;td&gt;Ruby for Erlang&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;JVM&lt;/td&gt;
      &lt;td&gt;Multi-Paradigm Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/rooby-lang/rooby/"&gt;Rooby&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Machine&lt;/td&gt;
      &lt;td&gt;Simple Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/SciRuby/rubex/"&gt;Rubex&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Machine&lt;/td&gt;
      &lt;td&gt;Ruby Extensions Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/goby-lang/goby"&gt;Goby&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Machine&lt;/td&gt;
      &lt;td&gt;Go meets Ruby&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;All of them are better than Ruby, in some way!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Literate Ruby</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/22-literate-ruby.html"/>
    <id>https://idiosyncratic-ruby.com/22-literate-ruby.html</id>
    <published>2015-05-22T00:00:00Z</published>
    <updated>2015-05-22T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby has a built-in feature that is much like &lt;a href="https://coffeescript.org/#literate"&gt;Literate CoffeeScript&lt;/a&gt;. In contrast to it, this Ruby option will not ignore literature, but garbage:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="xdirectory"&gt;&lt;code&gt;-x[directory]&lt;/code&gt;&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;Tells Ruby that the script is embedded in a message.
Leading garbage will be discarded until the  first line
that starts with “#!” and contains the string, “ruby”.
Any meaningful switches on that line will be applied.
The end of the script must be specified with either EOF,
^D (control-D), ^Z (control-Z), or the reserved word
__END__.  If the directory name is specified, Ruby will
switch to that directory before executing script.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Awesome!&lt;/p&gt;

&lt;pre&gt;
#! Let's see this in action, using this blog post about ruby
puts "Idiosyncratic Ruby"
__END__
&lt;/pre&gt;
&lt;p&gt;Paste the whole content of this article into a file and execute it with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -x FILENAME
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;man ruby&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Uniform Resource Matching</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/21-uniform-resource-matching.html"/>
    <id>https://idiosyncratic-ruby.com/21-uniform-resource-matching.html</id>
    <published>2015-05-21T00:00:00Z</published>
    <updated>2015-05-21T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's &lt;a href="https://ruby-doc.org/stdlib/libdoc/uri/rdoc/URI.html"&gt;URI standard library&lt;/a&gt; contains a very sophisticated regex for matching URLs:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"At https://idiosyncratic-ruby.com you can learn about the " \
"obscure parts of Ruby"[URI.regexp]
# =&amp;gt; "https://idiosyncratic-ruby.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This regex is built in &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/uri/rfc2396_parser.rb"&gt;uri/rfc2396_parser.rb&lt;/a&gt; and looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ ruby -r uri -e 'p URI.regexp'
/
        ([a-zA-Z][\-+.a-zA-Z\d]*):                           (?# 1: scheme)
        (?:
           ((?:[\-_.!~*'()a-zA-Z\d;?:@&amp;amp;=+$,]|%[a-fA-F\d]{2})(?:[\-_.!~*'()a-zA-Z\d;\/?:@&amp;amp;=+$,\[\]]|%[a-fA-F\d]{2})*)                    (?# 2: opaque)
        |
           (?:(?:
             \/\/(?:
                 (?:(?:((?:[\-_.!~*'()a-zA-Z\d;:&amp;amp;=+$,]|%[a-fA-F\d]{2})*)@)?        (?# 3: userinfo)
                   (?:((?:(?:[a-zA-Z0-9\-.]|%\h\h)+|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:(?:[a-fA-F\d]{1,4}:)*[a-fA-F\d]{1,4})?::(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))?)\]))(?::(\d*))?))? (?# 4: host, 5: port)
               |
                 ((?:[\-_.!~*'()a-zA-Z\d$,;:@&amp;amp;=+]|%[a-fA-F\d]{2})+)                 (?# 6: registry)
               )
             |
             (?!\/\/))                           (?# XXX: '\/\/' is the mark for hostport)
             (\/(?:[\-_.!~*'()a-zA-Z\d:@&amp;amp;=+$,]|%[a-fA-F\d]{2})*(?:;(?:[\-_.!~*'()a-zA-Z\d:@&amp;amp;=+$,]|%[a-fA-F\d]{2})*)*(?:\/(?:[\-_.!~*'()a-zA-Z\d:@&amp;amp;=+$,]|%[a-fA-F\d]{2})*(?:;(?:[\-_.!~*'()a-zA-Z\d:@&amp;amp;=+$,]|%[a-fA-F\d]{2})*)*)*)?                    (?# 7: path)
           )(?:\?((?:[\-_.!~*'()a-zA-Z\d;\/?:@&amp;amp;=+$,\[\]]|%[a-fA-F\d]{2})*))?                 (?# 8: query)
        )
        (?:\#((?:[\-_.!~*'()a-zA-Z\d;\/?:@&amp;amp;=+$,\[\]]|%[a-fA-F\d]{2})*))?                  (?# 9: fragment)
      /x
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.regular-expressions.info/email.html"&gt;Simpler regex to match a lot of URIs (you should increase the maximum length of TLDs, though)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.ietf.org/rfc/rfc2396.txt"&gt;RFC 2396&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://tools.ietf.org/rfc/rfc3986.txt"&gt;RFC 3986&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Better Standards</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/20-better-standards.html"/>
    <id>https://idiosyncratic-ruby.com/20-better-standards.html</id>
    <published>2015-05-20T00:00:00Z</published>
    <updated>2015-05-20T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;A guide to Ruby's stdlib and available alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please note:&lt;/strong&gt; The standard library was turned into gems, see &lt;a href="https://stdgems.org"&gt;stdgems.org&lt;/a&gt; for up-to-date information on all standard gems!&lt;/p&gt;

&lt;h2 id="standard-library-overview"&gt;Standard Library Overview&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;

&lt;table class="table-20-10-50-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Library&lt;/th&gt;
      &lt;th&gt;Sources&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Alternatives&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/abbrev/rdoc/Abbrev.html"&gt;abbrev&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/abbrev.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Small library that finds the shortest abbreviation to identify one string amongst many&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/base64/rdoc/Base64.html"&gt;base64&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/base64.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Encodes and decodes strings to a &lt;a href="https://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt; representation. Implemented as a small wrapper around &lt;a href="https://idiosyncratic-ruby.com/4-what-the-pack.html"&gt;String#unpack&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Continuation.html"&gt;continuation&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/continuation"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Deprecated library that adds the &lt;a href="https://idiosyncratic-ruby.com/24-goto-fail.html"&gt;goto&lt;/a&gt;-like &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-callcc"&gt;Kernel#callcc&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby-concurrency/concurrent-ruby"&gt;Concurrent Ruby&lt;/a&gt;, &lt;a href="https://ruby-doc.org/core/Fiber.html"&gt;Fiber&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/coverage/rdoc/Coverage.html"&gt;coverage&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/coverage"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Measures &lt;a href="https://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/debug/rdoc/DEBUGGER__.html"&gt;debug&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/debug.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Command-line &lt;a href="https://en.wikipedia.org/wiki/Debugger"&gt;debugger&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/deivid-rodriguez/byebug"&gt;byebug&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/digest/rdoc/Digest.html"&gt;digest&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/digest"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Provides common &lt;a href="https://en.wikipedia.org/wiki/Hash_function"&gt;hash functions&lt;/a&gt; like MD5, SHA1, SHA2, or RIPEMD-160&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/openssl/rdoc/OpenSSL/Digest.html"&gt;OpenSSL::Digest&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/drb/rdoc/index.html"&gt;drb&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/drb.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Distributed object system for Ruby&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/English/rdoc/English.html"&gt;English&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/English.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;Readable aliases for special global variables&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/erb/rdoc/index.html"&gt;erb&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/erb.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Templating engine for Ruby&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://www.kuwata-lab.com/erubis/"&gt;erubis&lt;/a&gt;, &lt;a href="https://github.com/apotonick/erbse"&gt;erbse&lt;/a&gt;, &lt;a href="https://github.com/jeremyevans/erubi"&gt;erubi&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/expect/rdoc/IO.html"&gt;expect&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/ext/pty/lib/expect.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds &lt;a href="https://ruby-doc.org/stdlib/libdoc/expect/rdoc/IO.html#method-i-expect"&gt;IO#expect&lt;/a&gt;, which can be used to wait for a specific pattern to be read&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Fiber.html"&gt;fiber&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/fiber"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds &lt;a href="https://ruby-doc.org/core/Fiber.html#method-i-transfer"&gt;Fiber#transfer&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/Fiber.html#method-i-alive-3F"&gt;Fiber#alive?&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/find/rdoc/Find.html"&gt;find&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/find.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Finds all files in a given directory and its sub-directories&lt;/td&gt;
      &lt;td&gt;&lt;code style="white-space: nowrap"&gt;`find .`.split($/)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/io/nonblock/rdoc/IO.html"&gt;io/nonblock&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/io/nonblock"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Allows to work with &lt;code&gt;IO&lt;/code&gt; streams in a non-blocking way&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/IO.html"&gt;io/wait&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/io/wait"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds methods to wait until an &lt;code&gt;IO&lt;/code&gt; stream becomes readable or writable&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/mkmf/rdoc/MakeMakefile.html"&gt;mkmf&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/mkmf.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Generates &lt;a href="https://en.wikipedia.org/wiki/Makefile"&gt;Makefiles&lt;/a&gt; for native &lt;a href="https://github.com/ruby/ruby/blob/trunk/doc/extension.rdoc"&gt;C extensions&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/monitor/rdoc/Monitor.html"&gt;monitor&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/monitor.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Monitor_%28synchronization%29"&gt;Monitors&lt;/a&gt; for multi-threaded code&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/net/ftp/rdoc/Net/FTP.html"&gt;net/ftp&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/net/ftp.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for FTP (&lt;a href="https://en.wikipedia.org/wiki/File_Transfer_Protocol"&gt;File Transfer Protocol&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html"&gt;net/http&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/net/http.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for HTTP (&lt;a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol"&gt;Hypertext Transfer Protocol&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/httprb/http.rb/"&gt;http.rb&lt;/a&gt;, &lt;a href="https://github.com/igrigorik/em-http-request"&gt;em-http-request&lt;/a&gt;, &lt;a href="https://github.com/excon/excon"&gt;excon&lt;/a&gt;, &lt;a href="https://github.com/nahi/httpclient"&gt;httpclient&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/net/imap/rdoc/Net/IMAP.html"&gt;net/imap&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/net/imap.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for IMAP (&lt;a href="https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol"&gt;Internet Message Access Protocol&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ConradIrwin/em-imap"&gt;em-imap&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/nkf/rdoc/NKF.html"&gt;nkf&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/nkf"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Kanji"&gt;Kanji&lt;/a&gt; encoding converter&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/objspace/rdoc/ObjectSpace.html"&gt;objspace&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/objspace"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds more statistics methods to &lt;code&gt;ObjectSpace&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/open-uri/rdoc/OpenURI.html"&gt;open-uri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/open-uri.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Monkeypatches &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-open"&gt;Kernel#open&lt;/a&gt; to support remote endpoints via &lt;code&gt;net/http&lt;/code&gt; and &lt;code&gt;net/ftp&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/optparse/rdoc/OptParse.html"&gt;optparse&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/optparse.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Command-line option parser&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/leejarvis/slop"&gt;slop&lt;/a&gt;, &lt;a href="https://github.com/ManageIQ/optimist"&gt;optimist&lt;/a&gt;, &lt;a href="https://github.com/soveran/clap"&gt;clap&lt;/a&gt;, &lt;a href="https://github.com/janlelis/rationalist"&gt;rationalist&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/pathname/rdoc/Pathname.html"&gt;pathname&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/pathname"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Wraps &lt;code&gt;File&lt;/code&gt;, &lt;code&gt;FileTest&lt;/code&gt;, &lt;code&gt;Dir&lt;/code&gt;, and &lt;code&gt;FileUtils&lt;/code&gt; to ease working with file system paths&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/eregon/path"&gt;path&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/prettyprint/rdoc/PrettyPrint.html"&gt;prettyprint&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/prettyprint.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Better object formatting and inspection. Comes with the &lt;code&gt;pp&lt;/code&gt; print debugging helper via &lt;code&gt;require 'pp'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/janlelis/wirb"&gt;wirb&lt;/a&gt;, &lt;a href="https://github.com/cldwalker/hirb"&gt;hirb&lt;/a&gt;, &lt;a href="https://github.com/michaeldv/awesome_print/"&gt;awesome_print&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/profiler/rdoc/Profiler__.html"&gt;profiler&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/profiler.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Measures which methods are called and how long each method takes to complete. Auto-start via &lt;code&gt;require 'profile'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby-prof/ruby-prof"&gt;ruby-prof&lt;/a&gt;, &lt;a href="https://github.com/tmm1/perftools.rb"&gt;perftools.rb&lt;/a&gt;, &lt;a href="https://github.com/change/method_profiler"&gt;method_profiler&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/pty/rdoc/PTY.html"&gt;pty&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/pty"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Manages &lt;a href="https://en.wikipedia.org/wiki/Pseudo_terminal"&gt;pseudo terminals&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/racc/parser/rdoc/Racc.html"&gt;racc&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/racc"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/tenderlove/racc"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A &lt;a href="https://en.wikipedia.org/wiki/Yacc"&gt;YACC&lt;/a&gt;-like &lt;a href="https://en.wikipedia.org/wiki/LALR_parser_generator"&gt;LALR(1) parser generator&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/kschiess/parslet/"&gt;parslet&lt;/a&gt;, &lt;a href="https://github.com/mjackson/citrus"&gt;citrus&lt;/a&gt;, &lt;a href="https://github.com/nathansobo/treetop"&gt;treetop&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="/42-ruby-config.html"&gt;rbconfig&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;RbConfig&lt;/code&gt; is a Ruby constant that contains compile time information&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/resolv/rdoc/Resolv.html"&gt;resolv&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/resolv.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Thread-aware &lt;a href="https://en.wikipedia.org/wiki/Domain_Name_System"&gt;DNS&lt;/a&gt; resolver. Will replace &lt;a href="https://ruby-doc.org/stdlib/libdoc/socket/rdoc/Socket.html"&gt;Socket&lt;/a&gt;'s DNS via &lt;code&gt;require 'resolve-replace'&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ioquatix/rubydns"&gt;rubydns&lt;/a&gt;, &lt;a href="https://github.com/bluemonk/net-dns"&gt;net-dns&lt;/a&gt;, &lt;a href="https://github.com/mperham/em-resolv-replace"&gt;em-resolve-replace&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/rinda/rdoc/Rinda.html"&gt;rinda&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/rinda.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support fot the &lt;a href="https://en.wikipedia.org/wiki/Linda_%28coordination_language%29"&gt;Linda distributed computing paradigm&lt;/a&gt; in &lt;a href=""&gt;drb&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/ripper/rdoc/Ripper.html"&gt;ripper&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/ripper"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Ruby parser that creates a &lt;a href="https://en.wikipedia.org/wiki/S-expression"&gt;symbolic expression tree&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/seattlerb/ruby_parser"&gt;ruby_parser&lt;/a&gt;, &lt;a href="https://github.com/whitequark/parser"&gt;parser&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/securerandom/rdoc/SecureRandom.html"&gt;securerandom&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/securerandom.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Provides crpytographical randomness from openssl or the OS&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/set/rdoc/Set.html"&gt;set&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/set.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Data structure for unordered collections without duplicates. Implemented on top of Hash. Also comes with &lt;a href="https://ruby-doc.org/stdlib/libdoc/set/rdoc/SortedSet.html"&gt;SortedSet&lt;/a&gt; for ordered collections.&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/shellwords/rdoc/Shellwords.html"&gt;shellwords&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/shellwords.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Escape and manipulate commands to be run in the &lt;a href="https://en.wikipedia.org/wiki/Bourne_shell"&gt;shell&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/socket/rdoc/Socket.html"&gt;socket&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/socket"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="https://en.wikipedia.org/wiki/Unix_domain_socket"&gt;unix-&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Network_socket"&gt;network sockets&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/syslog/rdoc/Syslog.html"&gt;syslog&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/syslog"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Interface to the low-level &lt;a href="https://en.wikipedia.org/wiki/Syslog"&gt;syslog&lt;/a&gt; logger&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/crohr/syslogger"&gt;syslogger&lt;/a&gt;, &lt;a href="https://github.com/colbygk/log4r"&gt;log4r&lt;/a&gt;, &lt;a href="https://github.com/bdurand/lumberjack_syslog_device"&gt;lumberjack_syslog_device&lt;/a&gt;, &lt;a href="https://github.com/rudionrails/yell/wiki/additional-adapters-syslog"&gt;yell-adapters-syslog&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/tempfile/rdoc/Tempfile.html"&gt;tempfile&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/tempfile.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Simplifies OS independent creation of temporary files&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/time/rdoc/Time.html"&gt;time&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/time.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds more methods to &lt;code&gt;Time&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/tmpdir/rdoc/Dir.html#method-c-mktmpdir"&gt;tmpdir&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/tmpdir.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds a &lt;code&gt;Dir.mktmpdir&lt;/code&gt; method for creating temporary directories OS independently&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/tsort/rdoc/TSort.html"&gt;tsort&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/tsort.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Typological sorting using &lt;a href="https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm"&gt;Tarjan’s algorithm&lt;/a&gt;, which finds &lt;a href="https://en.wikipedia.org/wiki/Strongly_connected_component"&gt;strongly connected components&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/Graph_%28abstract_data_type%29"&gt;graphs&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/un/rdoc/index.html"&gt;un&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/un.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/6-run-ruby-run.html"&gt;Utilities to replace common UNIX commands&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/unicode_normalize/rdoc/UnicodeNormalize.html"&gt;unicode_normalize&lt;/a&gt;&lt;br /&gt;(auto-require)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/unicode_normalize.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Adds a &lt;a href="https://ruby-doc.org/stdlib/libdoc/unicode_normalize/rdoc/String.html#method-i-unicode_normalize"&gt;String#unicode_normalize&lt;/a&gt; method which &lt;a href="https://unicode.org/reports/tr15/"&gt;normalizes unicode strings&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/knu/ruby-unf"&gt;unf&lt;/a&gt;, &lt;a href="https://github.com/blackwinter/unicode"&gt;unicode&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/weakref/rdoc/WeakRef.html"&gt;weakref&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/weakref.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Explicitly allow objects to be garbage collected&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby-concurrency/ref"&gt;ref&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://proger.i-forge.net/Calling_DLL_functions_from_Ruby/OSS"&gt;Win32API&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/win32"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Let's you use Windows APIs, like calling functions in DLLs&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/djberg96/win32-api"&gt;win32-api&lt;/a&gt;, &lt;a href="https://github.com/ffi/ffi"&gt;ffi&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/win32ole/rdoc/WIN32OLE.html"&gt;win32ole&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/win32ole"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Windows &lt;a href="https://en.wikipedia.org/wiki/OLE_Automation"&gt;OLE automation&lt;/a&gt; interface&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="default-gems"&gt;Default Gems&lt;/h2&gt;

&lt;p&gt;These libraries come as &lt;strong&gt;default&lt;/strong&gt; Ruby gems, so that they can be updated independently from Ruby. See &lt;a href="https://stdgems.org"&gt;stdgems.org&lt;/a&gt; for more info.&lt;/p&gt;

&lt;table class="table-20-10-50-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Gem&lt;/th&gt;
      &lt;th&gt;Sources&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Alternatives&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/benchmark/rdoc/Benchmark.html"&gt;benchmark&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/benchmark.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/benchmark"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Benchmarking library&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/evanphx/benchmark-ips"&gt;benchmark-ips&lt;/a&gt;, &lt;a href="https://github.com/benchmark-driver/benchmark-driver"&gt;benchmark-driver&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/BigDecimal.html"&gt;bigdecimal&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/bigdecimal"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/bigdecimal"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for arbitrary-precision floating point decimal arithmetic&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://www.rubydoc.info/gems/bundler"&gt;bundler&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/bundler"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/bundler/bundler"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://bundler.io"&gt;Bundler&lt;/a&gt; is the local package manager for Ruby applications&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/cgi/rdoc/CGI.html"&gt;cgi&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/cgi.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/cgi"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for CGI (&lt;a href="https://en.wikipedia.org/wiki/Common_Gateway_Interface"&gt;Common Gateway Interface&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/rack/rack/"&gt;rack&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html"&gt;csv&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/csv.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/csv"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for CSV (&lt;a href="https://en.wikipedia.org/wiki/Comma-separated_values"&gt;Comma-separated Values&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/tilo/smarter_csv"&gt;smarter_csv&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/index.html"&gt;date&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/date"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/date"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;The &lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html"&gt;Date&lt;/a&gt; and &lt;a href="https://ruby-doc.org/stdlib/libdoc/date/rdoc/DateTime.html"&gt;DateTime&lt;/a&gt; classes&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html"&gt;dbm&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/dbm"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/dbm"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="https://en.wikipedia.org/wiki/Dbm"&gt;DBM databases&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/delegate/rdoc/Delegator.html"&gt;delegate&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/delegate.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/delegate"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Provides three ways to &lt;a href="https://en.wikipedia.org/wiki/Delegation_pattern"&gt;delegate&lt;/a&gt; method calls&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/forwardable/rdoc/Forwardable.html"&gt;forwardable&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://stdgems.org/did_you_mean"&gt;did_you_mean&lt;/a&gt;&lt;br /&gt;(auto-require)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/did_you_mean"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/did_you_mean"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Patches error messages to suggest correct spelling of methods/classes/variables&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/etc/rdoc/Etc.html"&gt;etc&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/etc"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/etc"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Access UNIX info from &lt;code&gt;/etc&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/fcntl/rdoc/Fcntl.html"&gt;fcntl&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/fcntl"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/fcntl"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Loads values from the OS' &lt;code&gt;fcntl.h&lt;/code&gt; to be used for low-level &lt;a href="http://readruby.io/io#fcntl"&gt;file descriptor manipulation&lt;/a&gt; system calls with &lt;a href="https://ruby-doc.org/core/IO.html#method-i-fcntl"&gt;IO#fcntl&lt;/a&gt; and &lt;a href="https://ruby-doc.org/core/IO.html#method-c-sysopen"&gt;IO.sysopen&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/fiddle/rdoc/Fiddle.html"&gt;fiddle&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/fiddle"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/fiddle"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for FFI (&lt;a href="https://sourceware.org/libffi/"&gt;Foreign Function Interface&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ffi/ffi"&gt;ffi&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/fileutils/rdoc/FileUtils.html"&gt;fileutils&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/fileutils.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/fileutils"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Utilities for working with the file system&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/forwardable/rdoc/Forwardable.html"&gt;forwardable&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/forwardable.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/forwardable"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Provides a way to &lt;a href="https://en.wikipedia.org/wiki/Delegation_pattern"&gt;delegate&lt;/a&gt; method calls. Also see &lt;a href="http://radar.oreilly.com/2014/02/delegation-patterns-in-ruby.html"&gt;this overview of delegation in Ruby&lt;/a&gt;, which contains an example&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html"&gt;gdbm&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/gdbm"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/gdbm"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="http://www.gnu.org.ua/software/gdbm/"&gt;GNU dbm databases&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/getoptlong/rdoc/GetoptLong.html"&gt;getoptlong&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/getoptlong.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/getoptlong"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://linux.die.net/man/3/getopt_long"&gt;GNU getopt_long()&lt;/a&gt; style command-line option parsing&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/optparse/rdoc/OptParse.html"&gt;OptParse&lt;/a&gt;, &lt;a href="https://github.com/leejarvis/slop"&gt;slop&lt;/a&gt;, &lt;a href="https://github.com/ManageIQ/optimist"&gt;optimist&lt;/a&gt;, &lt;a href="https://github.com/soveran/clap"&gt;clap&lt;/a&gt;, &lt;a href="https://github.com/janlelis/rationalist"&gt;rationalist&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/io/console/rdoc/IO.html"&gt;io/console&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/io/console"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/io-console"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Patches &lt;code&gt;IO&lt;/code&gt; for simple and portable access to the console&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/ipaddr/rdoc/IPAddr.html"&gt;ipaddr&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ipaddr.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/ipaddr"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;IP address manipulation&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/bluemonk/ipaddress"&gt;ipaddress&lt;/a&gt;, &lt;a href="https://github.com/deploy2/ruby-ip"&gt;ruby-ip&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/irb/rdoc/IRB.html"&gt;irb&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/irb.rb"&gt;mri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Interactive Ruby Console (&lt;a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop"&gt;REPL&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/cldwalker/ripl"&gt;ripl&lt;/a&gt;, &lt;a href="http://pryrepl.org/"&gt;pry&lt;/a&gt;, &lt;a href="https://github.com/godfat/rib"&gt;rib&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/json/rdoc/JSON.html"&gt;json&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/json"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/flori/json"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for JSON (&lt;a href="https://en.wikipedia.org/wiki/JSON"&gt;JavaScript Object Notation&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ohler55/oj"&gt;oj&lt;/a&gt;, &lt;a href="https://github.com/brianmario/yajl-ruby"&gt;yajl-ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html"&gt;logger&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/logger.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/logger"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://ruby.janlelis.de/50-exploring-the-stdlib-logger"&gt;Logging utility&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/colbygk/log4r"&gt;log4r&lt;/a&gt;, &lt;a href="https://github.com/bdurand/lumberjack"&gt;lumberjack&lt;/a&gt;, &lt;a href="https://github.com/rudionrails/yell"&gt;yell&lt;/a&gt;, &lt;a href="https://github.com/TwP/logging"&gt;logging&lt;/a&gt;, &lt;a href="https://github.com/janlelis/micrologger"&gt;micrologger&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/matrix/rdoc/index.html"&gt;matrix&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/matrix.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/matrix"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="https://en.wikipedia.org/wiki/Matrix_%28mathematics%29"&gt;matrices&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/SciRuby/nmatrix"&gt;nmatrix&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/mutex_m/rdoc/Mutex_m.html"&gt;mutex_m&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/mutex_m.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/mutex_m"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A mixin that makes any object behave like a &lt;a href="https://ruby-doc.org/core/Mutex.html"&gt;mutex&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/observer/rdoc/Observable.html"&gt;observer&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/observer.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/observer"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Implementation of the &lt;a href="https://en.wikipedia.org/wiki/Observer_pattern"&gt;observer pattern&lt;/a&gt;, a way to let interested other objects know o an object's updates&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/janlelis/microevent.rb"&gt;microevent&lt;/a&gt;, &lt;a href="https://github.com/JEG2/signal_lamp/"&gt;signal_lamp&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/net/pop/rdoc/Net/POP3.html"&gt;net/pop&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/net/pop.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/net-pop"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for POP3 (&lt;a href="https://en.wikipedia.org/wiki/Post_Office_Protocol"&gt;Post Office Protocol&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/net/smtp/rdoc/Net/SMTP.html"&gt;net/smtp&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/net/smtp.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/net-smtp"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for SMTP (&lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;Simple Mail Transfer Protocol&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/open3/rdoc/Open3.html"&gt;open3&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/open3.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/open3"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Simple spawning of child processes&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ahoward/open4"&gt;open4&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/openssl/rdoc/OpenSSL.html"&gt;openssl&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/openssl"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/openssl"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Wraps &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; for cryptographic functionality&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/ostruct/rdoc/OpenStruct.html"&gt;ostruct&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/ostruct.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/ostruct"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Wrapper around Hash that lets you read and set attributes with a method API&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Hash.html"&gt;Hash&lt;/a&gt;, &lt;a href="https://github.com/rubyworks/ostruct2"&gt;ostruct2&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/prime/rdoc/Prime.html"&gt;prime&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/prime.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/prime"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Access to prime numbers and prime factorization&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/pstore/rdoc/PStore.html"&gt;pstore&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/pstore.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/pstore"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Transactional file storage for Ruby objects&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/psych/rdoc/Psych.html"&gt;psych&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/psych"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/tenderlove/psych"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for YAML (&lt;a href="https://en.wikipedia.org/wiki/YAML"&gt;YAML Ain't Markup Language&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/rdoc/rdoc/RDoc.html"&gt;rdoc&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/rdoc.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/rdoc/rdoc"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Ruby documentation generator&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://yardoc.org/"&gt;yard&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/readline/rdoc/Readline.html"&gt;readline&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/blob/master/lib/readline.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/readline"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;If available, &lt;strong&gt;readline-ext&lt;/strong&gt; will be loaded, or (Ruby-only) &lt;strong&gt;reline&lt;/strong&gt; will be used&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/readline/rdoc/Readline.html"&gt;readline-ext&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/readline"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/readline-ext"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Interface to &lt;a href="http://directory.fsf.org/wiki/Readline"&gt;GNU Readline&lt;/a&gt; and &lt;a href="http://thrysoee.dk/editline/"&gt;NetBSD Editline&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ConnorAtherton/rb-readline"&gt;rb-readline&lt;/a&gt;, &lt;a href="https://stdgems.org/reline/"&gt;reline&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/readline/rdoc/Readline.html"&gt;reline&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/reline"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/reline"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Ruby-only implementation of &lt;a href="http://directory.fsf.org/wiki/Readline"&gt;GNU Readline&lt;/a&gt; / &lt;a href="http://thrysoee.dk/editline/"&gt;NetBSD Editline&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ConnorAtherton/rb-readline"&gt;rb-readline&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/rexml/rdoc/REXML.html"&gt;rexml&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/rexml.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/rexml"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for XML (&lt;a href="https://en.wikipedia.org/wiki/XML"&gt;Extensible Markup Language&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://www.nokogiri.org/"&gt;nokogiri&lt;/a&gt;, &lt;a href="https://github.com/YorickPeterse/oga"&gt;oga&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/rss/rdoc/RSS.html"&gt;rss&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/rss.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/rss"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for RSS (&lt;a href="https://en.wikipedia.org/wiki/RSS"&gt;Rich Site Summary&lt;/a&gt;) and &lt;a href="https://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;Atom&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/rubygems/rdoc/Gem.html"&gt;rubygems&lt;/a&gt;&lt;br /&gt;(auto-require)&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/rubygems.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/rubygems/rubygems/"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Manages Ruby libraries.&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/sdbm/rdoc/SDBM.html"&gt;sdbm&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/sdbm"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/sdbm"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="https://en.wikipedia.org/wiki/Dbm"&gt;SDBM databases&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/singleton/rdoc/Singleton.html"&gt;singleton&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/singleton.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/singleton"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Mixin for Ruby classes that should only have one instance&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/stringio/rdoc/StringIO.html"&gt;stringio&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/stringio"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/stringio"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Makes strings behave like IO objects&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/strscan/rdoc/StringScanner.html"&gt;strscan&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/strscan"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/strscan"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Lexical string scanning&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/timeout/rdoc/Timeout.html"&gt;timeout&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/timeout.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/timeout"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Auto-terminates code blocks after the time limit is reached&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/tracer/rdoc/Tracer.html"&gt;tracer&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/tracer.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/tracer"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Outputs the &lt;a href="https://en.wikipedia.org/wiki/Tracing_%28software%29"&gt;code execution trace&lt;/a&gt; via &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-set_trace_func"&gt;Kernel#set_trace_func&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/TracePoint.html"&gt;TracePoint&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/uri/rdoc/URI.html"&gt;uri&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/uri.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/uri"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Uniform_resource_identifier"&gt;URI&lt;/a&gt;/URL manipulation&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/sporkmonger/addressable"&gt;addressable&lt;/a&gt;,&lt;a href="https://github.com/tlewin/ruby-uriparser"&gt;ruby-uriparser&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/webrick/rdoc/WEBrick.html"&gt;webrick&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/webrick.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/webrick"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;HTTP server&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://code.macournoyer.com/thin/"&gt;thin&lt;/a&gt;, &lt;a href="http://unicorn.bogomips.org/"&gt;unicorn&lt;/a&gt;, &lt;a href="http://puma.io/"&gt;puma&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/yaml/rdoc/YAML.html"&gt;yaml&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/lib/yaml.rb"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/yaml"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Loads the psych yaml parser and sets &lt;code&gt;YAML = Psych&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib.html"&gt;zlib&lt;/a&gt; &lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/ruby/tree/master/ext/zlib"&gt;mri&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/ruby/zlib"&gt;gem&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Interface to the &lt;a href="https://en.wikipedia.org/wiki/Zlib"&gt;zlib compression library&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="bundled-gems"&gt;Bundled Gems&lt;/h2&gt;

&lt;p&gt;Gems that will be installed together with Ruby. See &lt;a href="https://stdgems.org"&gt;stdgems.org&lt;/a&gt; for more info.&lt;/p&gt;

&lt;table class="table-20-60-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Gem&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Alternatives&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/seattlerb/minitest"&gt;minitest&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Test/spec framework, comes with mocking and benchmark capabilities&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/rspec/rspec"&gt;rspec&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/net-telnet"&gt;net-telnet&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Support for &lt;a href="https://en.wikipedia.org/wiki/Telnet"&gt;Telnet&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/k-tsj/power_assert"&gt;power_assert&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Debug tool that displays intermediate results of a method chain&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/rake"&gt;rake&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A Ruby task runner, inspired by &lt;a href="https://en.wikipedia.org/wiki/Make_%28software%29"&gt;make&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://whatisthor.com/"&gt;thor&lt;/a&gt;, &lt;a href="https://github.com/cldwalker/boson"&gt;boson&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/test-unit/test-unit"&gt;test-unit&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;A xUnit family unit testing framework&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://github.com/seattlerb/minitest"&gt;minitest&lt;/a&gt;, &lt;a href="https://github.com/rspec/rspec"&gt;rspec&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/ruby/xmlrpc"&gt;xmlrpc&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/XML-RPC"&gt;Remote Procedure Calls via XML and HTTP&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;a href="https://github.com/janlelis/idiosyncratic-ruby.com/blob/master/source/posts/20-better-standards.html.md"&gt;Something's wrong or missing? You can edit this list on GitHub!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/doc/standard_library_rdoc.html"&gt;RDoc: Standard library short descriptions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/doc/maintainers_rdoc.html"&gt;RDoc: Standard library maintainers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://redmine.ruby-lang.org/projects/ruby/wiki/StdlibGem"&gt;About standard library gems&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/janlelis/stdgems"&gt;Standard Gems Data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Symbolic Reservations</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/19-semantic-symbols.html"/>
    <id>https://idiosyncratic-ruby.com/19-semantic-symbols.html</id>
    <published>2015-05-19T00:00:00Z</published>
    <updated>2015-05-19T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;This episode takes a look at the unusual use of symbols in one of Ruby's core APIs:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="enumerablechunk"&gt;&lt;code&gt;Enumerable#chunk&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;chunk&lt;/code&gt; method splits the receiver object into multiple enumerators, using the rule defined in the block. It keeps together the parts that match in series. It then passes the result of this rule and an enumerator of the successive elements to the given block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ |n| n % 11 == 0 }.each{ |result, elements|
  puts "#{result}: #{elements * ' - '}"
}
# false: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
# true: 11
# false: 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21
# true: 22
# false: 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32
# true: 33
# false: 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can use this to order numbers in &lt;a href="https://en.wikipedia.org/wiki/Quotient_ring"&gt;quotient rings&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a = (0..4).map{ [] }
(1..42).chunk{ |n| n % 5 }.each{ |remainder, elements|
  a[remainder] += elements
}
puts a.map(&amp;amp;:inspect)
# [5, 10, 15, 20, 25, 30, 35, 40],    # every number where n % 5 == 0
# [1, 6, 11, 16, 21, 26, 31, 36, 41], # every number where n % 5 == 1
# [2, 7, 12, 17, 22, 27, 32, 37, 42], # every number where n % 5 == 2
# [3, 8, 13, 18, 23, 28, 33, 38],     # every number where n % 5 == 3
# [4, 9, 14, 19, 24, 29, 34, 39]      # every number where n % 5 == 4
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The reason I am bringing it up as &lt;em&gt;idiosyncratic&lt;/em&gt; is: You can use &lt;strong&gt;special symbols&lt;/strong&gt; to influence the behavior of the chunk method, when used as the block return value. Anyone has seen something like this anywhere else in Ruby?&lt;/p&gt;

&lt;p&gt;Let's revisit a shortened version of the example at the top:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ |n| n % 11 == 0 }.to_a
# =&amp;gt; [
#   [false, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], [true, [11]],
#   [false, [12, 13, 14, 15, 16, 17, 18, 19, 20, 21]], [true, [22]],
#   [false, [23, 24, 25, 26, 27, 28, 29, 30, 31, 32]], [true, [33]],
#   [false, [34, 35, 36, 37, 38, 39, 40, 41, 42]]
# ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It does nothing, when you pass in an arbitrary symbol as filter rule:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ :symbol }.to_a
# =&amp;gt; [
#   [:symbol, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
#   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
#   36, 37, 38, 39, 40, 41, 42]]
# ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, when passing the special symbol &lt;code&gt;:_alone&lt;/code&gt;, every element will be separated:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ :_alone }.to_a
# =&amp;gt; [
#   [:_alone, [1]], [:_alone, [2]], [:_alone, [3]], [:_alone, [4]], [:_alone, [5]],
#   [:_alone, [6]], [:_alone, [7]], [:_alone, [8]], [:_alone, [9]], [:_alone, [10]],
#   [:_alone, [11]], [:_alone, [12]], [:_alone, [13]], [:_alone, [14]],
#   [:_alone, [15]], [:_alone, [16]], [:_alone, [17]], [:_alone, [18]],
#   [:_alone, [19]], [:_alone, [20]], [:_alone, [21]], [:_alone, [22]],
#   [:_alone, [23]], [:_alone, [24]], [:_alone, [25]], [:_alone, [26]],
#   [:_alone, [27]], [:_alone, [28]], [:_alone, [29]], [:_alone, [30]],
#   [:_alone, [31]], [:_alone, [32]], [:_alone, [33]], [:_alone, [34]],
#   [:_alone, [35]], [:_alone, [36]], [:_alone, [37]], [:_alone, [38]],
#   [:_alone, [39]], [:_alone, [40]], [:_alone, [41]], [:_alone, [42]]
# ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is also the special symbol &lt;code&gt;:_separator&lt;/code&gt;, which drops every element:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ :_separator }.to_a
# =&amp;gt; []
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Normally you don't want to return &lt;code&gt;:_alone&lt;/code&gt; or &lt;code&gt;:_separator&lt;/code&gt; for every element, but in specific instances of your filter rule, which is legit. The question remains, is this a good API for the future of Ruby?&lt;/p&gt;

&lt;p&gt;One more thing: Unknown &lt;strong&gt;special symbols&lt;/strong&gt; (those that start with &lt;code&gt;_&lt;/code&gt;) will raise a &lt;code&gt;RuntimeError&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(1..42).chunk{ :_future }.to_a
# RuntimeError: symbols beginning with an underscore are reserved
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Enumerable.html#method-i-chunk"&gt;RDoc Enumerable#chunk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Con-Struct Attributes</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/18-con-struct-attributes.html"/>
    <id>https://idiosyncratic-ruby.com/18-con-struct-attributes.html</id>
    <published>2015-05-18T00:00:00Z</published>
    <updated>2015-05-18T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's &lt;a href="https://ruby-doc.org/core/Struct.html"&gt;Struct&lt;/a&gt; class is a convenient way to create Ruby classes, which already have some attributes defined. If you are not familiar with structs, you should watch &lt;a href="https://www.rubytapas.com/episodes/20-Struct"&gt;Avdi Grimm's introduction to structs&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;But in many cases there is something better than structs:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="gems-that-define-attributes-for-plain-old-ruby-objects"&gt;Gems that Define Attributes for "Plain Old Ruby Objects"&lt;/h2&gt;

&lt;p&gt;Instead of using a specialized struct-class (which has different semantics), you could also go with normal Ruby classes. What follows is a collection of gems you could use for this purpose.&lt;/p&gt;

&lt;p&gt;At the bottom, there are also some tips, &lt;a href="#structs-are-still-useful-as-value-objects"&gt;when to use structs and what to bear in mind regarding structs&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="virtus"&gt;Virtus&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/solnic/virtus"&gt;virtus&lt;/a&gt;: &lt;em&gt;Attributes on Steroids for Plain Old Ruby Objects&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'virtus'

class Person
  include Virtus.model

  attribute :name
  attribute :age
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person:0x00000001ad85a8 @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="active-attr"&gt;Active Attr&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/cgriego/active_attr"&gt;active_attr&lt;/a&gt;: &lt;em&gt;What ActiveModel left out&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'active_attr'

class Person
  include ActiveAttr::MassAssignment
  attr_accessor :name, :age
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person:0x00000002464f18 @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="fast-attributes"&gt;Fast Attributes&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/applift/fast_attributes"&gt;fast_attributes&lt;/a&gt;: &lt;em&gt;FastAttributes adds attributes with their types to the class&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'fast_attributes'

class Person
  extend FastAttributes

  define_attributes initialize: true do
    attribute :name, Object
    attribute :age, Object
  end
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="attrio"&gt;Attrio&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/jetrockets/attrio"&gt;attrio&lt;/a&gt;: &lt;em&gt;Attributes for plain old Ruby objects. No dependencies, only simplicity and clearness.&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'attrio'

class Person
  include Attrio

  define_attributes do
    attr :name
    attr :age
  end

  def initialize(attributes = {})
    self.attributes = attributes
  end


  def attributes=(attributes = {})
    attributes.each do |attr,value|
      self.send("#{attr}=", value) if self.respond_to?("#{attr}=")
    end
  end
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; &amp;lt;Person name: "Jan", age: 26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="attrextras"&gt;attr_extras&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/barsoom/attr_extras"&gt;attr_extras&lt;/a&gt;: &lt;em&gt;Takes some boilerplate out of Ruby with methods like attr_initialize.&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'attr_extras'

class Person
  attr_initialize :name, :age
  attr_reader :name, :age
end

Person.new("Jan", 26)
# =&amp;gt; #&amp;lt;Person:0x0000000216ed40 @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="concord"&gt;Concord&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mbj/concord"&gt;concord&lt;/a&gt;: &lt;em&gt;Mixin to ease compositions under ruby&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'concord'

class Person
  include Concord.new(:name, :age)
end

Person.new("Jan", 26)
# =&amp;gt; #&amp;lt;Person name="Jan" age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="fatter-attr"&gt;Fatter Attr&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ahoward/fattr"&gt;fattr&lt;/a&gt;: &lt;em&gt;fattr.rb is a "fatter attr" for ruby and borrows heavily from the metakoans.rb ruby quiz&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'fattr'

class Person
  fattrs :name, :age
end

person = Person.new
person.name = "Jan"
person.age  = 26
person
# =&amp;gt; #&amp;lt;Person:0x0000000147d7a8 @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="anima"&gt;Anima&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mbj/anima"&gt;anima&lt;/a&gt;: &lt;em&gt;Object initializer from attributes hash&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'anima'

class Person
  include Anima.new(:name, :age)
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person name="Jan" age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="kwattr"&gt;KWAttr&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/etiennebarrie/kwattr"&gt;kwattr&lt;/a&gt;: &lt;em&gt;attr_reader + initialize with keyword arguments&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'kwattr'

class Person
  kwattr :name, :age
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person:0x00000002602988 @name="Jan", @age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="dry-struct"&gt;dry-struct&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dry-rb/dry-struct"&gt;dry-struct&lt;/a&gt;: &lt;em&gt;dry-struct is a gem built on top of dry-types which provides virtus-like DSL for defining typed struct classes.&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "dry-struct"

module Types
  include Dry::Types()
end

class Person &amp;lt; Dry::Struct
  attribute :name, Types::Strict::String.optional
  attribute :age, Types::Coercible::Integer
end

Person.new(name: "Jan", age: 26)
# =&amp;gt; #&amp;lt;Person name="Jan" age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="structs-are-still-useful-as-value-objects"&gt;Structs are Still Useful… as Value Objects&lt;/h2&gt;

&lt;p&gt;Structs are different from normal Ruby classes, but they are still very useful for creating &lt;a href="https://en.wikipedia.org/wiki/Value_object"&gt;value objects&lt;/a&gt;. Value objects should be immutable and the following gems assist you in creating read-only objects with a Struct-like API:&lt;/p&gt;

&lt;h3 id="values"&gt;Values&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/tcrayford/values"&gt;values&lt;/a&gt;: &lt;em&gt;Simple immutable value objects for ruby (the readme is longer than the code)&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'values'

Person = Value.new(:name, :age)
Person.new("Jan", 26) # =&amp;gt; &amp;lt;Person name="Jan", age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="immutable-struct"&gt;Immutable Struct&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/iconara/immutable_struct"&gt;immutable_struct&lt;/a&gt;: &lt;em&gt;An immutable version of Ruby's Struct class&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'immutable_struct'

Person = ImmutableStruct.new(:name, :age)
Person.new("Jan", 26) # =&amp;gt; #&amp;lt;struct Person name="Jan", age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="value-struct"&gt;Value Struct&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/janlelis/value_struct"&gt;value_struct&lt;/a&gt;: &lt;em&gt;Read-only structs in Ruby&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'value_struct'

Person = ValueStruct.new(:name, :age)
Person.new("Jan", 26) # =&amp;gt; #&amp;lt;ValueStruct Person name="Jan", age=26&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="why-not-structs-everywhere"&gt;Why Not Structs Everywhere?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;You cannot access its instance variables directly&lt;/li&gt;
  &lt;li&gt;Structs have &lt;a href="https://ruby-doc.org/core/Struct.html#public-instance-method-details"&gt;their own methods&lt;/a&gt; (like &lt;code&gt;[]&lt;/code&gt;, a getter for variables), which might not always be useful&lt;/li&gt;
  &lt;li&gt;Pitfalls when creating structs with custom behavior (see below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The different ways to initialize a Struct:&lt;/p&gt;

&lt;h3 id="inherit"&gt;Inherit&lt;/h3&gt;

&lt;p&gt;One way to add custom methods to a struct is to directly sub-class it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Person &amp;lt; Struct.new(:name, :age)
  def name_and_age
    "#{name}, #{age}"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The bad thing about this is that it will add an additional entry to your ancestor chain:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Person.ancestors # =&amp;gt; [Person, #&amp;lt;Class:0x00000001612140&amp;gt;, Struct, ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="block"&gt;Block&lt;/h3&gt;

&lt;p&gt;This can be avoided by passing a block to the initializer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Person = Struct.new(:name, :age) do
  def name_and_age
    "#{name}, #{age}"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, you got a new problem with this approach: You are not in the &lt;em&gt;define a class&lt;/em&gt; scope. This can be confusing when working with constants:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Person = Struct.new(:name, :age) do
  MAXIMUM_AGE = 120
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will create a top-level constant &lt;code&gt;MAXIMUM_AGE&lt;/code&gt; instead of a namespaced &lt;code&gt;Person::MAXIMUM_AGE&lt;/code&gt; one.&lt;/p&gt;

&lt;h3 id="reopen"&gt;Reopen&lt;/h3&gt;

&lt;p&gt;The approach that avoids both problems, is a little bit more verbose, but well readable:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Person = Struct.new(:name, :age)

class Person
  def name_and_age
    "#{name}, #{age}"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It also seems to &lt;a href="https://gist.github.com/janlelis/02b75baac8521d311bf2"&gt;perform slightly better&lt;/a&gt; than the other options.&lt;/p&gt;

&lt;h3 id="further-reading"&gt;Further Reading&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Plain_old_data_structure"&gt;Wikipedia: Plain old data structure&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://rubyquiz.com/quiz67.html"&gt;Ruby Quiz: Implementing #attribute&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.rubybestpractices.com/posts/rklemme/017-Struct.html"&gt;Article: Structs inside out&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://thepugautomatic.com/2013/08/struct-inheritance-is-overused/"&gt;Article: Struct inheritance is overused&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Stream Editing</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/17-stream-editing.html"/>
    <id>https://idiosyncratic-ruby.com/17-stream-editing.html</id>
    <published>2015-05-17T00:00:00Z</published>
    <updated>2015-05-17T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;One of Ruby's goals was to replace popular unix &lt;em&gt;stream editors&lt;/em&gt; like &lt;code&gt;awk&lt;/code&gt; or &lt;code&gt;sed&lt;/code&gt;, which both have the concept of manipulating files in a line-based manner. Ruby has the &lt;code&gt;-n&lt;/code&gt; option for this:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Causes Ruby to assume the following loop around your script, which makes it
iterate over file name arguments somewhat like sed -n or awk.

      while gets
        ...
      end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And its sibling &lt;code&gt;-p&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Acts mostly same as -n switch, but print the value of variable $_ at the each
end of the loop.
For example:

      % echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"'
      MATZ
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What you need to know is that the &lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;special global variable&lt;/a&gt; &lt;code&gt;$_&lt;/code&gt; contains the last read input. When using &lt;code&gt;-n&lt;/code&gt; or &lt;code&gt;-p&lt;/code&gt;, this usually means the current line. Another thing to keep in mind: &lt;code&gt;gets&lt;/code&gt; reads from &lt;a href="http://readruby.io/io#argf"&gt;&lt;code&gt;ARGF&lt;/code&gt;&lt;/a&gt;, not from &lt;code&gt;STDIN&lt;/code&gt;, so you can pass arguments that will be interpreted as filenames of the files that should be processed. Equipped with this knowledge, you can build a very basic example, which just prints out the given file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'print $_' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since print without arguments implicitly prints out &lt;code&gt;$_&lt;/code&gt;, this can be shortened to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'print' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If one uses &lt;code&gt;-p&lt;/code&gt;, instead of &lt;code&gt;-n&lt;/code&gt;, no code is required, because &lt;code&gt;-p&lt;/code&gt; will call &lt;code&gt;print&lt;/code&gt; implicitly:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -pe '' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now let's modify each line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -pe '$_.reverse!' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will print out the file with all its lines reversed.&lt;/p&gt;

&lt;p&gt;Here is another example, which will print every line in a random ANSI color:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'print "\e[3#{rand(8)}m#$_"' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is more to assist you in writing these short line manipulation scripts:&lt;/p&gt;

&lt;h2 id="the-ruby-one-liner-toolbox"&gt;The Ruby One-Liner Toolbox&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;CLI Options: &lt;code&gt;-n&lt;/code&gt; &lt;code&gt;-p&lt;/code&gt; &lt;code&gt;-0&lt;/code&gt; &lt;code&gt;-F&lt;/code&gt; &lt;code&gt;-a&lt;/code&gt; &lt;code&gt;-i&lt;/code&gt; &lt;code&gt;-l&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Global Variables: &lt;code&gt;$_&lt;/code&gt; &lt;code&gt;$/&lt;/code&gt; &lt;code&gt;$\&lt;/code&gt; &lt;code&gt;$;&lt;/code&gt; &lt;code&gt;$F&lt;/code&gt; &lt;code&gt;$.&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Methods that operate on &lt;code&gt;$_&lt;/code&gt;, implicitly: &lt;code&gt;print&lt;/code&gt; &lt;code&gt;~&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;The special &lt;code&gt;BEGIN{}&lt;/code&gt; and &lt;code&gt;END{}&lt;/code&gt; blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="running-code-before-or-after-processing-the-input"&gt;Running Code Before or After Processing the Input&lt;/h2&gt;

&lt;p&gt;You can run code before the loop starts with &lt;code&gt;BEGIN&lt;/code&gt; and after the loop with &lt;code&gt;END&lt;/code&gt;. For example, this will count characters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'BEGIN{ count = 0 }; count += $_.size; END{ print count }' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="using-line-numbers"&gt;Using Line Numbers&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;$.&lt;/code&gt; contains the current line number. A use-case would be counting the lines of a file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'END{p$.}' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="string-matching"&gt;String Matching&lt;/h2&gt;

&lt;p&gt;Now let's do some conditional processing: Only print a line if it contains a digit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'print if ~/\d/' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The message to take away: The &lt;code&gt;~&lt;/code&gt; method implicitly matches the regex against &lt;code&gt;$_&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But it gets even better:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'print if /\d/' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You thought conditions with a truthy value will always execute the &lt;code&gt;if&lt;/code&gt;-branch of a conditions? They will not, if the truthy value is a non-matching regex literal!&lt;/p&gt;

&lt;p&gt;This also works when using the ternary operator for conditions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'puts "#$.: #{ /\d/ ? "first digit: #$&amp;amp;" : "no digit" }"' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="inplace-editing-files"&gt;Inplace-Editing files&lt;/h2&gt;

&lt;p&gt;Using the &lt;code&gt;-i&lt;/code&gt; option, you can modify files directly (just like &lt;code&gt;sed&lt;/code&gt;'s &lt;code&gt;-i&lt;/code&gt; mode). For example, removing all trailing spaces:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -ne 'puts $_.rstrip!' -i filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Like in &lt;code&gt;sed&lt;/code&gt;, you can provide a file extension to the &lt;code&gt;-i&lt;/code&gt; option which will be used to create a backup file before processing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -pe '$_.upcase!' -i.original filename
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="auto-splitting-lines"&gt;Auto-splitting Lines&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;-a&lt;/code&gt; option will run &lt;code&gt;$F = $_.split&lt;/code&gt; for every line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -nae 'puts $F.reverse.join(" ")' filename
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="specify-line-format"&gt;Specify Line Format&lt;/h2&gt;

&lt;p&gt;You might not always want to use &lt;code&gt;\n&lt;/code&gt; as the character that separates lines. Fortunately, Ruby has &lt;a href="https://idiosyncratic-ruby.com/16-changing-the-rules.html#change-a-global-default-separator"&gt;record separators&lt;/a&gt;, and you can set some of them via command-line options:&lt;/p&gt;

&lt;table class="table-10-10-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Variable&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sets the &lt;em&gt;input record separator&lt;/em&gt;, which is used by &lt;code&gt;Kernel#gets&lt;/code&gt;. Character to use must be given as &lt;a href="https://en.wikipedia.org/wiki/Octal"&gt;octal number&lt;/a&gt;. If no number is given (&lt;code&gt;-0&lt;/code&gt;), it will use null bytes as separator. Using &lt;code&gt;-0777&lt;/code&gt; will read in the whole file at once. Another special value is &lt;code&gt;-00&lt;/code&gt;, which will set &lt;code&gt;$_&lt;/code&gt; to &lt;code&gt;"\n\n"&lt;/code&gt; (paragraph mode).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-F&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sets the &lt;em&gt;input field separator&lt;/em&gt;, which is used by &lt;code&gt;String#split&lt;/code&gt;. Useful in combination with the &lt;code&gt;-a&lt;/code&gt; option.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-l&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$\&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sets the &lt;em&gt;output record separator&lt;/em&gt; to the value of the &lt;em&gt;input record separator&lt;/em&gt; (&lt;code&gt;$/&lt;/code&gt;). Also runs &lt;a href="https://ruby-doc.org/core/String.html#method-i-chop-21"&gt;String#chop!&lt;/a&gt; on every line!&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://benoithamelin.tumblr.com/ruby1line/"&gt;A lot of handy Ruby one-liners by Benoit Hamelin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sed"&gt;sed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://idiosyncratic-ruby.com/6-run-ruby-run.html"&gt;un&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/grosser/pru"&gt;pru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Changing the Rules</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/16-changing-the-rules.html"/>
    <id>https://idiosyncratic-ruby.com/16-changing-the-rules.html</id>
    <published>2015-05-16T00:00:00Z</published>
    <updated>2015-05-16T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby allows you to change key functionality of the language. This means, it is also possible to break key functionality! Six examples of Ruby code you should never use:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="undefining-core-methods"&gt;Undefining Core Methods&lt;/h2&gt;

&lt;p&gt;The simplest way to change Ruby's global behavior is monkey patching: Nothing stops you from altering important core methods:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Module; undef append_features; end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This line will break the ability to mix-in modules:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Math.sin 42 # =&amp;gt; -0.9165215479156338
include Math
# NoMethodError: undefined method `append_features' for Math:Module
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="everything-nil"&gt;Everything &lt;code&gt;nil&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;No more &lt;code&gt;NoMethodError: undefined method&lt;/code&gt; or &lt;code&gt;NameError: uninitialized constant&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class BasicObject
  def self.const_missing(*)
  end

  def method_missing(*)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nothing will fail, anymore. Not a good idea. Also see: &lt;a href="https://github.com/raganwald-deprecated/homoiconic/blob/master/2009-02-02/hopeless_egocentricity.md"&gt;Hopeless Egocentricity&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;IDio.synCRATIC # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="alternative-hash-access-semantics"&gt;Alternative Hash Access Semantics&lt;/h2&gt;

&lt;p&gt;You can redefine hash semantics, to raise an error, if a key was not found:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Hash
  alias [] fetch
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you will always get &lt;code&gt;KeyError&lt;/code&gt; instead of &lt;code&gt;nil&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ "Idiosyncratic": "Ruby" }["Sane"]
# `fetch': key not found: "Sane" (KeyError)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You could argue that this is much cleaner than the normal semantics, but you won't be compatible with the rest of the world.&lt;/p&gt;

&lt;h2 id="manipulate-global-randomness"&gt;Manipulate Global Randomness&lt;/h2&gt;

&lt;p&gt;Don't use &lt;code&gt;Kernel#rand&lt;/code&gt;, &lt;code&gt;Array#shuffle&lt;/code&gt; or &lt;code&gt;Array#sample&lt;/code&gt;. &lt;a href="https://coderwall.com/p/oijyja/array-sample-and-array-shuffle-using-securerandom"&gt;Always use&lt;/a&gt; &lt;a href="http://rbjl.janlelis.com/67-ruby-and-random"&gt;SecureRandom!&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;srand 84 # =&amp;gt; (something)
rand 100 # =&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="change-a-global-default-separator"&gt;Change a Global Default Separator&lt;/h2&gt;

&lt;p&gt;Four of &lt;a href="https://idiosyncratic-ruby.com/9-globalization.html"&gt;Ruby's special two-letter globals&lt;/a&gt; are called &lt;em&gt;record separators&lt;/em&gt; and they affect the behaviour of various methods in Ruby:&lt;/p&gt;

&lt;table class="table-15-30-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Variable&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Default&lt;/th&gt;
      &lt;th&gt;Examples for Methods Affected&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;(Input) Field Separator&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;String#split&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$,&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Output Field Separator&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Array#join&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Input Record Separator&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"\n"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Kernel#gets&lt;/code&gt;, &lt;code&gt;IO#readlines&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$\&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Output Record Separator&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Kernel#print&lt;/code&gt;, &lt;code&gt;IO#write&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Not only your own code is affected, but also core functionality. For example, changing the default output separators also changes Ruby's error messages:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; $, = "YIKES"
&amp;gt;&amp;gt; 123abc
SyntaxErrorYIKES: YIKES(irb):2: syntax error, unexpected tIDENTIFIER, \
expecting end-of-inputYIKES
  from /home/user/.rvm/rubies/ruby-2.2.2/bin/irb:11:in `&amp;lt;main&amp;gt;'YIKES
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="disabling-garbage-collection"&gt;Disabling Garbage Collection&lt;/h2&gt;

&lt;p&gt;Be careful! This might cause your machine to freeze or even worse!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;GC.disable
100_000_000.times.each{ |i| "#{i}" }
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>210 Ways to Rome</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/15-207-ways-to-rome.html"/>
    <id>https://idiosyncratic-ruby.com/15-207-ways-to-rome.html</id>
    <published>2015-05-15T00:00:00Z</published>
    <updated>2015-05-15T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;All Ruby syntaxes¹ that represent the &lt;strong&gt;R&lt;/strong&gt; string literal:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="double-quoted-literal"&gt;(1) Double Quoted Literal&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;"R"&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="single-quoted-literal"&gt;(1) Single Quoted Literal&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;'R'&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="single-char-literals"&gt;(1) Single Char Literals&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;?R&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="heredocs"&gt;(9) Heredocs&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;"STRING"
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;'STRING'
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;STRING
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;-"STRING"
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;-'STRING'
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;-STRING
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;~"STRING"
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;~'STRING'
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;~STRING
R
STRING&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="percent-syntax--q"&gt;(66) Percent Syntax / Q&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;%Q\0R\0&lt;/code&gt;
&lt;code&gt;%Q\x01R\x01&lt;/code&gt;
&lt;code&gt;%Q\x02R\x02&lt;/code&gt;
&lt;code&gt;%Q\x03R\x03&lt;/code&gt;
&lt;code&gt;%Q\x04R\x04&lt;/code&gt;
&lt;code&gt;%Q\x05R\x05&lt;/code&gt;
&lt;code&gt;%Q\x06R\x06&lt;/code&gt;
&lt;code&gt;%Q\aR\a&lt;/code&gt;
&lt;code&gt;%Q\bR\b&lt;/code&gt;
&lt;code&gt;%Q\tR\t&lt;/code&gt;
&lt;code&gt;%Q\nR\n&lt;/code&gt;
&lt;code&gt;%Q\vR\v&lt;/code&gt;
&lt;code&gt;%Q\fR\f&lt;/code&gt;
&lt;code&gt;%Q\rR\r&lt;/code&gt;
&lt;code&gt;%Q\x0ER\x0E&lt;/code&gt;
&lt;code&gt;%Q\x0FR\x0F&lt;/code&gt;
&lt;code&gt;%Q\x10R\x10&lt;/code&gt;
&lt;code&gt;%Q\x11R\x11&lt;/code&gt;
&lt;code&gt;%Q\x12R\x12&lt;/code&gt;
&lt;code&gt;%Q\x13R\x13&lt;/code&gt;
&lt;code&gt;%Q\x14R\x14&lt;/code&gt;
&lt;code&gt;%Q\x15R\x15&lt;/code&gt;
&lt;code&gt;%Q\x16R\x16&lt;/code&gt;
&lt;code&gt;%Q\x17R\x17&lt;/code&gt;
&lt;code&gt;%Q\x18R\x18&lt;/code&gt;
&lt;code&gt;%Q\x19R\x19&lt;/code&gt;
&lt;code&gt;%Q\x1AR\x1A&lt;/code&gt;
&lt;code&gt;%Q\eR\e&lt;/code&gt;
&lt;code&gt;%Q\x1CR\x1C&lt;/code&gt;
&lt;code&gt;%Q\x1DR\x1D&lt;/code&gt;
&lt;code&gt;%Q\x1ER\x1E&lt;/code&gt;
&lt;code&gt;%Q\x1FR\x1F&lt;/code&gt;
&lt;code&gt;%Q&amp;nbsp;R&amp;nbsp;&lt;/code&gt;
&lt;code&gt;%Q!R!&lt;/code&gt;
&lt;code&gt;%Q"R"&lt;/code&gt;
&lt;code&gt;%Q#R#&lt;/code&gt;
&lt;code&gt;%Q$R$&lt;/code&gt;
&lt;code&gt;%Q%R%&lt;/code&gt;
&lt;code&gt;%Q&amp;amp;R&amp;amp;&lt;/code&gt;
&lt;code&gt;%Q'R'&lt;/code&gt;
&lt;code&gt;%Q(R)&lt;/code&gt;
&lt;code&gt;%Q)R)&lt;/code&gt;
&lt;code&gt;%Q*R*&lt;/code&gt;
&lt;code&gt;%Q+R+&lt;/code&gt;
&lt;code&gt;%Q,R,&lt;/code&gt;
&lt;code&gt;%Q-R-&lt;/code&gt;
&lt;code&gt;%Q.R.&lt;/code&gt;
&lt;code&gt;%Q/R/&lt;/code&gt;
&lt;code&gt;%Q:R:&lt;/code&gt;
&lt;code&gt;%Q;R;&lt;/code&gt;
&lt;code&gt;%Q&amp;lt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%Q=R=&lt;/code&gt;
&lt;code&gt;%Q&amp;gt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%Q?R?&lt;/code&gt;
&lt;code&gt;%Q@R@&lt;/code&gt;
&lt;code&gt;%Q[R]&lt;/code&gt;
&lt;code&gt;%Q\\R\\&lt;/code&gt;
&lt;code&gt;%Q]R]&lt;/code&gt;
&lt;code&gt;%Q^R^&lt;/code&gt;
&lt;code&gt;%Q_R_&lt;/code&gt;
&lt;code&gt;%Q`R`&lt;/code&gt;
&lt;code&gt;%Q{R}&lt;/code&gt;
&lt;code&gt;%Q|R|&lt;/code&gt;
&lt;code&gt;%Q}R}&lt;/code&gt;
&lt;code&gt;%Q~R~&lt;/code&gt;
&lt;code&gt;%Q\x7FR\x7F&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="percent-syntax--q-1"&gt;(66) Percent Syntax / q&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;%q\0R\0&lt;/code&gt;
&lt;code&gt;%q\x01R\x01&lt;/code&gt;
&lt;code&gt;%q\x02R\x02&lt;/code&gt;
&lt;code&gt;%q\x03R\x03&lt;/code&gt;
&lt;code&gt;%q\x04R\x04&lt;/code&gt;
&lt;code&gt;%q\x05R\x05&lt;/code&gt;
&lt;code&gt;%q\x06R\x06&lt;/code&gt;
&lt;code&gt;%q\aR\a&lt;/code&gt;
&lt;code&gt;%q\bR\b&lt;/code&gt;
&lt;code&gt;%q\tR\t&lt;/code&gt;
&lt;code&gt;%q\nR\n&lt;/code&gt;
&lt;code&gt;%q\vR\v&lt;/code&gt;
&lt;code&gt;%q\fR\f&lt;/code&gt;
&lt;code&gt;%q\rR\r&lt;/code&gt;
&lt;code&gt;%q\x0ER\x0E&lt;/code&gt;
&lt;code&gt;%q\x0FR\x0F&lt;/code&gt;
&lt;code&gt;%q\x10R\x10&lt;/code&gt;
&lt;code&gt;%q\x11R\x11&lt;/code&gt;
&lt;code&gt;%q\x12R\x12&lt;/code&gt;
&lt;code&gt;%q\x13R\x13&lt;/code&gt;
&lt;code&gt;%q\x14R\x14&lt;/code&gt;
&lt;code&gt;%q\x15R\x15&lt;/code&gt;
&lt;code&gt;%q\x16R\x16&lt;/code&gt;
&lt;code&gt;%q\x17R\x17&lt;/code&gt;
&lt;code&gt;%q\x18R\x18&lt;/code&gt;
&lt;code&gt;%q\x19R\x19&lt;/code&gt;
&lt;code&gt;%q\x1AR\x1A&lt;/code&gt;
&lt;code&gt;%q\eR\e&lt;/code&gt;
&lt;code&gt;%q\x1CR\x1C&lt;/code&gt;
&lt;code&gt;%q\x1DR\x1D&lt;/code&gt;
&lt;code&gt;%q\x1ER\x1E&lt;/code&gt;
&lt;code&gt;%q\x1FR\x1F&lt;/code&gt;
&lt;code&gt;%q&amp;nbsp;R&amp;nbsp;&lt;/code&gt;
&lt;code&gt;%q!R!&lt;/code&gt;
&lt;code&gt;%q"R"&lt;/code&gt;
&lt;code&gt;%q#R#&lt;/code&gt;
&lt;code&gt;%q$R$&lt;/code&gt;
&lt;code&gt;%q%R%&lt;/code&gt;
&lt;code&gt;%q&amp;amp;R&amp;amp;&lt;/code&gt;
&lt;code&gt;%q'R'&lt;/code&gt;
&lt;code&gt;%q(R)&lt;/code&gt;
&lt;code&gt;%q)R)&lt;/code&gt;
&lt;code&gt;%q*R*&lt;/code&gt;
&lt;code&gt;%q+R+&lt;/code&gt;
&lt;code&gt;%q,R,&lt;/code&gt;
&lt;code&gt;%q-R-&lt;/code&gt;
&lt;code&gt;%q.R.&lt;/code&gt;
&lt;code&gt;%q/R/&lt;/code&gt;
&lt;code&gt;%q:R:&lt;/code&gt;
&lt;code&gt;%q;R;&lt;/code&gt;
&lt;code&gt;%q&amp;lt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%q=R=&lt;/code&gt;
&lt;code&gt;%q&amp;gt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%q?R?&lt;/code&gt;
&lt;code&gt;%q@R@&lt;/code&gt;
&lt;code&gt;%q[R]&lt;/code&gt;
&lt;code&gt;%q\\R\\&lt;/code&gt;
&lt;code&gt;%q]R]&lt;/code&gt;
&lt;code&gt;%q^R^&lt;/code&gt;
&lt;code&gt;%q_R_&lt;/code&gt;
&lt;code&gt;%q`R`&lt;/code&gt;
&lt;code&gt;%q{R}&lt;/code&gt;
&lt;code&gt;%q|R|&lt;/code&gt;
&lt;code&gt;%q}R}&lt;/code&gt;
&lt;code&gt;%q~R~&lt;/code&gt;
&lt;code&gt;%q\x7FR\x7F&lt;/code&gt;&lt;/p&gt;

&lt;h2 id="percent-syntax--none"&gt;(66) Percent Syntax / None&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;%\0R\0&lt;/code&gt;
&lt;code&gt;%\x01R\x01&lt;/code&gt;
&lt;code&gt;%\x02R\x02&lt;/code&gt;
&lt;code&gt;%\x03R\x03&lt;/code&gt;
&lt;code&gt;%\x04R\x04&lt;/code&gt;
&lt;code&gt;%\x05R\x05&lt;/code&gt;
&lt;code&gt;%\x06R\x06&lt;/code&gt;
&lt;code&gt;%\aR\a&lt;/code&gt;
&lt;code&gt;%\bR\b&lt;/code&gt;
&lt;code&gt;%\tR\t&lt;/code&gt;
&lt;code&gt;%\nR\n&lt;/code&gt;
&lt;code&gt;%\vR\v&lt;/code&gt;
&lt;code&gt;%\fR\f&lt;/code&gt;
&lt;code&gt;%\rR\r&lt;/code&gt;
&lt;code&gt;%\x0ER\x0E&lt;/code&gt;
&lt;code&gt;%\x0FR\x0F&lt;/code&gt;
&lt;code&gt;%\x10R\x10&lt;/code&gt;
&lt;code&gt;%\x11R\x11&lt;/code&gt;
&lt;code&gt;%\x12R\x12&lt;/code&gt;
&lt;code&gt;%\x13R\x13&lt;/code&gt;
&lt;code&gt;%\x14R\x14&lt;/code&gt;
&lt;code&gt;%\x15R\x15&lt;/code&gt;
&lt;code&gt;%\x16R\x16&lt;/code&gt;
&lt;code&gt;%\x17R\x17&lt;/code&gt;
&lt;code&gt;%\x18R\x18&lt;/code&gt;
&lt;code&gt;%\x19R\x19&lt;/code&gt;
&lt;code&gt;%\x1AR\x1A&lt;/code&gt;
&lt;code&gt;%\eR\e&lt;/code&gt;
&lt;code&gt;%\x1CR\x1C&lt;/code&gt;
&lt;code&gt;%\x1DR\x1D&lt;/code&gt;
&lt;code&gt;%\x1ER\x1E&lt;/code&gt;
&lt;code&gt;%\x1FR\x1F&lt;/code&gt;
&lt;code&gt;%&amp;nbsp;R&amp;nbsp;&lt;/code&gt;
&lt;code&gt;%!R!&lt;/code&gt;
&lt;code&gt;%"R"&lt;/code&gt;
&lt;code&gt;%#R#&lt;/code&gt;
&lt;code&gt;%$R$&lt;/code&gt;
&lt;code&gt;%%R%&lt;/code&gt;
&lt;code&gt;%&amp;amp;R&amp;amp;&lt;/code&gt;
&lt;code&gt;%'R'&lt;/code&gt;
&lt;code&gt;%(R)&lt;/code&gt;
&lt;code&gt;%)R)&lt;/code&gt;
&lt;code&gt;%*R*&lt;/code&gt;
&lt;code&gt;%+R+&lt;/code&gt;
&lt;code&gt;%,R,&lt;/code&gt;
&lt;code&gt;%-R-&lt;/code&gt;
&lt;code&gt;%.R.&lt;/code&gt;
&lt;code&gt;%/R/&lt;/code&gt;
&lt;code&gt;%:R:&lt;/code&gt;
&lt;code&gt;%;R;&lt;/code&gt;
&lt;code&gt;%&amp;lt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%=R=&lt;/code&gt;
&lt;code&gt;%&amp;gt;R&amp;gt;&lt;/code&gt;
&lt;code&gt;%?R?&lt;/code&gt;
&lt;code&gt;%@R@&lt;/code&gt;
&lt;code&gt;%[R]&lt;/code&gt;
&lt;code&gt;%\\R\\&lt;/code&gt;
&lt;code&gt;%]R]&lt;/code&gt;
&lt;code&gt;%^R^&lt;/code&gt;
&lt;code&gt;%_R_&lt;/code&gt;
&lt;code&gt;%`R`&lt;/code&gt;
&lt;code&gt;%{R}&lt;/code&gt;
&lt;code&gt;%|R|&lt;/code&gt;
&lt;code&gt;%}R}&lt;/code&gt;
&lt;code&gt;%~R~&lt;/code&gt;
&lt;code&gt;%\x7FR\x7F&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;¹ You might need a &lt;a href="https://en.wikipedia.org/wiki/Hex_editor"&gt;hex editor&lt;/a&gt;, or &lt;a href="https://ruby-doc.org/core/Kernel.html#method-i-eval"&gt;&lt;code&gt;eval&lt;/code&gt;&lt;/a&gt;, to be able to use non-printable string delimiters.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Strings"&gt;String Literals&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Meeting some Locals</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/14-meeting-some-locals.html"/>
    <id>https://idiosyncratic-ruby.com/14-meeting-some-locals.html</id>
    <published>2015-05-14T00:00:00Z</published>
    <updated>2015-05-14T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;There are two very different ways to create local variables in Ruby. You are probably familiar with the classical way:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a, b = "$", "€"
a # =&amp;gt; "$"
b # =&amp;gt; "€"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is simple to understand and looks good. But Ruby would not be Ruby, if there weren't for more obscure ways to assign variables: You could rewrite the previous example to create local variables in a more subtle way:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%r&amp;lt;(?'a'.)(?'b'.)&amp;gt;=~"$" "€"
a # =&amp;gt; "$"
b # =&amp;gt; "€"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="implicit-local-variables-through-regex-matching"&gt;Implicit Local Variables Through Regex Matching&lt;/h2&gt;

&lt;p&gt;Without the fancy obfuscations, the example above would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/(?&amp;lt;a&amp;gt;.)(?&amp;lt;b&amp;gt;.)/ =~ "$€"
a # =&amp;gt; "$"
b # =&amp;gt; "€"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The regex matching operator &lt;code&gt;=~&lt;/code&gt; will create new local variables, when used together with &lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Capturing"&gt;named captures&lt;/a&gt;. However, this is not recommended, because obviously, it violates &lt;strong&gt;PrOWCoFoHuNoMa&lt;/strong&gt; (Principle of writing code for humans, not machines).&lt;/p&gt;

&lt;p&gt;By the way, this will not work, if you swap operands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"$€" =~ /(?&amp;lt;a&amp;gt;.)(?&amp;lt;b&amp;gt;.)/
a # NameError: ...
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="one-more-option-almost"&gt;One More Option (Almost!)&lt;/h2&gt;

&lt;p&gt;In actuality, there is also a third way to set local variables: binding's &lt;code&gt;local_variable_set&lt;/code&gt;, but it does not really count, since you cannot introduce new variables this way:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a = nil
binding.local_variable_set :a, "$"
binding.local_variable_set :b, "€"
a # =&amp;gt; "$"
b # NameError: ...
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="ruby-30-update-right-hand-assignment"&gt;Ruby 3.0 Update: Right Hand Assignment&lt;/h2&gt;

&lt;p&gt;Whoa!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%w[$ €] =&amp;gt; [a, b]
a # =&amp;gt; "$"
b # =&amp;gt; "€"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Read more in &lt;a href="/68-assignments-in-style.html"&gt;Episode 68: Assignments In-Style&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#method-i-3D-7E"&gt;RDoc: Regexp#=~&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Binding.html#method-i-local_variable_set"&gt;RDoc: Binding#local_variable_set&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Slicing Rubies</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/13-slicing-rubies.html"/>
    <id>https://idiosyncratic-ruby.com/13-slicing-rubies.html</id>
    <published>2015-05-13T00:00:00Z</published>
    <updated>2015-05-13T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby puts a lot of effort into its &lt;a href="https://ruby-doc.org/core/Enumerable"&gt;Enumerable&lt;/a&gt; module, offering a lot of different ways of iterating through collections. It is one of the reasons for Ruby's success, but you can also call it idiosyncratic, sometimes. This episode portraits enumerables' three handy &lt;code&gt;slice_*&lt;/code&gt; methods.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="slicing-enumerables"&gt;Slicing Enumerables&lt;/h2&gt;

&lt;p&gt;Slicing lets you divide a collection into sub-collections. Take this array:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a = %w[Ruby in the back-end, React in the front-end]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let's say you want to divide it into smaller arrays. The simplest option would be passing a regex to &lt;code&gt;slice_before&lt;/code&gt; describing where to slice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a.slice_before(/,/).to_a
# =&amp;gt; [["Ruby", "in", "the"], ["back-end,", "React", "in", "the", "front-end"]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A variation of this is method is &lt;code&gt;slice_after&lt;/code&gt;, which puts the separating element into the earlier sub-collection, which makes more sense in this case:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a.slice_after(/,/).to_a
# =&amp;gt; [["Ruby", "in", "the", "back-end,"], ["React", "in", "the", "front-end"]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Slicing uses &lt;a href="https://ruby-doc.org/core/Object.html#method-i-3D-3D-3D"&gt;===&lt;/a&gt; to compare each element with the given separator, so you can pass in a class as well:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["A", "B", 1, "C", "D", 2].slice_after(Integer).to_a
# =&amp;gt; [["A", "B", 1], ["C", "D", 2]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For more complex, and more real-world problems, you will need to pass in a block, like for separating ascending numerical sequences:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;previous = Float::NAN
[0, 2, 3, 4, 6, 7, 9].slice_before{ |current|
  previous, slice = current, current != previous + 1
  slice # is false if previous + 1 is not current -&amp;gt; start new slice
}.to_a
# =&amp;gt; [0], [2, 3, 4], [6, 7], [9]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Keeping around additional variables is a little annoying, but fortunately, we can rewrite the previous example using the newer &lt;code&gt;slice_when&lt;/code&gt; method:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[0, 2, 3, 4, 6, 7, 9].slice_when{ |previous, current|
  current != previous + 1
}.to_a
# =&amp;gt; [0], [2, 3, 4], [6, 7], [9]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Enumerable.html#method-i-slice_after"&gt;RDoc: Enumerable#slice_*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://bugs.ruby-lang.org/issues/9826"&gt;#slice_when discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>More Inspections</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/12-more-inspections.html"/>
    <id>https://idiosyncratic-ruby.com/12-more-inspections.html</id>
    <published>2015-05-12T00:00:00Z</published>
    <updated>2015-05-12T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Some of IRB's command-line options can be called idiosyncratic as well. Take &lt;em&gt;math mode&lt;/em&gt;¹ as an example: It will require the infamous &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/mathn.rb"&gt;mathn&lt;/a&gt; library on start up:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ irb -m
&amp;gt;&amp;gt; Math #=&amp;gt; CMath
&amp;gt;&amp;gt; 3/2 #=&amp;gt; (3/2)
&amp;gt;&amp;gt; !!defined?(Vector) #=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ Math mode actually has been removed in Ruby version 2.5&lt;/p&gt;

&lt;p&gt;And another one surprised me: You can pass custom &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/irb/inspector.rb"&gt;inspectors&lt;/a&gt; to IRB, for example, &lt;em&gt;yaml&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ irb -f --inspect yaml
&amp;gt;&amp;gt; [1,2,3]
=&amp;gt; ---
- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or &lt;em&gt;marshal&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ irb -f --inspect marshal
&amp;gt;&amp;gt; 42
=&amp;gt; i/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But you can also define &lt;em&gt;your own inspectors on the fly&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ irb -f --inspect "{ |r| r.to_s.reverse }"
&amp;gt;&amp;gt; [1,2,3]
=&amp;gt; ]3 ,2 ,1[
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will be eval'd (!) as the block part of a new &lt;code&gt;proc&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;man irb&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blame/trunk/lib/irb/context.rb"&gt;Source: irb/context&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/irb/inspector.rb"&gt;Source: irb/inspectors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Regular Extremism</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/11-regular-extremism.html"/>
    <id>https://idiosyncratic-ruby.com/11-regular-extremism.html</id>
    <published>2015-05-11T00:00:00Z</published>
    <updated>2015-05-11T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;You are here for a collection of 10 advanced features of regular expressions in Ruby!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="regex-conditionals"&gt;Regex Conditionals&lt;/h2&gt;

&lt;p&gt;Regular expressions can have embedded conditionals (&lt;em&gt;if-then-else&lt;/em&gt;) with &lt;code&gt;(?ref)then|else&lt;/code&gt;. "ref" stands for a group reference (number or name of a capture group):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# will match everything if string contains "ä", or only match first two chars
regex = /(.*ä)?(?(1).*|..)/

"Ruby"[regex] #=&amp;gt; "Ru"
"Idiosyncrätic"[regex] #=&amp;gt; "Idiosyncrätic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="keep-expressions"&gt;Keep Expressions&lt;/h2&gt;

&lt;p&gt;The possible ways to &lt;a href="http://www.regular-expressions.info/lookaround.html"&gt;look around&lt;/a&gt; within a regex are:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Syntax&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Example&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;(?=X)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Positive lookahead&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Ruby"[/.(?=b)/]    #=&amp;gt; "u"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;(?!X)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Negative lookahead&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Ruby"[/.(?!u)/]    #=&amp;gt; "u"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;(?&amp;lt;=X)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Positive lookbehind&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Ruby"[/(?&amp;lt;=u)./]   #=&amp;gt; "b"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;(?&amp;lt;!X)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Negative lookbehind&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"Ruby"[/(?&amp;lt;!R|^)./] #=&amp;gt; "b"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;But Ruby also has "Keep Expressions", an additional shortcut syntax to do &lt;em&gt;positive lookbehinds&lt;/em&gt; using &lt;code&gt;\K&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby"[/Ru\Kby/] #=&amp;gt; "by"
"Ruby"[/ru\Kby/] #=&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="character-class-intersections"&gt;Character Class Intersections&lt;/h2&gt;

&lt;p&gt;You can nest character classes and AND-connect them with &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;. Matching all non-vowels here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncratic".scan /[[a-z]&amp;amp;&amp;amp;[^aeiou]]+/
# =&amp;gt; ["d", "syncr", "t", "c"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="regex-sub-expressions"&gt;Regex Sub-Expressions&lt;/h2&gt;

&lt;p&gt;You can recursively apply regex groups again with &lt;code&gt;\g&amp;lt;ref&amp;gt;&lt;/code&gt;. "ref" stands for a group reference (number or name of a capture group). This is different from back-references (&lt;code&gt;\1&lt;/code&gt; .. &lt;code&gt;\9&lt;/code&gt;), which will re-match the already matched string, instead of executing the regex again:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# match any number of sequences of 3 identical chars
regex = /((.)\2{2})\g&amp;lt;1&amp;gt;*/
"aaa"[regex] #=&amp;gt; "aaa"
"abc"[regex] #=&amp;gt; nil
"aaab"[regex] #=&amp;gt; "aaa"
"aaabbb"[regex] #=&amp;gt; "aaabbb"
"aaabbbc"[regex] #=&amp;gt; "aaabbb"
"aaabbbccc"[regex] #=&amp;gt; "aaabbbccc"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="match-characters-that-belong-together"&gt;Match Characters that Belong Together&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;\X&lt;/code&gt; treats combined characters as a single character. See &lt;a href="https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries"&gt;grapheme clusters&lt;/a&gt; for more information.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;string = "R\u{030A}uby"
string[/./] #=&amp;gt; "R"
string[/.../] #=&amp;gt; "R̊u"
string[/\X\X/] #=&amp;gt; "R̊u"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="relative-back-references"&gt;Relative Back-References&lt;/h2&gt;

&lt;p&gt;Back-refs can be relatively referenced from the current position via &lt;code&gt;\k&amp;lt;-n&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby by"[/(R)(u)(by) \k&amp;lt;-1&amp;gt;/] #=&amp;gt; "Ruby by"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="deactivate-backtracking"&gt;Deactivate Backtracking&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.regular-expressions.info/atomic.html"&gt;Atomic groups&lt;/a&gt;, defined via &lt;code&gt;(?&amp;gt;X)&lt;/code&gt;, will always try to match the first of all alternatives:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Rüby"[/R(u*|ü)by/]   #=&amp;gt; "Rüby"
"Rüby"[/R(?&amp;gt;u*|ü)by/] #=&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="turn-on-unicode-matching-for-w-d-s-and-b"&gt;Turn On Unicode-Matching for &lt;code&gt;\w&lt;/code&gt;, &lt;code&gt;\d&lt;/code&gt;, &lt;code&gt;\s&lt;/code&gt;, and &lt;code&gt;\b&lt;/code&gt;&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;"Rüby"[/\w*/] #=&amp;gt; "R"
"Rüby"[/(?u)\w*/] #=&amp;gt; "Rüby"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="continue-matching-at-last-match-position"&gt;Continue Matching at Last Match Position&lt;/h2&gt;

&lt;p&gt;When using a method that matches a regex multiple times against a string (like &lt;code&gt;String#gsub&lt;/code&gt; or &lt;code&gt;String#scan&lt;/code&gt;), you can reference the position of the last match via &lt;code&gt;\G&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"abc1abc22abc333".scan /\Gabc./ # =&amp;gt; ["abc1", "abc2"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="stringsplit-with-capture-groups"&gt;&lt;code&gt;String#split&lt;/code&gt; with Capture Groups&lt;/h2&gt;

&lt;p&gt;The normal way of using &lt;code&gt;String#split&lt;/code&gt; is this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"0-0".split(/-/) #=&amp;gt; ["0", "0"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But if you want to make your code as hard to read as possible, remember that captured groups will be added to the resulting array:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"0-0".split(/(-)/) #=&amp;gt; ["0", "-", "0"]
"0-0".split(/-(?=(.))/) #=&amp;gt; ["0", "0", "0"]
"0-0".split(/(((-)))/) #=&amp;gt; ["0", "-", "-", "-", "0"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html"&gt;RDoc: Regexp&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/k-takata/Onigmo/blob/master/doc/RE"&gt;Onigmo Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Know your Environment</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/10-know-your-environment.html"/>
    <id>https://idiosyncratic-ruby.com/10-know-your-environment.html</id>
    <published>2015-05-10T00:00:00Z</published>
    <updated>2015-05-10T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby's &lt;a href="https://ruby-doc.org/core/ENV.html"&gt;ENV object&lt;/a&gt; gives you access to &lt;a href="https://en.wikipedia.org/wiki/Environment_variable"&gt;environment variables&lt;/a&gt;. It looks like normal &lt;a href="https://ruby-doc.org/core/Hash.html"&gt;Ruby hash&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ENV["TERM"] #=&amp;gt; "xterm"
ENV["SOMETHING"] = "NEW" #=&amp;gt; "NEW"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But this is only the surface. Turns out &lt;code&gt;ENV&lt;/code&gt; is a &lt;em&gt;special object&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ENV.class #=&amp;gt; Object
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is hash-like, but lacks some functionality:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ENV.flatten # NoMethodError
ENV.default = "MyNullObject" # NoMethodError
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Besides this, it behaves like an ordinary hash:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ENV["my_value"] = "something"
ENV[42] = "oops" # not quite: TypeError
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Another thing that is missing: Merging the &lt;code&gt;ENV&lt;/code&gt; hash with another hash:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ENV.merge(Idiosyncratic: "YES") # NoMethodError
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/hash.c"&gt;Source: ENV&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/rubinius/rubinius/blob/master/kernel/common/env.rb"&gt;Rubinius Source: ENV&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Globalization</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/9-globalization.html"/>
    <id>https://idiosyncratic-ruby.com/9-globalization.html</id>
    <published>2015-05-09T00:00:00Z</published>
    <updated>2015-05-09T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;This is an overview of all the special, two-letter (and other) global variables in Ruby, which Ruby &lt;a href="http://www.perlmonks.org/?node_id=353259"&gt;inherited from Perl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the purpose of improving code readability, Ruby comes with &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/English.rb"&gt;English.rb&lt;/a&gt; in its standard library (or &lt;a href="https://github.com/janlelis/Deutsch.rb/blob/main/lib/Deutsch.rb"&gt;Deutsch.rb&lt;/a&gt; as gem), which provides non-cryptic aliases and some documentation.&lt;/p&gt;

&lt;p&gt;Ruby also defines some three-letter global variables that mirror CLI options (&lt;code&gt;$-…&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="types-of-special-global-variables"&gt;Types of Special Global Variables&lt;/h2&gt;

&lt;p&gt;Idiosyncratically, not all special global variables are global:&lt;/p&gt;

&lt;table class="table-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Scope&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;Real global variable&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;thread&lt;/td&gt;
      &lt;td&gt;Thread-global variable: Can have different values in different threads&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;pseudo&lt;/td&gt;
      &lt;td&gt;Looks like a global variable, but is a local variable&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;defunct&lt;/td&gt;
      &lt;td&gt;Not working, anymore (removed from Ruby)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;Variable cannot be set to a new value&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(read-only)&lt;/td&gt;
      &lt;td&gt;Variable cannot be set to a new value, but is an array that is mutable&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="list-of-all-special-global-variables"&gt;List of All Special Global Variables&lt;/h2&gt;

&lt;p&gt;The first table contains all two-letter variables and their aliases:&lt;/p&gt;

&lt;table class="table-12-20-36-14-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Perlish&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;English&lt;/th&gt;
      &lt;th&gt;Short&lt;/th&gt;
      &lt;th&gt;Info&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;$!&lt;/td&gt;
      &lt;td&gt;thread&lt;/td&gt;
      &lt;td&gt;$ERROR_INFO&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Exception.html"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$@&lt;/td&gt;
      &lt;td&gt;thread&lt;/td&gt;
      &lt;td&gt;$ERROR_POSITION&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Exception.html"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$;&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$FIELD_SEPARATOR&lt;/td&gt;
      &lt;td&gt;$FS, $-F¹&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-i-split"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$,&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$OUTPUT_FIELD_SEPARATOR&lt;/td&gt;
      &lt;td&gt;$OFS&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-i-print"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$/&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$INPUT_RECORD_SEPARATOR&lt;/td&gt;
      &lt;td&gt;$RS, $-0¹&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-i-gets"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$\&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$OUTPUT_RECORD_SEPARATOR&lt;/td&gt;
      &lt;td&gt;$ORS&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-i-print"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$.&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$INPUT_LINE_NUMBER&lt;/td&gt;
      &lt;td&gt;$NR&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-i-lineno"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$_&lt;/td&gt;
      &lt;td&gt;pseudo&lt;/td&gt;
      &lt;td&gt;$LAST_READ_LINE&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/IO.html#method-i-gets"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$&amp;gt;&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$DEFAULT_OUTPUT&lt;/td&gt;
      &lt;td&gt;$stdout¹&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://robots.thoughtbot.com/io-in-ruby"&gt;IO in Ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$&amp;lt;&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$DEFAULT_INPUT&lt;/td&gt;
      &lt;td&gt;- (ARGF)&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://www.rubydoc.info/stdlib/core/ARGF"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$$&lt;/td&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;$PROCESS_ID&lt;/td&gt;
      &lt;td&gt;$PID&lt;/td&gt;
      &lt;td&gt;&lt;a href="http://allenlsy.com/working-with-unix-process-in-ruby/"&gt;Unix Processes&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$?&lt;/td&gt;
      &lt;td&gt;thread / read-only&lt;/td&gt;
      &lt;td&gt;$CHILD_STATUS&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Process.html#method-c-wait"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$~&lt;/td&gt;
      &lt;td&gt;pseudo&lt;/td&gt;
      &lt;td&gt;$LAST_MATCH_INFO&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$=&lt;/td&gt;
      &lt;td&gt;defunct&lt;/td&gt;
      &lt;td&gt;$IGNORECASE&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$*&lt;/td&gt;
      &lt;td&gt;(read-only)&lt;/td&gt;
      &lt;td&gt;$ARGV&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="/46-the-art-of-arguments.html"&gt;Explanation&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$&amp;amp;&lt;/td&gt;
      &lt;td&gt;pseudo / read-only&lt;/td&gt;
      &lt;td&gt;$MATCH&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$`&lt;/td&gt;
      &lt;td&gt;pseudo / read-only&lt;/td&gt;
      &lt;td&gt;$PREMATCH&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$'&lt;/td&gt;
      &lt;td&gt;pseudo / read-only&lt;/td&gt;
      &lt;td&gt;$POSTMATCH&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$+&lt;/td&gt;
      &lt;td&gt;pseudo / read-only&lt;/td&gt;
      &lt;td&gt;$LAST_PAREN_MATCH²&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$:&lt;/td&gt;
      &lt;td&gt;(read-only)&lt;/td&gt;
      &lt;td&gt;$LOAD_PATH¹&lt;/td&gt;
      &lt;td&gt;$-I¹&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-hacking-guide.github.io/load.html"&gt;RHG: Loading&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$"&lt;/td&gt;
      &lt;td&gt;(read-only)&lt;/td&gt;
      &lt;td&gt;$LOADED_FEATURES¹&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-hacking-guide.github.io/load.html"&gt;RHG: Loading&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$0&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;$PROGRAM_NAME¹&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Process.html#method-c-argv0"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$1 - $9³&lt;/td&gt;
      &lt;td&gt;pseudo&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Special+global+variables"&gt;RDoc&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$F⁴&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/17-stream-editing.html#auto-splitting-lines"&gt;Auto-Splitting Lines&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Available without requiring English.rb&lt;br /&gt;
² No &lt;em&gt;T&lt;/em&gt;, because it stands for &lt;em&gt;PARENTHESES&lt;/em&gt;, not &lt;em&gt;PARENT&lt;/em&gt;&lt;br /&gt;
³ Starting with Ruby 2.4, &lt;a href="https://twitter.com/JanLelis/status/813836232245575680"&gt;$1 - $9 only get defined when they are currently set&lt;/a&gt;&lt;br /&gt;
⁴ With command-line option &lt;code&gt;-a&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="other-special-global-variables"&gt;Other Special Global Variables&lt;/h3&gt;

&lt;table class="table-20-15-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Info&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;$stdin&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://robots.thoughtbot.com/io-in-ruby"&gt;IO in Ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$stderr&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://robots.thoughtbot.com/io-in-ruby"&gt;IO in Ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$FILENAME&lt;/td&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;The current file being read via ARGF. Same as &lt;a href="http://www.rubydoc.info/stdlib/core/ARGF#filename-instance_method"&gt;ARGF.filename&lt;/a&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$DEBUG, $-d&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html#global-debug-state"&gt;Global Debug States&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$VERBOSE, $-v, $-w&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html#global-debug-state"&gt;Global Debug States&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$-W&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html#global-debug-state"&gt;Global Debug States&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$-p&lt;/td&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/17-stream-editing.html"&gt;Stream Editing&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$-l&lt;/td&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/17-stream-editing.html#specify-line-format"&gt;Specify Line Format&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$-a&lt;/td&gt;
      &lt;td&gt;read-only&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/17-stream-editing.html#auto-splitting-lines"&gt;Auto-Splitting Lines&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;$-i&lt;/td&gt;
      &lt;td&gt;global&lt;/td&gt;
      &lt;td&gt;&lt;a href="https://idiosyncratic-ruby.com/17-stream-editing.html#inplace-editing-files"&gt;Inplace-Editing Files&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  <entry>
    <title>Self Improvement</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/8-self-improvement.html"/>
    <id>https://idiosyncratic-ruby.com/8-self-improvement.html</id>
    <published>2015-05-08T00:00:00Z</published>
    <updated>2015-05-08T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;One of the never-ending style battles in Ruby land is &lt;code&gt;module_function&lt;/code&gt; vs &lt;code&gt;extend self&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Both enable you to define module methods, which can be called not only from instance level, but also from class level. This enables you to make modules that can optionally be &lt;code&gt;include&lt;/code&gt;'d into your current scope, which makes sense if the module contains non-state changing methods ("functions"). Not having to prepend the module name every time you use the functions saves time and looks good:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# class level
Mathematics.calc # =&amp;gt; 42

# instance level
include Mathematics
calc # =&amp;gt; 42
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="modulefunction"&gt;&lt;code&gt;module_function&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;You can achieve this kind of functionality using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Mathematics
  module_function

  def calc
    42
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which is very similar to writing this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Mathematics
  def self.calc
    42
  end

  private

  def calc
    42
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="reflection-observations"&gt;Reflection Observations&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;Mathematics.instance_method(:calc).owner #=&amp;gt; Mathematics
Mathematics.public_method_defined?(:calc) #=&amp;gt; false
Mathematics.private_method_defined?(:calc) #=&amp;gt; true

Mathematics.method(:calc).owner #=&amp;gt; #&amp;lt;Class:Mathematics&amp;gt;
Mathematics.method(:calc).owner.singleton_class? #=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Two things to take away from this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The method will be copied to the class' singleton class&lt;/li&gt;
  &lt;li&gt;The instance method's visibility will become private&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="extend-self"&gt;&lt;code&gt;extend self&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;There is another way to get something very similar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Mathematics
  extend self

  def calc
    42
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using &lt;a href="https://ruby-doc.org/core/Object.html#method-i-extend"&gt;extend&lt;/a&gt;, the module will add its instance methods to the module's very own inheritance chain.&lt;/p&gt;

&lt;h3 id="reflection-observations-1"&gt;Reflection Observations&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;Mathematics.instance_method(:calc).owner #=&amp;gt; Mathematics
Mathematics.public_method_defined?(:calc) #=&amp;gt; true
Mathematics.private_method_defined?(:calc) #=&amp;gt; false

Mathematics.method(:calc).owner #=&amp;gt; Mathematics
Mathematics.method(:calc).owner.singleton_class? #=&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The differences to &lt;code&gt;module_function&lt;/code&gt; are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;No method copying involved&lt;/li&gt;
  &lt;li&gt;No changes to method visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="which-one-to-use"&gt;Which One to Use?&lt;/h2&gt;

&lt;h3 id="advantages-of-extend-self"&gt;Advantages of &lt;code&gt;extend self&lt;/code&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;No method copying: If you want to modify a method's behavior via meta-programming, you only need to do this in one place&lt;/li&gt;
  &lt;li&gt;No side effects, like changing the method's visibility&lt;/li&gt;
  &lt;li&gt;It is not an extra language feature&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="advantages-of-modulefunction"&gt;Advantages of &lt;code&gt;module_function&lt;/code&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;The method name "module_function" describes what it does, so it might be more readable&lt;/li&gt;
  &lt;li&gt;Making included methods private &lt;a href="https://github.com/janlelis/idiosyncratic-ruby.com/commit/7923275d6bfce595c3f0a0f1d9eceaa6dae43800#commitcomment-11553416"&gt;might be desired&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Easier Switching</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/7-easier-switching.html"/>
    <id>https://idiosyncratic-ruby.com/7-easier-switching.html</id>
    <published>2015-05-07T00:00:00Z</published>
    <updated>2015-05-07T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;There is a command-line switch to enable command-line switches:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id="s"&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;Enables some switch parsing for switches after script name but before
any file name arguments (or before a --).  Any switches found there
are removed from ARGV and set the corresponding variable in the script.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this context "corresponding variable" means &lt;em&gt;global variable&lt;/em&gt;. Let's see this in action (the &lt;code&gt;-e&lt;/code&gt; option is for executing the Ruby code that follows in a string):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -se 'p $option'
# nil

$ ruby -se 'p $option' -- -option
# true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="switching-files"&gt;Switching Files&lt;/h2&gt;

&lt;p&gt;You can add command-line options to the &lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;Ruby shebang line&lt;/a&gt;, which makes using the switch feature from the command-line more readable. Create a Ruby file (&lt;code&gt;switch.rb&lt;/code&gt;) and add:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!ruby -s
p $option
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No you can call it like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby switch.rb -option
# true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="caveats"&gt;Caveats!&lt;/h2&gt;

&lt;p&gt;You should be careful, not to trigger the wrong switches:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby switch.rb -LOAD_PATH
switch.rb: $LOAD_PATH is a read-only variable (NameError)

$ ruby switch.rb -0
switch.rb: no implicit conversion of true into String (TypeError)

$ ruby switch.rb -stdout
switch.rb: $stdout must have write method, TrueClass given (TypeError)

$ ruby switch.rb -SAFE
switch.rb: no implicit conversion of true into Integer (TypeError)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;man ruby&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Run Ruby, Run!</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/6-run-ruby-run.html"/>
    <id>https://idiosyncratic-ruby.com/6-run-ruby-run.html</id>
    <published>2015-05-06T00:00:00Z</published>
    <updated>2015-05-06T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;There is a one-liner on the internet that will start a local web server, for serving all the static files in your current directory:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python -m SimpleHTTPServer 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or with Python 3:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python3 -m http.server
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rubyists generally do not want to rely on Python, so there is a Ruby equivalent:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e httpd . -p 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will fire up a very simple server, written in Ruby, using &lt;a href="https://stdgems.org/webrick/"&gt;WEBrick&lt;/a&gt; under the hood!&lt;/p&gt;

&lt;p&gt;It also takes some more options, see at bottom of this post for a listing of available ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please note:&lt;/strong&gt; WEBrick was removed from Ruby in version 3.0&lt;/p&gt;

&lt;p&gt;How does this work and what does it do exactly? First of all, what does &lt;code&gt;ruby -run&lt;/code&gt; mean? The answer might be surprising: It could be rewritten as:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -require "un" -e "httpd" . -p 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;-e&lt;/code&gt; option directly executes the ruby code given, and &lt;code&gt;-r&lt;/code&gt; is the short version of &lt;code&gt;--require&lt;/code&gt;. So it requires "un", which happens to be included in Ruby's standard library¹. It was written by Hirofumi WATANABE (eban), a long-time Ruby contributor and code golf star. &lt;code&gt;un.rb&lt;/code&gt;s goal is to
provide:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Utilities to replace common UNIX commands in Makefiles etc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ The same is possible for &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ubygems.rb"&gt;requiring rubygems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's see, what else is included:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#   ruby -run -e cp             -- [OPTION] SOURCE DEST
#   ruby -run -e ln             -- [OPTION] TARGET LINK_NAME
#   ruby -run -e mv             -- [OPTION] SOURCE DEST
#   ruby -run -e rm             -- [OPTION] FILE
#   ruby -run -e mkdir          -- [OPTION] DIRS
#   ruby -run -e rmdir          -- [OPTION] DIRS
#   ruby -run -e install        -- [OPTION] SOURCE DEST
#   ruby -run -e chmod          -- [OPTION] OCTAL-MODE FILE
#   ruby -run -e touch          -- [OPTION] FILE
#   ruby -run -e wait_writable  -- [OPTION] FILE
#   ruby -run -e mkmf           -- [OPTION] EXTNAME [OPTION]
#   ruby -run -e httpd          -- [OPTION] DocumentRoot
#   ruby -run -e help [COMMAND]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Besides &lt;strong&gt;httpd&lt;/strong&gt;, you mostly get &lt;code&gt;FileUtils&lt;/code&gt; based implementations of common unix tools,: &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;ln&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;rmdir&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;, and &lt;code&gt;touch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are two more commands included, which don't fit into this unix category: &lt;a href="https://ruby-doc.org/stdlib/libdoc/mkmf/rdoc/MakeMakefile.html"&gt;mkmf&lt;/a&gt;, which you can use to create the Makefile for a Ruby C extension and &lt;a href="https://github.com/ruby/ruby/blob/ruby_2_2/lib/un.rb#L233-L264"&gt;wait_writable&lt;/a&gt;, which allows you to continuously try to open a file in writable mode.&lt;/p&gt;

&lt;h2 id="run-reference"&gt;&lt;code&gt;-run&lt;/code&gt; Reference&lt;/h2&gt;

&lt;p&gt;What follows is a reference of all &lt;strong&gt;un&lt;/strong&gt; commands. Also checkout the integrated help with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e help COMMAND
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="copy-files"&gt;Copy Files&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e cp SOURCE DEST [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;SOURCE&lt;/td&gt;
      &lt;td&gt;File to copy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DEST&lt;/td&gt;
      &lt;td&gt;Where to copy the file&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-p&lt;/td&gt;
      &lt;td&gt;Preserve file attributes if possible&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-r&lt;/td&gt;
      &lt;td&gt;Copy directories recursively&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="create-symlink"&gt;Create Symlink&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e ln TARGET LINK_NAME [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;TARGET&lt;/td&gt;
      &lt;td&gt;File to create symlink from&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LINK_NAME&lt;/td&gt;
      &lt;td&gt;Where to create the symlink&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-s&lt;/td&gt;
      &lt;td&gt;Make symbolic links instead of hard links&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-f&lt;/td&gt;
      &lt;td&gt;Overwrite files, which already exists at destination&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="move-file"&gt;Move File&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e mv SOURCE DEST [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;SOURCE&lt;/td&gt;
      &lt;td&gt;File to move&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DEST&lt;/td&gt;
      &lt;td&gt;Where to move the file&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="remove-file"&gt;Remove File&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e rm FILE [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;FILE&lt;/td&gt;
      &lt;td&gt;File(s) to remove&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-f&lt;/td&gt;
      &lt;td&gt;Do nothing if file does not exist&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-r&lt;/td&gt;
      &lt;td&gt;Remove the contents of directories recursively&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="create-directory"&gt;Create Directory&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e mkdir DIRS [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;DIRS&lt;/td&gt;
      &lt;td&gt;Director(y/ies) to create&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-p&lt;/td&gt;
      &lt;td&gt;Don't fail if directory already exists&lt;br /&gt;Create all directories necessary&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="remove-directory"&gt;Remove Directory&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e rmdir DIRS [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;DIRS&lt;/td&gt;
      &lt;td&gt;Director(y/ies) to remove&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-p&lt;/td&gt;
      &lt;td&gt;Also remove directory's ancestors&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="copy-files-and-set-attributes"&gt;Copy Files and Set Attributes&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e install SOURCE DEST [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;SOURCE&lt;/td&gt;
      &lt;td&gt;File to copy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DEST&lt;/td&gt;
      &lt;td&gt;Where to copy the file&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-p&lt;/td&gt;
      &lt;td&gt;Apply access/modification times of SOURCE files to&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;corresponding destination files&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-m&lt;/td&gt;
      &lt;td&gt;Set permission mode (as in chmod), instead of 0755&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="change-file-mode"&gt;Change File Mode&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e chmod OCTAL-MODE FILE [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;OCTAL-MODE&lt;/td&gt;
      &lt;td&gt;File mode to set as octal number&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;FILE&lt;/td&gt;
      &lt;td&gt;File(s) to operate on&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="update-file-timestamp-or-create-empty-file"&gt;Update File Timestamp or Create Empty File&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e touch FILE [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;FILE&lt;/td&gt;
      &lt;td&gt;File(s) to touch&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print executed shell command)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="wait-until-file-gets-writable"&gt;Wait until File gets Writable&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e wait_writable FILE [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;FILE&lt;/td&gt;
      &lt;td&gt;File(s) to wait for&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-n RETRY&lt;/td&gt;
      &lt;td&gt;Count how often to retry&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-w SEC&lt;/td&gt;
      &lt;td&gt;Time to wait between retries (in seconds)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Verbose mode (print access errors)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="make-makefile"&gt;Make Makefile&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e mkmf EXTNAME [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;EXTNAME&lt;/td&gt;
      &lt;td&gt;Extension name&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;-d ARGS&lt;/td&gt;
      &lt;td&gt;Run dir_config&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-h ARGS&lt;/td&gt;
      &lt;td&gt;Run have_header&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-l ARGS&lt;/td&gt;
      &lt;td&gt;Run have_library&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-f ARGS&lt;/td&gt;
      &lt;td&gt;Run have_func&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-v ARGS&lt;/td&gt;
      &lt;td&gt;Run have_var&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-t ARGS&lt;/td&gt;
      &lt;td&gt;Run have_type&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-m ARGS&lt;/td&gt;
      &lt;td&gt;Run have_macro&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-c ARGS&lt;/td&gt;
      &lt;td&gt;Run have_const&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–vendor&lt;/td&gt;
      &lt;td&gt;Install to vendor_ruby&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="serve-static-files-via-http"&gt;Serve Static Files via HTTP&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ ruby -run -e httpd DOCUMENT_ROOT [OPTIONS]
&lt;/code&gt;&lt;/pre&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Argument&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;DOCUMENT_ROOT&lt;/td&gt;
      &lt;td&gt;Directory to serve&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table class="table-30-10-35-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Short&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Example&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;–bind-address=ADDR&lt;/td&gt;
      &lt;td&gt;-b&lt;/td&gt;
      &lt;td&gt;IP address to bind to&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-b 127.0.0.1&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–port=NUM&lt;/td&gt;
      &lt;td&gt;-p&lt;/td&gt;
      &lt;td&gt;Port number to listen on&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-p 8080&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–max-clients=MAX&lt;/td&gt;
      &lt;td&gt;-m&lt;/td&gt;
      &lt;td&gt;Max number of simultaneous clients&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-m 2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–temp-dir=DIR&lt;/td&gt;
      &lt;td&gt;-t&lt;/td&gt;
      &lt;td&gt;Temporary directory to use&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-t /tmp&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–do-not-reverse-lookup&lt;/td&gt;
      &lt;td&gt;-d&lt;/td&gt;
      &lt;td&gt;Disable reverse lookup&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–request-timeout=SECOND&lt;/td&gt;
      &lt;td&gt;-r&lt;/td&gt;
      &lt;td&gt;Request timeout (in seconds)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-r 2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;–http-version=VERSION&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;HTTP version&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;--http-version=1.0&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;-v&lt;/td&gt;
      &lt;td&gt;Start WEBrick in verbose mode&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-v&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/un.rb"&gt;un.rb&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://gist.github.com/willurd/5720255"&gt;Collection of one-liners that start a static server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Constant Shadows</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/5-constant-shadows.html"/>
    <id>https://idiosyncratic-ruby.com/5-constant-shadows.html</id>
    <published>2015-05-05T00:00:00Z</published>
    <updated>2015-05-05T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;The &lt;strong&gt;script lines&lt;/strong&gt; feature is probably the most famous example for idiosyncratic naming in Ruby!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ruby can save all source files you &lt;code&gt;load&lt;/code&gt; or &lt;code&gt;require&lt;/code&gt; as strings. This is useful for debugging utilities, for example, standard library's &lt;a href="https://github.com/ruby/ruby/tree/trunk/lib/debug.rb"&gt;debug&lt;/a&gt; and &lt;a href="https://github.com/ruby/ruby/tree/trunk/lib/tracer.rb"&gt;tracer&lt;/a&gt; both use these capabilities.&lt;/p&gt;

&lt;p&gt;This is possible with the &lt;strong&gt;script lines&lt;/strong&gt; object: It is a Ruby hash that stores all script filenames as keys and the whole file contents as values. It is not activated by default, you have to globally opt-in for it, which is done by &lt;em&gt;initializing it with an empty hash&lt;/em&gt;!&lt;/p&gt;

&lt;h2 id="quiz-how-to-access-this-magical-script-lines-hash"&gt;Quiz: How to Access this Magical Script Lines Hash?&lt;/h2&gt;

&lt;p&gt;A) &lt;code&gt;script_lines&lt;/code&gt;&lt;br /&gt;
B) &lt;code&gt;SCRIPT_LINES&lt;/code&gt;&lt;br /&gt;
C) &lt;code&gt;__SCRIPT_LINES&lt;/code&gt;&lt;br /&gt;
D) &lt;code&gt;__script_lines__&lt;/code&gt;&lt;br /&gt;
E) &lt;code&gt;SCRIPT_LINES__&lt;/code&gt;&lt;br /&gt;
F) &lt;code&gt;Ruby::DebugInfo::SCRIPT_LINES&lt;/code&gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
The answer is E: &lt;code&gt;SCRIPT_LINES__&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;WEIRD. What gives with the trailing underscores? It’s such a big constant that it leaves a two-character shadow!!&lt;/em&gt;&lt;/p&gt;
&lt;a href="http://viewsourcecode.org/why/redhanded/inspect/whoaScript_lines__.html"&gt;&amp;mdash; why&lt;/a&gt;
&lt;/blockquote&gt;

&lt;h2 id="usage-example"&gt;Usage Example&lt;/h2&gt;

&lt;p&gt;It is a best practice to check if it already is defined, because someone else might have already activated it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
require 'abbrev'
SCRIPT_LINES__.size
# =&amp;gt; 1
SCRIPT_LINES__.keys.first
# =&amp;gt; "/home/user/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/abbrev.rb"
SCRIPT_LINES__.values.first.is_a? Array
# =&amp;gt; true
SCRIPT_LINES__.values.first.size
# =&amp;gt; 131
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running &lt;code&gt;puts SCRIPT_LINES__.values.first&lt;/code&gt; will output every line of the file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#--
# Copyright (c) 2001,2003 Akinori MUSHA &amp;lt;knu@iDaemons.org&amp;gt;
#
# All rights reserved.  You can redistribute and/or modify it under
# the same terms as Ruby.
#
# $Idaemons: /home/cvs/rb/abbrev.rb,v 1.2 2001/05/30 09:37:45 knu Exp $
# $RoughId: abbrev.rb,v 1.4 2003/10/14 19:45:42 knu Exp $
# $Id: abbrev.rb 46784 2014-07-11 08:16:05Z hsbt $
#++

##
# Calculates the set of unambiguous abbreviations for a given set of strings.
#
#   require 'abbrev'
#   require 'pp'
#
#   pp Abbrev.abbrev(['ruby'])
#   #=&amp;gt;  {"ruby"=&amp;gt;"ruby", "rub"=&amp;gt;"ruby", "ru"=&amp;gt;"ruby", "r"=&amp;gt;"ruby"}
#
#   pp Abbrev.abbrev(%w{ ruby rules })
#
# _Generates:_
#   { "ruby"  =&amp;gt;  "ruby",
#     "rub"   =&amp;gt;  "ruby",
#     "rules" =&amp;gt;  "rules",
#     "rule"  =&amp;gt;  "rules",
#     "rul"   =&amp;gt;  "rules" }
#
# It also provides an array core extension, Array#abbrev.
#
#   pp %w{ summer winter }.abbrev
#
# _Generates:_
#   { "summer"  =&amp;gt; "summer",
#     "summe"   =&amp;gt; "summer",
#     "summ"    =&amp;gt; "summer",
#     "sum"     =&amp;gt; "summer",
#     "su"      =&amp;gt; "summer",
#     "s"       =&amp;gt; "summer",
#     "winter"  =&amp;gt; "winter",
#     "winte"   =&amp;gt; "winter",
#     "wint"    =&amp;gt; "winter",
#     "win"     =&amp;gt; "winter",
#     "wi"      =&amp;gt; "winter",
#     "w"       =&amp;gt; "winter" }

module Abbrev

  # Given a set of strings, calculate the set of unambiguous abbreviations for
  # those strings, and return a hash where the keys are all the possible
  # abbreviations and the values are the full strings.
  #
  # Thus, given +words+ is "car" and "cone", the keys pointing to "car" would
  # be "ca" and "car", while those pointing to "cone" would be "co", "con", and
  # "cone".
  #
  #   require 'abbrev'
  #
  #   Abbrev.abbrev(%w{ car cone })
  #   #=&amp;gt; {"ca"=&amp;gt;"car", "con"=&amp;gt;"cone", "co"=&amp;gt;"cone", "car"=&amp;gt;"car", "cone"=&amp;gt;"cone"}
  #
  # The optional +pattern+ parameter is a pattern or a string. Only input
  # strings that match the pattern or start with the string are included in the
  # output hash.
  #
  #   Abbrev.abbrev(%w{car box cone crab}, /b/)
  #   #=&amp;gt; {"box"=&amp;gt;"box", "bo"=&amp;gt;"box", "b"=&amp;gt;"box", "crab" =&amp;gt; "crab"}
  #
  #   Abbrev.abbrev(%w{car box cone}, 'ca')
  #   #=&amp;gt; {"car"=&amp;gt;"car", "ca"=&amp;gt;"car"}
  def abbrev(words, pattern = nil)
    table = {}
    seen = Hash.new(0)

    if pattern.is_a?(String)
      pattern = /\A#{Regexp.quote(pattern)}/  # regard as a prefix
    end

    words.each do |word|
      next if word.empty?
      word.size.downto(1) { |len|
        abbrev = word[0...len]

        next if pattern &amp;amp;&amp;amp; pattern !~ abbrev

        case seen[abbrev] += 1
        when 1
          table[abbrev] = word
        when 2
          table.delete(abbrev)
        else
          break
        end
      }
    end

    words.each do |word|
      next if pattern &amp;amp;&amp;amp; pattern !~ word

      table[word] = word
    end

    table
  end

  module_function :abbrev
end

class Array
  # Calculates the set of unambiguous abbreviations for the strings in +self+.
  #
  #   require 'abbrev'
  #   %w{ car cone }.abbrev
  #   #=&amp;gt; {"car"=&amp;gt;"car", "ca"=&amp;gt;"car", "cone"=&amp;gt;"cone", "con"=&amp;gt;"cone", "co"=&amp;gt;"cone"}
  #
  # The optional +pattern+ parameter is a pattern or a string. Only input
  # strings that match the pattern or start with the string are included in the
  # output hash.
  #
  #   %w{ fast boat day }.abbrev(/^.a/)
  #   #=&amp;gt; {"fast"=&amp;gt;"fast", "fas"=&amp;gt;"fast", "fa"=&amp;gt;"fast", "day"=&amp;gt;"day", "da"=&amp;gt;"day"}
  #
  #   Abbrev.abbrev(%w{car box cone}, "ca")
  #   #=&amp;gt; {"car"=&amp;gt;"car", "ca"=&amp;gt;"car"}
  #
  # See also Abbrev.abbrev
  def abbrev(pattern = nil)
    Abbrev::abbrev(self, pattern)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="memory-impact"&gt;Memory Impact&lt;/h2&gt;

&lt;p&gt;Only use this for debugging purpose, since a lot of strings get loaded into your memory. This is a comparison loading ActiveSupport with and without script lines:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'active_support/all'
puts "#{`ps -o rss -p #{Process.pid}`.strip.split.last.to_i / 1024.0} MB"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Result: 16.421875 MB&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SCRIPT_LINES__ = {}
require 'active_support/all'
puts "#{`ps -o rss -p #{Process.pid}`.strip.split.last.to_i / 1024.0} MB"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Result: 19.85546875 MB&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/ruby_2_2/parse.y#L5446-L5460"&gt;Source: SCRIPT_LINES__&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/jruby/jruby/blob/9.0.0.0.pre2/core/src/main/java/org/jruby/parser/Parser.java#L176-L189"&gt;JRuby Source: SCRIPT_LINES__&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://stackoverflow.com/questions/7220896/get-current-ruby-process-memory-usage"&gt;The memory profiling one-liner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>What the Pack?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/4-what-the-pack.html"/>
    <id>https://idiosyncratic-ruby.com/4-what-the-pack.html</id>
    <published>2015-05-04T00:00:00Z</published>
    <updated>2015-05-04T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href="#a--arbitrary-string"&gt;a&lt;/a&gt;
&lt;a href="#a--arbitrary-string-clean-null-bytes"&gt;A&lt;/a&gt;
&lt;a href="#b--bit-string-little-endian"&gt;b&lt;/a&gt;
&lt;a href="#b--bit-string-big-endian"&gt;B&lt;/a&gt;
&lt;a href="#c--a-signed-integer-per-byte"&gt;c&lt;/a&gt;
&lt;a href="#c--an-unsigned-integer-per-byte"&gt;C&lt;/a&gt;
&lt;a href="#d-d--a-float-double-precision-native-endian"&gt;d&lt;/a&gt;
&lt;a href="#d-d--a-float-double-precision-native-endian"&gt;D&lt;/a&gt;
&lt;a href="#e--a-float-single-precision-little-endian"&gt;e&lt;/a&gt;
&lt;a href="#e--a-float-double-precision-little-endian"&gt;E&lt;/a&gt;
&lt;a href="#f--a-float-single-precision-native-endian"&gt;F&lt;/a&gt;
&lt;a href="#g--a-float-single-precision-big-endian"&gt;g&lt;/a&gt;
&lt;a href="#g--a-float-double-precision-big-endian"&gt;G&lt;/a&gt;
&lt;a href="#h--hex-string-little-endian"&gt;h&lt;/a&gt;
&lt;a href="#h--hex-string-big-endian"&gt;H&lt;/a&gt;
&lt;a href="#l--a-signed-integer-per-4-bytes"&gt;l&lt;/a&gt;
&lt;a href="#l--an-unsigned-integer-per-4-bytes"&gt;L&lt;/a&gt;
&lt;a href="#m--base64-encoding-rfc-2045"&gt;m&lt;/a&gt;
&lt;a href="#m0--base64-encoding-rfc-4648"&gt;m0&lt;/a&gt;
&lt;a href="#m--quoted-printable--mime-encoding-rfc2045"&gt;M&lt;/a&gt;
&lt;a href="#n--an-unsigned-integer-per-2-bytes-big-endian-similar-to-s"&gt;n&lt;/a&gt;
&lt;a href="#n--a-signed-integer-per-4-bytes-big-endian-similar-to-l"&gt;N&lt;/a&gt;
&lt;a href="#p--pointer-to-null-terminated-string"&gt;p&lt;/a&gt;
&lt;a href="#p--pointer-to-fixed-length-string"&gt;P&lt;/a&gt;
&lt;a href="#q--a-signed-integer-per-8-bytes"&gt;q&lt;/a&gt;
&lt;a href="#q--an-unsigned-integer-per-8-bytes"&gt;Q&lt;/a&gt;
&lt;a href="#s--a-signed-integer-per-2-bytes"&gt;s&lt;/a&gt;
&lt;a href="#s--an-unsigned-integer-per-2-bytes"&gt;S&lt;/a&gt;
&lt;a href="#u--uu-encoding"&gt;u&lt;/a&gt;
&lt;a href="#u--utf-8-characters"&gt;U&lt;/a&gt;
&lt;a href="#v--an-unsigned-integer-per-2-bytes-little-endian-similar-to-s"&gt;v&lt;/a&gt;
&lt;a href="#v--a-signed-integer-per-4-bytes-little-endian-similar-to-l"&gt;V&lt;/a&gt;
&lt;a href="#w--ber-compression"&gt;w&lt;/a&gt;
&lt;a href="#x--skip-byte-fill-with-null-byte-when-packing"&gt;x&lt;/a&gt;
&lt;a href="#x--move-a-byte-back"&gt;X&lt;/a&gt;
&lt;a href="#z--null-terminated-string"&gt;Z&lt;/a&gt;
&lt;a href="#go-to-position"&gt;@&lt;/a&gt;
&lt;a href="#integer-directives"&gt;!&lt;/a&gt;
&lt;a href="#pack-template-format"&gt;*&lt;/a&gt;
&lt;a href="#a-note-on-byte-order-big-endian-vs-little-endian"&gt;&amp;lt;&lt;/a&gt;
&lt;a href="#a-note-on-byte-order-big-endian-vs-little-endian"&gt;&amp;gt;&lt;/a&gt;
&lt;a href="#integer-directives"&gt;_&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby comes equipped with a powerful option for low level string manipulation: &lt;code&gt;String#unpack&lt;/code&gt; and its counter part &lt;code&gt;Array#pack&lt;/code&gt;. Today's episode takes a closer look.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The general way how &lt;code&gt;String#unpack&lt;/code&gt; is used is this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"a string".unpack("pack template with directives")
# =&amp;gt; [...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The string contains some data in a specific format, which you "unpack" using a format specification. The format specification is defined in the pack template. The result is an array that contains the same data (or parts of it), but in a different representation. Take a look at this very simple example, which converts a four-letter ASCII string into its integer based byte representation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby".unpack("C C C C")
# =&amp;gt; [82, 117, 98, 121]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;Array#pack&lt;/code&gt; works the other way around, so if you have the integer byte representation, it will convert it to real bytes in a string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[82, 117, 98, 121].pack("C C C C")
# =&amp;gt; "Ruby"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="pack-template-format"&gt;Pack Template Format&lt;/h2&gt;

&lt;p&gt;The format of the pack template (&lt;code&gt;"C C C C"&lt;/code&gt; in the example above) might be unfamiliar, but it is not too complicated. It is a series of letters that describe how to interpret the next bytes in the string you are operating on. A letter is called "directive". Each directive has a different meaning, see below for a complete list of available directives. &lt;code&gt;C&lt;/code&gt; essentially means: One integer byte value.&lt;/p&gt;

&lt;p&gt;A directive can be followed by a number, how often it should be applied. So you could rewrite the above code to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby".unpack("C4")
# =&amp;gt; [82, 117, 98, 121]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You don't need to read the complete string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby".unpack("C2")
# =&amp;gt; [82, 117]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instead of using a number, it is possible to use &lt;code&gt;*&lt;/code&gt;, which denotes that the directive should be applied as often as possible:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Ruby".unpack("C*")
# =&amp;gt; [82, 117, 98, 121]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Every character that is not a directive, a digit or &lt;code&gt;*&lt;/code&gt; will be ignored. This is useful to make a pack template more readable, by separating directives with spaces.&lt;/p&gt;

&lt;p&gt;What follows is a list of all directives and how to use them.&lt;/p&gt;

&lt;h2 id="integer-directives"&gt;Integer Directives&lt;/h2&gt;

&lt;p&gt;These will all unpack the bytes of a string to an array of integers. One of these integers represents one or more bytes. You have different modes that differ in the number of bytes each integer represents:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Directive&lt;/th&gt;
      &lt;th&gt;Size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;char&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;I!&lt;/code&gt; or &lt;code&gt;I_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;int&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;S!&lt;/code&gt; or &lt;code&gt;S_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;short&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;L!&lt;/code&gt; or &lt;code&gt;L_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;long&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Q!&lt;/code&gt; or &lt;code&gt;Q_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;long long&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;J!&lt;/code&gt; or &lt;code&gt;J_&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;pointer width&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Except for &lt;em&gt;char&lt;/em&gt; (which is always one byte), it depends on your operating system, how many bytes each of this modes actually reads. So if your operating system defines &lt;em&gt;short&lt;/em&gt; as 2 bytes, you will get an array that represents every group of two bytes as an integer value:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\x01\x00\x02\x00".unpack("S!*") #=&amp;gt; [1, 2]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or the other way around:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[1, 2].pack("S!*") # =&amp;gt; "\x01\x00\x02\x00"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you do not want to depend on what byte sizes you operating system defines, you can omit the &lt;code&gt;!&lt;/code&gt; and it will use a fixed byte size (the exceptions being &lt;em&gt;int&lt;/em&gt; and &lt;em&gt;pointer width&lt;/em&gt;, which will always use their native size).&lt;/p&gt;

&lt;h3 id="c--an-unsigned-integer-per-byte"&gt;C | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per Byte&lt;/h3&gt;

&lt;p&gt;Range: 0 to 255&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("C*")
# =&amp;gt; [73, 100, 105, 111, 115, 121, 110, 99, 114, 195, 164, 116, 105, 99]

[73, 100, 105, 111, 115, 121, 110, 99, 114, 195, 164, 116, 105, 99].pack("C*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that &lt;code&gt;Array#pack&lt;/code&gt; will not set the string's encoding for you, because it has no way to know.&lt;/p&gt;

&lt;h3 id="c--a-signed-integer-per-byte"&gt;c | A Signed &lt;code&gt;Integer&lt;/code&gt; per Byte&lt;/h3&gt;

&lt;p&gt;Range: -128 to 127&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("c*")
# =&amp;gt; [73, 100, 105, 111, 115, 121, 110, 99, 114, -61, -92, 116, 105, 99]

[73, 100, 105, 111, 115, 121, 110, 99, 114, -61, -92, 116, 105, 99].pack('c*')
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="s--an-unsigned-integer-per-2-bytes"&gt;S | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 2 Bytes&lt;/h3&gt;

&lt;p&gt;Range: 0 to 65535&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("S*")
# =&amp;gt; [25673, 28521, 31091, 25454, 50034, 29860, 25449]

[25673, 28521, 31091, 25454, 50034, 29860, 25449].pack("S*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="s--a-signed-integer-per-2-bytes"&gt;s | A Signed &lt;code&gt;Integer&lt;/code&gt; per 2 Bytes&lt;/h3&gt;

&lt;p&gt;Range: -32768 to 32767&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("s*")
# =&amp;gt; [25673, 28521, 31091, 25454, -15502, 29860, 25449]

[25673, 28521, 31091, 25454, -15502, 29860, 25449].pack("s*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="l--an-unsigned-integer-per-4-bytes"&gt;L | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 4 Bytes&lt;/h3&gt;

&lt;p&gt;Range: 0 to 4294967296&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("L*")
# =&amp;gt; [1869177929, 1668184435, 1956954994]

[1869177929, 1668184435, 1956954994].pack("L*")
# =&amp;gt; "Idiosyncr\xC3\xA4t"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note: The byte size in this example is 14, which is not dividable by 4, so it will ignore the last 2 bytes. If you need them, you could use a different template like: &lt;code&gt;"L* C*"&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="l--a-signed-integer-per-4-bytes"&gt;l | A Signed &lt;code&gt;Integer&lt;/code&gt; per 4 Bytes&lt;/h3&gt;

&lt;p&gt;Range: -2147483648 to 2147483647&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("l*")
# =&amp;gt; [1869177929, 1668184435, 1956954994]

[1869177929, 1668184435, 1956954994].pack("l*")
# =&amp;gt; "Idiosyncr\xC3\xA4t"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="q--an-unsigned-integer-per-8-bytes"&gt;Q | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 8 Bytes&lt;/h3&gt;

&lt;p&gt;Range: 0 to 18446744073709551616&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("Q*")
# =&amp;gt; [7164797593890415689]

[7164797593890415689].pack("Q*")
# =&amp;gt; "Idiosync"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="q--a-signed-integer-per-8-bytes"&gt;q | A Signed &lt;code&gt;Integer&lt;/code&gt; per 8 Bytes&lt;/h3&gt;

&lt;p&gt;Range: -9223372036854775808 to 9223372036854775807&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("q*")
# =&amp;gt; [7164797593890415689]

[7164797593890415689].pack("q*")
# =&amp;gt; "Idiosync"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="a-note-on-byte-order-big-endian-vs-little-endian"&gt;A Note on Byte Order (Big-Endian vs. Little-Endian)&lt;/h3&gt;

&lt;p&gt;All the previous examples used the native byte order, which means, that the operating system defines, if the more significant bytes come first (little-endian) or last (big-endian). You will find more information about &lt;a href="https://en.wikipedia.org/wiki/Endianness"&gt;"endianness" on wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don't want to rely on your operating system to define byte order, you can add &lt;code&gt;&amp;gt;&lt;/code&gt; for big-endianness or &lt;code&gt;&amp;lt;&lt;/code&gt; for little-endianness to your template's directives:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"\x01\x00\x02\x00".unpack("S&amp;lt;*") #=&amp;gt; [1, 2]
"\x01\x00\x02\x00".unpack("S&amp;gt;*") #=&amp;gt; [256, 512]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="integer-shortcut-directives"&gt;Integer Shortcut Directives&lt;/h2&gt;

&lt;h3 id="n--an-unsigned-integer-per-2-bytes-big-endian-similar-to-s"&gt;n | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 2 Bytes, Big-Endian (Similar to &lt;code&gt;S&amp;gt;&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Range: 0 to 65535&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("n*")
# =&amp;gt; [18788, 26991, 29561, 28259, 29379, 42100, 26979]

[18788, 26991, 29561, 28259, 29379, 42100, 26979].pack("n*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="n--an-unsigned-integer-per-4-bytes-big-endian-similar-to-l"&gt;N | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 4 Bytes, Big-Endian (Similar to &lt;code&gt;L&amp;gt;&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Range: 0 to 4294967296&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("N*")
# =&amp;gt; [1231317359, 1937337955, 1925424244]

[1231317359, 1937337955, 1925424244].pack("N*")
# =&amp;gt; "Idiosyncr\xC3\xA4t"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="v--an-unsigned-integer-per-2-bytes-little-endian-similar-to-s"&gt;v | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 2 Bytes, Little-Endian (Similar to &lt;code&gt;S&amp;lt;&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Range: 0 to 65535&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("v*")
# =&amp;gt; [25673, 28521, 31091, 25454, 50034, 29860, 25449]

[25673, 28521, 31091, 25454, 50034, 29860, 25449].pack("v*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="v--an-unsigned-integer-per-4-bytes-little-endian-similar-to-l"&gt;V | An Unsigned &lt;code&gt;Integer&lt;/code&gt; per 4 Bytes, Little-Endian (Similar to &lt;code&gt;L&amp;lt;&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Range: 0 to 4294967296&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("V*")
# =&amp;gt; [1869177929, 1668184435, 1956954994]

[1869177929, 1668184435, 1956954994].pack("V*")
# =&amp;gt; "Idiosyncr\xC3\xA4t"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="integer-encoding-directives"&gt;Integer Encoding Directives&lt;/h2&gt;

&lt;h3 id="u--utf-8-characters"&gt;U | UTF-8 Characters&lt;/h3&gt;

&lt;p&gt;This will convert the string to &lt;a href="https://en.wikipedia.org/wiki/Code_point"&gt;unicode code points.&lt;/a&gt;. Note that while it throws ArgumentError for &lt;a href="https://github.com/janlelis/unibits/#utf-8-1"&gt;invalid encodings&lt;/a&gt;, it will happily decode surrogates and too large codepoint values.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ɔıʇɐɹɔuʎsoıpı".unpack("U*")
# =&amp;gt; [596, 305, 647, 592, 633, 596, 117, 654, 115, 111, 305, 112, 305]

[596, 305, 647, 592, 633, 596, 117, 654, 115, 111, 305, 112, 305].pack("U*")
# =&amp;gt; "ɔıʇɐɹɔuʎsoıpı"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="w--ber-compression"&gt;w | BER Compression&lt;/h3&gt;

&lt;p&gt;See &lt;a href="https://en.wikipedia.org/wiki/X.690#BER_encoding"&gt;wikipedia on X.690&lt;/a&gt; for an explanation.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("w*")
# =&amp;gt; [73, 100, 105, 111, 115, 121, 110, 99, 114, 1102452, 105, 99]

[73, 100, 105, 111, 115, 121, 110, 99, 114, 1102452, 105, 99].pack("w*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="float-directives"&gt;Float Directives&lt;/h2&gt;

&lt;p&gt;The following directives will interpret bytes as &lt;a href="https://en.wikipedia.org/wiki/IEEE_floating_point"&gt;Floats.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="d-d--a-float-double-precision-native-endian"&gt;D, d | A &lt;code&gt;Float&lt;/code&gt; (Double Precision, Native-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("D*")
# =&amp;gt; "333333\xF3?333333\v@"

"333333\xF3?333333\v@".unpack("D*")
#=&amp;gt; [1.2, 3.4]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="f--a-float-single-precision-native-endian"&gt;F | A &lt;code&gt;Float&lt;/code&gt; (Single Precision, Native-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("F*")
# =&amp;gt; "\x9A\x99\x99?\x9A\x99Y@"

"\x9A\x99\x99?\x9A\x99Y@".unpack("F*")
# =&amp;gt; [1.2000000476837158, 3.4000000953674316]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="e--a-float-double-precision-little-endian"&gt;E | A &lt;code&gt;Float&lt;/code&gt; (Double Precision, Little-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("E*")
# =&amp;gt; "333333\xF3?333333\v@"

"333333\xF3?333333\v@".unpack("E*")
#=&amp;gt; [1.2, 3.4]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="e--a-float-single-precision-little-endian"&gt;e | A &lt;code&gt;Float&lt;/code&gt; (Single Precision, Little-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("e*")
# =&amp;gt; "\x9A\x99\x99?\x9A\x99Y@"

"\x9A\x99\x99?\x9A\x99Y@".unpack("e*")
# =&amp;gt; [1.2000000476837158, 3.4000000953674316]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="g--a-float-double-precision-big-endian"&gt;G | A &lt;code&gt;Float&lt;/code&gt; (Double Precision, Big-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("G*")
# =&amp;gt; "?\xF3333333@\v333333"

"?\xF3333333@\v333333".unpack("G*")
#=&amp;gt; [1.2, 3.4]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="g--a-float-single-precision-big-endian"&gt;g | A &lt;code&gt;Float&lt;/code&gt; (Single Precision, Big-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[1.2, 3.4].pack("g*")
# =&amp;gt; "?\x99\x99\x9A@Y\x99\x9A"

"\x9A\x99\x99?\x9A\x99Y@".unpack("g*")
# =&amp;gt; [1.2000000476837158, 3.4000000953674316]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="string-directives"&gt;String Directives&lt;/h2&gt;

&lt;p&gt;String directives are more confusing in the regard that input and output of a &lt;code&gt;pack&lt;/code&gt; or &lt;code&gt;unpack&lt;/code&gt; operation are both strings, one of them being wrapped as a single argument in an array. The rule to remember here is that the string representation is something encoded (which might be saved or sent over the wire), while the string-in-an-array format represents the data in a readable format.&lt;/p&gt;

&lt;h3 id="a--arbitrary-string"&gt;a | Arbitrary String&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic".unpack("a20")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Fills with null bytes when packing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("a20")
# =&amp;gt; "Idiosyncr\xC3\xA4tic\x00\x00\x00\x00\x00\x00"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="a--arbitrary-string-clean-null-bytes"&gt;A | Arbitrary String (Clean Null Bytes)&lt;/h3&gt;

&lt;p&gt;Like &lt;strong&gt;a&lt;/strong&gt;, but removes trailing spaces and null bytes when unpacking:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic    \0 ".unpack("A20")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Like &lt;strong&gt;a&lt;/strong&gt;, but replaces null bytes with spaces when packing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("A20")
# =&amp;gt; "Idiosyncr\xC3\xA4tic      "
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="z--null-terminated-string"&gt;Z | Null-Terminated String&lt;/h3&gt;

&lt;p&gt;Like &lt;strong&gt;a&lt;/strong&gt;, but unpacking will not read further than null bytes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrätic\0R".unpack("Z20")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Like &lt;strong&gt;a&lt;/strong&gt;, but packing will add a null byte to the end, if used with &lt;code&gt;*&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("Z*")
# =&amp;gt; "Idiosyncr\xC3\xA4tic\x00"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="string-base-conversion-directives"&gt;String Base Conversion Directives&lt;/h2&gt;

&lt;h3 id="b--bit-string-big-endian"&gt;B | Bit String (Big-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"abc".unpack("B*")
# =&amp;gt; ["011000010110001001100011"]

["011000010110001001100011"].pack("B*")
# =&amp;gt; "abc"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="b--bit-string-little-endian"&gt;b | Bit String (Little-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"abc".unpack("b*")
# =&amp;gt; ["100001100100011011000110"]

["100001100100011011000110"].pack("b*")
# =&amp;gt; "abc"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="h--hex-string-big-endian"&gt;H | Hex String (Big-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"xyz".unpack("H*")
# =&amp;gt; ["78797a"]

["78797a"].pack("H*")
# =&amp;gt; "xyz"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="h--hex-string-little-endian"&gt;h | Hex String (Little-Endian)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"xyz".unpack("h*")
# =&amp;gt; ["8797a7"]

["8797a7"].pack("h*")
# =&amp;gt; "xyz"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="string-encoding-directives"&gt;String Encoding Directives&lt;/h2&gt;

&lt;p&gt;Pack supports a few encoding conversion directives. Note that they are idiosyncratic, since they don't take a count option.&lt;/p&gt;

&lt;h3 id="u--uu-encoding"&gt;u | UU-Encoding&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Uuencoding"&gt;Unix-to-Unix Encoding.&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("u")
# =&amp;gt; ".261I;W-Y;F-RPZ1T:6,`\n"

".261I;W-Y;F-RPZ1T:6,`\n".unpack("u")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="m--quoted-printable--mime-encoding-rfc2045"&gt;M | Quoted-Printable / MIME Encoding (RFC2045)&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Quoted-printable"&gt;Quoted-Printable.&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("M")
# =&amp;gt; "Idiosyncr=C3=A4tic=\n"

"Idiosyncr=C3=A4tic=\n".unpack("M")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="m--base64-encoding-rfc-2045"&gt;m | Base64 Encoding (RFC 2045)&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Base64"&gt;Base64.&lt;/a&gt; Ruby's standard library also contains a &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/base64.rb#L23"&gt;Base64 wrapper.&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("m")
# =&amp;gt; "SWRpb3N5bmNyw6R0aWM=\n"

"SWRpb3N5bmNyw6R0aWM=\n".unpack("m")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="m0--base64-encoding-rfc-4648"&gt;m0 | Base64 Encoding (RFC 4648)&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Base64#RFC_4648"&gt;Base64.&lt;/a&gt; This will not add a new-line at the end.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack("m0")
# =&amp;gt; "SWRpb3N5bmNyw6R0aWM="

"SWRpb3N5bmNyw6R0aWM=".unpack("m0")
# =&amp;gt; ["Idiosyncr\xC3\xA4tic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="pointer-directives"&gt;Pointer Directives&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Pointer_%28computer_programming%29"&gt;Pointer&lt;/a&gt; inspection. If you want to understand how to use these, you should read &lt;a href="https://github.com/ruby/ruby/blob/trunk/pack.c"&gt;pack's source.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="p--pointer-to-fixed-length-string"&gt;P | Pointer to Fixed-Length String&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack('P*')
# =&amp;gt; "\xC0\xDA\x04,.\x7F\x00\x00"

["Idiosyncrätic"].pack('P*').unpack("P*")
# =&amp;gt; ["Idiosync"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="p--pointer-to-null-terminated-string"&gt;p | Pointer to Null-Terminated String&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;["Idiosyncrätic"].pack('p*')
# =&amp;gt; "\xB8\xF8\x03\x1C.\x7F\x00\x00"

["Idiosyncrätic"].pack('p*').unpack("p*")
# =&amp;gt; ["Idiosyncrätic"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="positional-directives"&gt;Positional Directives&lt;/h2&gt;

&lt;p&gt;You can jump around the current byte position while processing the data. This enables you to read data twice or ignore some data in the middle.&lt;/p&gt;

&lt;h3 id="go-to-position"&gt;@ | Go to Position&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"abc".unpack("H* @0B*")
#=&amp;gt; ["616263", "011000010110001001100011"]

["ffffff", "011000010110001001100011"].pack("H* @0B*")
# =&amp;gt; "abc"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; There was a security issue with this feature where attackers would pass too large numbers to &lt;code&gt;@&lt;/code&gt;. See the &lt;a href="https://www.ruby-lang.org/en/news/2018/03/28/buffer-under-read-unpack-cve-2018-8778/"&gt;CVE-2018-8778 announcement&lt;/a&gt; for more info.&lt;/p&gt;

&lt;h3 id="x--move-a-byte-back"&gt;X | Move a Byte Back&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"Idiosyncrä".unpack("C* X c*")
# =&amp;gt; [73, 100, 105, 111, 115, 121, 110, 99, 114, 195, 164, -92]

[73, 100, 105, 111, 115, 121, 110, 99, 114, 195, 164, -92].pack("C* X c*")
# =&amp;gt; "Idiosyncr\xC3\xA4"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="x--skip-byte-fill-with-null-byte-when-packing"&gt;x | Skip Byte (Fill with Null Byte when Packing)&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;"abc".unpack("C x C")
# =&amp;gt; [97, 99]

[97, 99].pack("C x C")
# =&amp;gt; "a\x00c"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="new-features-in-ruby-24"&gt;New Features in Ruby 2.4&lt;/h2&gt;

&lt;h3 id="stringunpack1"&gt;&lt;code&gt;String#unpack1&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;When you &lt;code&gt;unpack&lt;/code&gt; something, the resulting object will always be an array. Often, this array consists of only single element, which you are interested in (for example, this is the case for all &lt;a href="#string-directives"&gt;String Encoding Directives&lt;/a&gt;). This is why the &lt;code&gt;unpack1&lt;/code&gt; has been introduced - It will return the first element directly:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"ℜ".unpack1("U")
# =&amp;gt; 8476
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="buffer-option-for-arraypack"&gt;&lt;code&gt;buffer:&lt;/code&gt; Option for &lt;code&gt;Array#pack&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;This keyword argument for &lt;code&gt;Array#pack&lt;/code&gt; lets you use an existing (already allocated) string object as the result object¹²³:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "fiddle"

# Initialize a string we will use later
a = "Idiosyncrätic Ruby"
Fiddle::Pointer[a]
# =&amp;gt; #&amp;lt;Fiddle::Pointer:0x00000001e79af0 ptr=0x00000001c3b270
#      size=18 free=0x00000000000000&amp;gt;

# Pack something, the normal way
b = [1,2,3,4].pack("C*")
# =&amp;gt; "\x01\x02\x03\x04"
Fiddle::Pointer[b]
# =&amp;gt; #&amp;lt;Fiddle::Pointer:0x00000001ef51a0 ptr=0x00000001fc7980
#      size=4 free=0x00000000000000&amp;gt;

# Pack something, using an existing buffer
# It appends the result to the existing string object (same memory address)
c = [1,2,3,4].pack("C*", buffer: a)
# =&amp;gt; "Idiosyncratic Ruby\u0001\u0002\u0003\u0004"
Fiddle::Pointer[c]
# =&amp;gt; #&amp;lt;Fiddle::Pointer:0x00000001c314d0 ptr=0x00000001c3b270
#      size=22 free=0x00000000000000&amp;gt;

a == c
# =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¹ Only if the string's capacity is enough to fit the result&lt;br /&gt;
² You can manually create string buffers of a specific size with another new keyword option:&lt;br /&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-c-new"&gt;&lt;code&gt;String.new(..., capacity: ...)&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
³ See the &lt;a href="https://ruby-doc.org/core/Array.html#method-i-pack"&gt;RDoc&lt;/a&gt; for more info how the buffer argument is handled exactly&lt;/p&gt;

&lt;h2 id="new-features-in-ruby-32"&gt;New Features in Ruby 3.2&lt;/h2&gt;

&lt;h3 id="offset-option-for-stringunpack--stringunpack1"&gt;&lt;code&gt;offset:&lt;/code&gt; Option for &lt;code&gt;String#unpack&lt;/code&gt; / &lt;code&gt;String#unpack1&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;"Idiosyncrätic".unpack1("C*", offset: 1) #=&amp;gt; 100 ("d")&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Ruby's own packing documentation has much improved: &lt;a href="https://ruby-doc.org/core/packed_data_rdoc.html"&gt;Packed Data&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/String.html#method-i-unpack"&gt;RDoc: String#unpack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ruby-doc.org/core/Array.html#method-i-pack"&gt;RDoc: Array#pack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/pack.c"&gt;Source: pack.c&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=224666"&gt;unpack in Perl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="also-see"&gt;Also See&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="/49-what-the-format.html"&gt;What the Format?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/57-what-the-time.html"&gt;What the Time?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="/64-what-the-regex.html"&gt;What the Regex?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby, Can You Speak Louder?</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html"/>
    <id>https://idiosyncratic-ruby.com/3-ruby-can-you-speak-louder.html</id>
    <published>2015-05-03T00:00:00Z</published>
    <updated>2015-05-03T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby has some ways to turn on &lt;em&gt;debug mode&lt;/em&gt;, which library authors can use to print out extra information for interested users. But unfortunately, there are multiple &lt;em&gt;debug modes&lt;/em&gt; in Ruby. When to use which one?&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Consider you have this code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def production_method
  puts "I am doing the right thing part 1"
  # @a is really intereting here
  puts "I am doing the right thing part 2"
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We could query the global &lt;code&gt;$DEBUG&lt;/code&gt; variable, which can be toggled when starting the Ruby interpreter:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def production_method
  puts "I am doing the right thing part 1"
  $stderr.puts "@a is now: #{@a}" if $DEBUG
  puts "I am doing the right thing part 2"
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But is this the best way? It also could have been:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$stderr.puts "@a is now: #{@a}" if $VERBOSE
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$stderr.puts "@a is now: #{@a}" if Library.debug_mode?
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And what about:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;warn "@a is now: #{@a}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ruby is a little idiosyncratic here. There is no standard way to signalize "I want to have more information". Ruby has two global debug modes: &lt;em&gt;debug mode&lt;/em&gt; and &lt;em&gt;verbosity mode&lt;/em&gt; and both behave differently. Within Ruby, the current debug mode state can be queried from two global variables:&lt;/p&gt;

&lt;h2 id="global-debug-state"&gt;Global Debug State&lt;/h2&gt;

&lt;p&gt;This table shows the different modes both of them can have:&lt;/p&gt;

&lt;table class="table-15-15-30-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Variable&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;CLI-Variable Mirrors¹&lt;/th&gt;
      &lt;th&gt;Meaning&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$DEBUG&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$-d == true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Debug mode active&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$DEBUG&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;false&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$-d == false&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Debug mode inactive&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$VERBOSE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$-v == true&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-w == true&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-W == 2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Verbosity mode active&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$VERBOSE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;false&lt;/code&gt;²&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$-v == false&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-w == false&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-W == 1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Medium verbosity mode&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;$VERBOSE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;$-v == nil&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-w == nil&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$-W == 0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Silent verbosity mode&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Will be set automatically&lt;br /&gt;
² Default&lt;/p&gt;

&lt;p&gt;Note that the Verbosity mode is different for &lt;code&gt;$VERBOSE == false&lt;/code&gt; and &lt;code&gt;$VERBOSE == nil&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Another side note: While it is possible to change &lt;code&gt;$DEBUG&lt;/code&gt; to an arbitrary value, this is not true for &lt;code&gt;$VERBOSE&lt;/code&gt; - If you assign it a trueish value, it will just be set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What follows is a list of command line options that have an effects on the debug modes:&lt;/p&gt;

&lt;h2 id="command-line-options-for-debug-modes"&gt;Command Line Options for Debug Modes&lt;/h2&gt;

&lt;table class="table-20-20-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Alias&lt;/th&gt;
      &lt;th&gt;Effects&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-W2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-W&lt;/code&gt;, &lt;code&gt;-w&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sets &lt;code&gt;$VERBOSE&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-W1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Nothing (&lt;code&gt;$VERBOSE&lt;/code&gt; remains &lt;code&gt;false&lt;/code&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-W0&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Sets &lt;code&gt;$VERBOSE&lt;/code&gt; to &lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;--verbose&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Sets &lt;code&gt;$VERBOSE&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;&lt;br /&gt;Also quits Ruby if no arguments given&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;-v&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Sets &lt;code&gt;$VERBOSE&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;&lt;br /&gt;Also Prints Ruby version&lt;br /&gt;Also quits Ruby if no arguments given&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;--debug&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sets &lt;code&gt;$DEBUG&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;&lt;br /&gt;Sets &lt;code&gt;$VERBOSE&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A funny thing to note is that &lt;code&gt;-v&lt;/code&gt; is a shortcut for &lt;code&gt;--version&lt;/code&gt; as well as it is one for &lt;code&gt;--verbose&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="effect-of-debug-modes-on-interpreter"&gt;Effect of Debug Modes on Interpreter&lt;/h2&gt;

&lt;h3 id="verbosity"&gt;Verbosity&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;code&gt;$VERBOSE&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;Effect&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; (but not &lt;code&gt;nil&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Kernel#warn&lt;/code&gt; will output to &lt;code&gt;STDERR&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Interpreter level 1 warnings will be printed, for example, duplicated hash keys&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Interpreter level 2 warnings will be printed, for example, method redefinition&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="debug-mode"&gt;Debug Mode&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;code&gt;$DEBUG&lt;/code&gt;&lt;/th&gt;
      &lt;th&gt;Effect&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Extended exception reporting will be turned on. See &lt;a href="https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html#i-know-an-exception-is-getting-raised-but-i-dont-know-where"&gt;this blog post&lt;/a&gt; for an example. It will also turn on &lt;a href="https://ruby-doc.org/core/Thread.html#method-c-abort_on_exception-3D"&gt;Thread.abort_on_exception&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="best-practice"&gt;Best Practice&lt;/h2&gt;

&lt;p&gt;Use neither &lt;code&gt;$VERBOSE&lt;/code&gt;, nor &lt;code&gt;$DEBUG&lt;/code&gt;, but use custom logging, for example &lt;a href="/20-better-standards.html"&gt;standard library's logger or some other logging gem&lt;/a&gt;. It is easier to understand than relying on the global debug modes.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;$VERBOSE = true&lt;/code&gt; if you are interested in level 2 interpreter warnings.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;$DEBUG = true&lt;/code&gt; if you want to turn on extended exception reporting or enable &lt;code&gt;Thread.abort_on_exception&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://mislav.uniqpath.com/2011/06/ruby-verbose-mode/"&gt;Verbose mode and warnings&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://api.rubyonrails.org/classes/Kernel.html#method-i-silence_warnings"&gt;Rails' verbosity silencer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.ruby-toolbox.com/categories/Logging"&gt;Ruby Loggers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ruby String Magic</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/2-ruby-string-magic.html"/>
    <id>https://idiosyncratic-ruby.com/2-ruby-string-magic.html</id>
    <published>2015-05-02T00:00:00Z</published>
    <updated>2015-05-02T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Ruby strings are powerful. You could say Ruby is built around manipulating strings. There are tons of ways how to work with strings and as of Ruby 2.7.1 &lt;code&gt;String&lt;/code&gt; offers 130 instance methods. Knowing them well can save you a lot of time.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;What follows is a list of 10 lesser known things about strings: Some of them useful, some of them idiosyncratic, some both.&lt;/p&gt;

&lt;h2 id="named-format-strings"&gt;Named Format Strings&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Btw, Ruby&amp;#39;s format strings can be used with hashes:&lt;br /&gt;&amp;quot;%&amp;lt;language&amp;gt;s: %&amp;lt;author&amp;gt;s&amp;quot; % { language: &amp;quot;Ruby&amp;quot;, author: &amp;quot;matz&amp;quot; } #=&amp;gt; &amp;quot;Ruby: matz&amp;quot;&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/527152031782674432"&gt;October 28, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="string-concatenation"&gt;String Concatenation&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;There is a lesser-known syntax for concatenating string literals: &amp;quot;just&amp;quot; &amp;quot;put&amp;quot; &amp;quot;them&amp;quot; &amp;quot;directly&amp;quot;&amp;quot;after&amp;quot; &amp;quot;each&amp;quot; &amp;quot;other&amp;quot;&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/510013718076600320"&gt;September 11, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="strings--empty-ranges"&gt;Strings + Empty Ranges&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Ruby is strange. How can an *empty* range have an effect when applied to a string?&lt;br /&gt;r = 0..-3&lt;br /&gt;r.to_a.empty? #=&amp;gt; true&lt;br /&gt;&amp;quot;Ruby&amp;quot;[r] #=&amp;gt; &amp;quot;Ru&amp;quot;&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/519066888014659584"&gt;October 6, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="whitespace-matching"&gt;Whitespace Matching&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Unicode is full of whitespaces. This is how you match them:&lt;br /&gt;a=&amp;quot;    　&amp;quot; #=&amp;gt; &amp;quot;    　&amp;quot;&lt;br /&gt;a.scan(/\s/).size #=&amp;gt; 1&lt;br /&gt;a.scan(/[[:space:]]/).size #=&amp;gt; 5&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/539440415498579969"&gt;December 1, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="stringsucc"&gt;&lt;code&gt;String#succ&lt;/code&gt;&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Ruby&amp;#39;s weird calculation of string successors:&lt;br /&gt;&amp;quot;9z&amp;quot;.succ #=&amp;gt; &amp;quot;10a&amp;quot;&lt;br /&gt;&amp;quot;z9&amp;quot;.succ #=&amp;gt; &amp;quot;aa0&amp;quot;&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/520230545465548801"&gt;October 9, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="stdlib-string-compression"&gt;Stdlib String Compression&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Simple stdlib string compression:&lt;br /&gt;require &amp;#39;zlib&amp;#39;&lt;br /&gt;s = &amp;quot;Ruby&amp;quot;*99&lt;br /&gt;s.size #=&amp;gt; 396&lt;br /&gt;c = Zlib.deflate(s)&lt;br /&gt;c.size #=&amp;gt; 17&lt;br /&gt;Zlib.inflate(c) == s #=&amp;gt;true&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/511902948805599233"&gt;September 16, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="using-regex-groups-in-string"&gt;Using Regex Groups in &lt;code&gt;String#[]&lt;/code&gt;&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;You can use regex incl. captured groups when accessing substrings via the [] method: &amp;quot;#42&amp;quot;[/.(\d+)/, 1] #=&amp;gt; &amp;quot;42&amp;quot;&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/508605294059192320"&gt;September 7, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="rexepunion"&gt;&lt;code&gt;Rexep.union&lt;/code&gt;&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;If you have an array of strings, you can automatically generate a regex that matches any the strings: regex = Regexp.union(array_of_strings)&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/510441137254195200"&gt;September 12, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="convert-a-string-from-snakecase-to-camelcase"&gt;Convert a String from &lt;em&gt;snake_case&lt;/em&gt; to &lt;em&gt;CamelCase&lt;/em&gt;&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;You can camelize a string (some_string =&amp;gt; SomeString) with:&lt;br /&gt;&amp;quot;some_string&amp;quot;.gsub(/(?:^|_)([a-z])/) do $1.upcase end&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/509330964246720512"&gt;September 9, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="convert-a-string-from-camelcase-to-snakecase"&gt;Convert a String from &lt;em&gt;CamelCase&lt;/em&gt; to &lt;em&gt;snake_case&lt;/em&gt;&lt;/h2&gt;

&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;You can snakify a string (SomeString =&amp;gt; some_string) with: &lt;br /&gt;&amp;quot;SomeString&amp;quot;.gsub(/(?&amp;lt;!^)[A-Z]/) do &amp;quot;_#$&amp;amp;&amp;quot; end.downcase&lt;/p&gt;&amp;mdash; Ruby String Magic (@RubyStrings) &lt;a href="https://twitter.com/RubyStrings/status/508995693277904896"&gt;September 8, 2014&lt;/a&gt;&lt;/blockquote&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.ruby-doc.org/core/String.html"&gt;RDoc: String&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/ruby/ruby/blob/trunk/string.c"&gt;Source: String&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/rubinius/rubinius/blob/master/kernel/common/string.rb"&gt;Rubinus Source: String&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Test Highlights</title>
    <link rel="alternate" href="https://idiosyncratic-ruby.com/1-test-highlights.html"/>
    <id>https://idiosyncratic-ruby.com/1-test-highlights.html</id>
    <published>2015-05-01T00:00:00Z</published>
    <updated>2015-05-01T00:00:00Z</updated>
    <author>
      <name>Jan Lelis</name>
    </author>
    <content type="html">&lt;p&gt;Compared to other languages, Ruby does not have very good tool support for development. This might not be a problem for many of us: In the end, humans create the code, and not the tools.&lt;/p&gt;

&lt;p&gt;Nevertheless, it would be great to have better tools. Or at least valid syntax highlighting!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The following table shows popular options for code highlighting, but none of them can manage to properly highlight more advanced Ruby features. Here is the:&lt;/p&gt;

&lt;h2 id="syntax-highlighter-comparison"&gt;Syntax Highlighter Comparison&lt;/h2&gt;

&lt;table class="table-35-30-X"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Editor or Syntax Highlighter&lt;/th&gt;
      &lt;th&gt;Version&lt;/th&gt;
      &lt;th&gt;Highlights Ruby Correctly?¹&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/rubychan/coderay"&gt;coderay&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;1.1.0&lt;/td&gt;
      &lt;td&gt;no. score: 4/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://www.jetbrains.com/ruby/"&gt;ruby mine&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;7.1 RM-141.664&lt;/td&gt;
      &lt;td&gt;no. score: 4/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/jneen/rouge"&gt;rouge&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;1.8.0&lt;/td&gt;
      &lt;td&gt;no. score: 3/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;24.3.1&lt;/td&gt;
      &lt;td&gt;no. score: 2/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://pygments.org/"&gt;pygments&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;1.6&lt;/td&gt;
      &lt;td&gt;no. score: 2/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://wiki.gnome.org/Apps/Gedit"&gt;gedit&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3.10.4&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/PrismJS/prism"&gt;prism.js&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;0.0.1&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/ccampbell/rainbow"&gt;rainbow.js&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;1.1.9&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://www.gnu.org/software/src-highlite/"&gt;src-highlight&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3.1.6 (library: 4:0:0)&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/syntaxhighlighter/syntaxhighlighter"&gt;syntaxhighlighter.js&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3.0.83&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;7.4.52&lt;/td&gt;
      &lt;td&gt;no. score: 1/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://atom.io/"&gt;atom&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;0.192.0&lt;/td&gt;
      &lt;td&gt;no. score: 0/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://github.com/isagalaev/highlight.js"&gt;highlight.js&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;8.5&lt;/td&gt;
      &lt;td&gt;no. score: 0/5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href="https://www.sublimetext.com/"&gt;sublime text&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3 Build 3083&lt;/td&gt;
      &lt;td&gt;no. score: 0/5&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;¹ Obviously, passing the test does not necessarily mean that a tool highlights Ruby correctly - but it is an indication.&lt;/p&gt;

&lt;h2 id="the-idiosyncratic-ruby-syntax-highlight-test"&gt;The Idiosyncratic Ruby Syntax Highlight Test&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;# # #
# For Reference
42
"String with #{ :interpolation }"
/regex$/
$/

# # #
# TEST CASE 1: Question Marks
# SHOULD BE HIGHLIGHTED AS: Array of Strings - Operator - String - Operator - String

[?', ?(] ?'a':'b'

# # #
# TEST CASE 2: Percent Format
# SHOULD BE HIGHLIGHTED AS: String - Operator - Array of Numbers

"%d %d %d"%[1,2,3]

# # #
# TEST CASE 3: Space-delimited String
# SHOULD BE HIGHLIGHTED AS: String Delimiter - String

% 5 #

# # #
# TEST CASE 4: Multi-line Regex with Global Variable Interpolation
# SHOULD BE HIGHLIGHTED AS: Regex Delimiter - Regex -
#                           Interpolation Character (Optional) -
#                           Global Variable -
#                           Regex Delimiter - Regex Options

/
$$#$/
/omix

# # #
# TEST CASE 5: Nested Heredoc
# SHOULD BE HIGHLIGHTED AS: Method - String Delimiter - Operator -
#                           String Delimiter - String - String Delimiter
#                           String - String Delimiter

puts &amp;lt;&amp;lt;HERE&amp;lt;&amp;lt;&amp;lt;&amp;lt;THERE
foo 42
HERE
bla 43
THERE
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>
