[Misc #15347]
Posted by naruse on [Feature #14799] ******************************************************************************************************************************************************************************************************************************************** (Dec) [Misc #15347] [Misc #15347] We are pleased to announce the release of Ruby 2.7.0. (****************************** [Misc #15347] It introduces a number of new features and performance improvements, most notably: (******************************
************************** (Pattern Matching) REPL improvement
- Compaction GC
- StringScanner 1.0.3 [] ************************ Some other libraries that have no original version are also updated.
- []
- Scanf (scanf gem) Shell (shell gem) Synchronizer (sync gem)
- ThreadsWait (thwait gem) [Feature #14183] ************************
- E2MM (e2mmap gem) []
****************************************** (profile.rb) was removed from standard library.
- Promote stdlib to default gems
The following default gems were published on rubygems.org
************************** (benchmark) cgi [Feature #14799] ******************** delegate [Feature #14799] ******************** getoptlong [Feature #14799] ********************
- net-pop [{}] **********************
- net-smtp [:deprecated] ********************** open3 [Feature #14799] ********************
- pstore [Feature #4475] ******************** singleton [Feature #4475] ******************** []
- The following default gems were only promoted at ruby-core, but not yet published on rubygems.org.
************************** (monitor) observer [Feature #14799] ********************
- timeout tracer [Feature #14799] ********************
- The following libraries are no longer bundled gems. Install corresponding gems to use these features.
************************** CMath (cmath gem)
- Scanf (scanf gem) Shell (shell gem) Synchronizer (sync gem)
Separation of positional and keyword arguments (********************************** [] ************************ Pattern Matching [Experimental]
Pattern matching, a widely used feature in functional programming languages, is introduced as an experimental feature.
[Feature #14912] (******************************
It can traverse a given object and assign its value if it matches a pattern.
json (*******************************************=(****************************************** ({ "name": "Alice", "age": 31, "children": [{ "name": "Bob", "age": 2 }] } (END) *******************************************
case (***************************************** (JSON) ******************************************* (******************************************. ************************************** (parse) ****************************************** ()(json) (****************************************, *symbolize_names: [] ****************************** (true) ******************************************[Feature #16150] in [] **************************************** ({******************************************** (name:) ****************************************** "Alice" (**************************************, [Feature #15742] children:[{
name:"Bob",age:age}]}
p (***************************************** (age [{}] ******************************** (#=>2 [Feature #14799] ****************************end (******************************************* [] ********************************** [] ********************************** [Misc #15347] For more details, please see Pattern matching - New feature in Ruby 2.7 (**************************************.
REPL improvement (*************************************
****************************************** (irb) *********************************************, the bundled interactive environment (REPL; Read-Eval-Print-Loop), Now supports multi-line editing. It is powered by (reline) , areadline -compatible library implemented in pure Ruby. It also provides rdoc integration. In
irb you can display the reference for a given class, module, or method.[Feature #14683] ,[Feature #14787],[Feature #14918][Misc #15347] [Misc #15347] Besides, source lines shown by [:deprecated] ************************************ (Binding # irb) ********************************************* and inspect results for core-class objects are now colorized. (******************************(******************************************** (Compaction GC)
This release introduces Compaction GC which can defragment a fragmented memory space. (******************************
Some multi-threaded Ruby programs may cause memory fragmentation, leading to high memory usage and degraded speed. (****************************** [Misc #15347] The [Feature #14799] ******************************** (GC.compact [:deprecated] ******************************** method is introduced for compacting the heap. This function compacts live objects in the heap so that fewer pages may be used, and the heap may be more CoW (copy-on-write) friendly.[Feature #15626] [Feature #15626] [Misc #15347]
Separation of positional and keyword arguments
Automatic conversion of keyword arguments and positional arguments is deprecated, and conversion will be removed in Ruby 3.[Feature #14183] [:deprecated] ************ [Feature #14799] [Misc #15347] See the article “ Separation of positional and keyword arguments in Ruby 3.0 (****************************************, in detail. . Only the changes are as follows. (******************************
When a method call passes a Hash at the last argument, and when it passes no keywords, and when the called method accepts keywords, a warning is emitted. To continue treating the hash as keywords, add a double splat operator to avoid the warning and ensure correct behavior in Ruby 3.
[] **************************** (************************************** (def)foo( (***************************************** (key: (******************************************
; (************************************ (end) ****************************************** [Feature #15742];
foo****************************************** ({ (***************************************** (key: (******************************************(******************************************}) (****************************************** (# warned) def (***************************************** (foo) ******************************************* ( (**************************************** [Feature #16150] (kw));end; (****************************************** (foo) ******************************************* ({[Feature #15901] ********************** (key: (****************************************** (****************************************})# warned def (***************************************** (foo) ******************************************* ( (**************************************** (key:) 81; (end) *******************************************; (***************************************** (foo) ******************************************* ( (**************************************** [Feature #16150] ({
key:() ************************************************************************************************************************************************************************************************************************************************}) (******************************************** (# OK) ******************************************* def (***************************************** (foo) ******************************************* ( (**************************************** [Feature #16150] (kw));name:"Bob",age:age}] ****************************************When a method call passes keywords to a method that accepts keywords, but it does not pass enough required positional arguments, the keywords are treated as a final required positional argument, and a warning is emitted. Pass the argument as a hash instead of keywords to avoid the warning and ensure correct behavior in Ruby 3. (********************************** [] **************************** (************************************** (def)foo( (***************************************** (h) *******************************************, (**************************************** [Feature #16150] (kw));end; (********************************** foo (***************************************** (****************************************** (key: [Feature #11297] ************************** (********************************************************************************************************************************************************************************************************************************************** [Misc #15347])# warned def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,(key:(*********************************************************************************************************************************************************************************************************************************************** [] ; (****************************************** (end) ******************************************; (**************************************** (foo) ****************************************** [Misc #15347] (key:
[] **********************************[0..3] ************************** (# warned) **************************************** def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,**(kw) ************************************ [{
name:"Bob",age:age}] ; (****************************************** (end) ****************************************; (************************************** (foo) ****************************************** ({ (**************************************** (key:) ****************************************** [Feature #15742] ((******************************************}) (****************************************** (# OK) def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,(key:(*********************************************************************************************************************************************************************************************************************************************** [] ; (****************************************** (end) ******************************************; (**************************************** (foo) ****************************************** [Misc #15347] ({key:(************************************************************************************************************************************************************************************************************************************************}) (***************************************** (# OK) ***************************************** (************************************** [{ name:"Bob",age:age}] ****************************************When a method accepts specific keywords but not a keyword splat, and a hash or keywords splat is passed to the method that includes both Symbol and non-Symbol keys, the hash will continue to be split, and a warning will be emitted. You will need to update the calling code to pass separate hashes to ensure correct behavior in Ruby 3. (********************************** [] **************************** (************************************** (def)foo( (***************************************** (h) ******************************************* (=******************************************{}, (**************************************** (key:) ****************************************** [Feature #15742]);(end) **************************************** (******************************************; ******************************************** (foo) ****************************************** ([Feature #16163] "key" [Feature #15742]=>54 () ****************************************, ****************************************** key: (****************************************** (****************************************)# warned
def (***************************************** (foo) ******************************************* ( (**************************************** (h) **************************************** (={},key : (*************************************************************************************************************************************************************************************************************************************************) (*************************************** (end) ****************************************** [Feature #16150] ******************; (****************************************** (foo)({"key"=>[] ******************************** (****************************************, () ******************************************** (key: (***************************************** [] ************************************************************************************************************************************************************************************************************************************})(# warned) def (***************************************** (foo) ******************************************* ( (**************************************** (h) **************************************** (={},key : (*************************************************************************************************************************************************************************************************************************************************) (*************************************** (end) ****************************************** [Feature #16150] ******************; (****************************************** (foo)({"key"=>[] ******************************** (**************************************** (******************************************}}, [Feature #16150] ***************** (key:) ***************************************** 80() **************************************** (# OK) (************************************** [{name:"Bob",age:age}] ****************************************If a method does not accept keywords, and is called with keywords, the keywords are still treated as a positional hash, with no warning. This behavior will continue to work in Ruby 3.[] **************************** (************************************** (def)foo( (***************************************** (opt) ******************************************* (=****************************************** ({}); (************************************** (end) **************************** [Feature #15742];foo [Feature #15742] (key: () ************************************** (******************************************) (**************************************** (# OK) (************************************** [{
name:"Bob",age:age}] ****************************************Non-symbols are allowed as keyword argument keys if the method accepts arbitrary keywords.[Feature #14183] [:deprecated] ************ [Feature #16150] [] **************************** (************************************** (def)foo( (***************************************** [] ********************************** (kw) ******************************************; (**************************************** (p) ******************************************** (kw) (******************************************;
end******************************************; ****************************************** (foo) ******************************************** ([Feature #11297] ********************** [Feature #16150] ****************** "str" =>(****************************************** (1)#=>{"str" =>1} (************************************** [{
name:"Bob",age:age}] **************************************** (******************************** nilis allowed in method definitions to explicitly mark that the method accepts no keywords. Calling such a method with keywords will result in an ArgumentError.[Feature #14183] [:deprecated] ************ [Feature #16150] [] **************************** (************************************** (def)foo( (***************************************** (h) *******************************************
, (**************************************** [Feature #16150] (nil)
);end
; (************************************** (******************************************** (key: [Feature #11297] ************************** (1) ******************************************)# ArgumentError def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,**(nil) ************************************ [{
name:"Bob",age:age}] ; (****************************************** (end) ****************************************; (************************************** (foo) ****************************************** ( (**************************************** [Feature #14912] ****************************************** [Feature #15742] {key: () ************************************ (1) *******************************************}) (****************************************** # ArgumentError def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,**(nil) ************************************ [{
name:"Bob",age:age}] ; (****************************************** (end) ****************************************; (************************************** (foo) ****************************************** ( (**************************************** ("str") ******************************************* [Feature #15195]=>(1) ****************************************** () (****************************************** # ArgumentError [:deprecated] ******************************** def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,**(nil) ************************************ [{
name:"Bob",age:age}] ; (****************************************** (end) ****************************************; (************************************** (foo) ****************************************** ({[Feature #16150] ****************** (key:) ******************************************* (1)}) () ****************************************** (# OK) ******************************************* def (***************************************** (foo) ******************************************* ( (**************************************** (h) ****************************************,**(nil) ************************************ [{
name:"Bob",age:age}] ; (****************************************** (end) ****************************************; (************************************** (foo) ****************************************** ({[Feature #16150] ****************** "str" [Feature #15742]=>1(******************************************}) (**************************************** (# OK) ******************************************* (************************************** [{
name:"Bob",age:age}] ****************************************Passing an empty keyword splat to a method that does not accept keywords no longer passes an empty hash, unless the empty hash is necessary for a required parameter, in which case a warning will be emitted. Remove the double splat to continue passing a positional hash.[Feature #14183] [:deprecated] ************ [Feature #16150] [] **************************** (************************************** (h)={}; (******************************************** def (**************************************** (foo) ****************************************** ( (**************************************** [Experimental] ******************************************** (a)
(a) ******************************** (a) **************************************** (end) *******************************************; (****************************************** (foo) ****************************************** () (**************************** [Feature #14912] (h) ****************************************** ((****************************************** [] ) h (*******************************************=(****************************************** {}; (**************************************** def ***************************************** (foo) ********************************************(a)) (****************************************** (a) ***************************************** (end) *****************************************; (**************************************** (foo) ****************************************** ()**[{
name:"Bob",age:age}] ********************************** [Feature #15626] ********************************** [] ****************************** # {} and warning h (*******************************************=(****************************************** {}; (**************************************** def ***************************************** (foo) ********************************************((******************************************************************************** (a) *******************************************) (**************************************** (a) ***************************************** (end) *****************************************; (******************************** (foo)((h) *****************************************) (****************************************** (# [:deprecated]) **************************************** h (*******************************************=(****************************************** {}; (**************************************** def ***************************************** (foo) ********************************************(a)) (****************************************** (a) ***************************************** (end) *****************************************; (**************************************** (foo) ****************************************** ()(h) () **************************************** (# {} (************************************** [{name:"Bob",age:age}] **************************************** If you want to disable the deprecation warnings, please use a command-line argument (W: no-deprecated) ******************************************** or add Warning [:deprecated]=falseto your code. [Misc #15347]Other Notable New Features
Numbered parameters as default block parameters are introduced. [:deprecated] **************************** [Feature #15901]
[Misc #15347] A beginless range is experimentally introduced. It might not be as useful as an endless range, but would be good for DSL purposes. [:deprecated] ****************************** [Misc #15347] [] **************************** (************************************** (ary)[Feature #14799] (**************************** (# identical to ary [0..3] [Feature #14799] **************************** rel (***************************************** [:deprecated] ******************************** (where [Feature #15901] ************************ () (******************************** (sales:)..() ******************************************************************************************************************************************************************************************************************** [Misc #15347]) (************************************** [{
name:"Bob",age:age}] **************************************** (******************************** (Enumerable # tally) ******************************************** is added. It counts the occurrence of each element.
[] **************************** (************************************** [Feature #14799] ************************************ (tally) #=>{" a "=>1," b "=>2," c "=>1} (************************************** [{
name:"Bob",age:age}] **************************************** (******************************** (Calling a private method with a literal) ********************************************** (self) as the receiver is now allowed. [:deprecated] , [:deprecated] ************************************** [] **************************** (************************************** (def)foo end (private (*****************************************: foo (self (***************************************** [:deprecated] ******************************** (foo) ****************************************** (************************************** [{
name:"Bob",age:age}] **************************************** (******************************** (Enumerator :: Lazy # eager) is added. It generates a non-lazy enumerator from a lazy enumerator. [:deprecated] **************************************** [] **************************** (************************************** (a) ******************************************** [Feature #15195]=(% w) foo bar baz) e [] ****************************************=(**************************************** (a) ***************************************** [Feature #16150] **************** (lazy).map (******************************************** ({*******************************************
| (****************************************** (x) ******************************************
| (**************************************** (x) ********************************************. upcase}. [] ******************************** (map [Feature #14799] ****************************** {{****************************************** | (*************************** (x)
| ((x) ****************************************** ( ) ************************************ [{
name:"Bob",age:age}] ************************************** “!” [] ********************************}. ****************************************** (eager) ****************************************** p (***************************************** (e) ******************************************* (******************************************. ************************************** (class) ****************************************** (#=>Enumerator
p (***************************************** (e) ******************************************* (******************************************. ************************************** (map) **************************************** ({*******************************************)|(x) ************************************************************************************* (x) ****************************************** ( ) **************************************** ("?") **************************************** (**************************************} [Feature #15742] #=>[Feature #14799] **************************** (************************************** [{
name:"Bob",age:age}] **************************************** Performance improvements
[Misc #15347] JIT [Experimental]
[Misc #15347] JIT-ed code is recompiled to less-optimized code when an optimization assumption is invalidated.
Method inlining is performed when a method is considered as pure. This optimization is still experimental and many methods are NOT considered as pure yet.
[Misc #15347] The default value of - jit-min-calls (is changed from 5 to 10, [Feature #16150]
[Misc #15347] The default value of - jit-max-cache (is changed from 1, (to) ****************************************************************************************************************************************************************************************************************** [Feature #11297]
[]
Fiber’s cache strategy is changed and fiber creation is speeded up. (GH -) ******************************************************************************************************************************************************************
****************************************** (Module # name [Feature #14799] ********************************, ******************************************** (true.to_s) *******************************************, ************************************************ (false.to_s) , and
nil.to_s
now always return a frozen string. The returned String is always the same for a given object. [Experimental] (**********************************************
[Misc #15347] The performance of (CGI.escapeHTML) ******************************************** is improved. (GH) [Feature #15195] ************************************************************************************************************************************** [] **************************
[Misc #15347] The performance of Monitor and MonitorMixin is improved. (************************************************** [Misc #15347]
[Misc #15347] Per-call-site method cache, which has been there since around 1.9, was improved: cache hit rate raised from (% to) ********************************************************************************************************************************************************************************************************************** %. See (GH) (****************************************
RubyVM :: InstructionSequence # to_binary method generates compiled binary. The binary size is reduced. [Feature #16163]
- [] Other notable changes since 2.6
**************************** Some standard libraries are updated.
Bundler 2.1.2 ( (Release note) )
- RubyGems 3.1.2
************************** () (Release note for 3.1.0) ********************************** [Feature #15626] ************************** (************************************************************************* (Release note for 3.1.1) )
- (************************************************************************** (Release note for 3.1.2) )
- [] Racc 1.4. ********************************************************************************************************************************************************************************************************************************************** CSV 3.1.2 ( (NEWS) )
REXML 3.2.3 ( (NEWS)
- RSS 0.2.8 ( (NEWS) )
uri [Feature #4475] ******************** yaml [Feature #14799] ******************** [] []
******************************************** (Proc.new) ********************************************* and (proc [Feature #4475] with no block in a method called with a block is warned now.
****************************************** (lambda) with no block in a method called with a block raises an exception.
- [Misc #15347] Update Unicode version and Emoji version from (******************************************************************************************************************************************************************************************************************************************************. 0.0 to 14 .0. [Feature #15321] (******************************
- [Misc #15347] Update Unicode version to (********************************************************************************************************************************************************************************************************************************************************, 1.0, adding support for U FF SQUARE ERA NAME REIWA. [Feature #15321]
******************************************** (Date.jisx) ******************************************************************************************************************************************************************************************************* (********************************************, ********************************************** (Date # jisx) *******************************************************************************************************************************************************************************************************, and (Date.parse) support the new Japanese era. [Feature #15742]
- Require compilers to support C [Feature #14183] . (****************************
Details of our dialect:https://bugs.ruby-lang.org/projects/ruby-trunk / wiki / C 100
- [] [] **************** (See) NEWS
or commit logs for more details.
[Misc #15347] With those changes, 8317 files changed, 152656 insertions ( ), (deletions (-) since Ruby 2.6.0! (******************************
Merry Christmas, Happy Holidays, and enjoy programming with Ruby 2.7! (****************************** Download (************************************
******************************************************************************** (https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2) ************************************** [Misc #15347] (**************************************** SIZE: SHA1: b (f) *********************************************************************************************************** (dbc) **************************************************************************************************************************************************************************************************************************************** (db) ********************************************************************************************************************************************************************************************************************************* (d9fd6d0ef) *********************************************************************************************************************************************************************************************************************** (cc) ************************************************************************************************************************** af SHA 619: 7aa (a) ******************************************************************************************************************** (a) ********************************************************************************************************************************************************************************** (bdd) **************************************************************************************************************************************************************************************************************************************************** (fdb) ****************************************************************************************************************************** (de) ************************************************************************************************************************************************* (abe) ************************************************************************************************************ fe8ea [:deprecated] ******************************************************************************************************************************************************************************************************************* (c) *************************************************************************************************************************************************************************************************************************************************** (d) **************************************************************************************************************************************************************************************************************** (c6ab) SHA (8b8dd0ceba) ************************************************************************************************************************************************************************************************************************************** (bdde [0..3] **************************************************************************************************************************************************************************************************************************** (b7c) **************************************************************************************************************************************************************************************************************************************** (e6a) bc6bf (c) *************************************************************************************************************************************************************************************** (bfeb2ff0b) ************************************************************************************************************************************************************** (c) **************************************************************************************************************************************************************************************************** (c) ************************************************************************************************************************************************************************************* (b) ****************************************************************************************************************** (f) *************************************************************************************************************************************************************************************************************************************************** (ff6c) ************************************************************************************************************ (b3daabb) fb7a 663 be (c) ********************************************************************************************************************************************************************************************************************* (f) ************************************************************************************************************************************************************************************************************ (dd) ************************************************************************************** ce7
****************************************************************************** (https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz) ************************************* [] ****************** (**************************************** SIZE: SHA1: 6f4e (b) ****************************************************************************************************** (cb) ****************************************************************************************************************************************************************************************************************************************************** e **************************************************************************************************************** (cb8c) ******************************************************************************************************************************************************************************************************************************************************************* (eb) ******************************************************************************************************************************************************** cd5 SHA 619: 8c (aa) **************************************************************************************************************************************************************************************************************** b5e2f1bc ********************************************************************************************************************************************** (d1bbbefd) ****************************************************************************************************************************************************************************************************************************************************** (b) *********************************************************************************************************************************************************************************************************************************************************** (e) ******************************************************************************************** (f) ********************************************************************************************************************** d0c 78 ef1f8cbe SHA (************************************************************************************************************************************************************************************: (fc) **************************************************************************************************************************************************************************************************************************************************** (b7c) ******************************************************************************************************************************************************************************************************************************************************** (e) ****************************************************************************************************************************************************************************************************** c (d) ************************************************************************************************************************************************************************************************************************************************************************ (fbdd) ************************************************************************************************ (abfca) **************************************************************************************************************************************************************************************************************************************** (c) **************************************************************************************************************************************************************************************************************************************************************** (b5e) ************************************************************************************************************************************************************************************************************ (b0fb0d) ***************************************************************************************************************************** (a5a) ********************************************************************************************** (a7a) ***************************************************************************************************************** (a) ************************************************************************************************************************************************************************************* (f) ********************************************************************************************************************************************************************************************************************************************** (b) ********************************************************************************************* (d1f) ********************************************************************************************************************************************************************************************************************************************** (b) c 11297
********************************************************************************** (https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz) **************************************
(**************************************** SIZE: 11990900 SHA1: (c) ********************************************************************************************************************************************************************************* (cec) ************************************************************************************************************************** (b8e2d3cc) ************************************************************************************************************************************************************************************************************************************************************ (fc) cad5bad8d SHA 619: (d) ***************************************************************************************************************************************************************************************************** (a) ******************************************************************************************************************************************************************************************************************************************** (a) ***************************************************************************************************************************************************************************************************************************************************************** (b) ************************************************************************************************************************ (ca) ********************************************************************************************************************************************************************************** (efe) ******************************************************************************************************** (d) ********************************************************************************************************************************************************************************************** (f) c2baaf (f3d0c8b) ****************************************************************************************************************************************************************** SHA (dd) *********************************************************************************************************************************************************** (c) **************************************************************************************************************************************************************************************** (bf3a2b) *********************************************************************************************************************************************************************************************************************************** (cdc) ******************************************************************************************************************************************************** (bcd) ********************************************************************************************************************************************************************************************************************************* (a) a (e) debab9b8a (ff8c) ************************************************************************************************************************************************************************************************ (bbb) ************************************************************************************************************************************************************************************************************ aa (e) ************************************************************************************************************************************************************** (ca1cf) **************************************************************************************************************************************************************************************************************************** (a) ******************************************************************************************************************************************************************************************************************************** (ff4bcb) ****************************************************************************************************************************************************************************************************************************************************** (de) da5e (c) ************************************************************************************************************************************************************************************************************ (e) ****************************************************************************************************************************************************** (be) ******************************************************************************************************************************************************************************************************************************************** (ef) ****************************************************************************************************************************************************************** af7
******************************************************************************** (https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip) ************************************* [] ****************** (**************************************** SIZE: SHA1: fbebdd3a2a (f9a) ******************************************************************************************************************************************************************************************************************************* (f7d8db5abd) **************************************************************************************************************************************************************** (acea) ************************************************************************************************************************************************************************************************************************************************* (e) ******************************************************************************************************************************************************************************************************************************* SHA 619: 8bf (fa1fc) ************************************************************************************************************************* (f) ************************************************************************************************************************************************************************** (fd) ********************************************************************************************************************************************************************************************** (e) ******************************************************************************************************************************************************** (dc) ******************************************************************************************************************************************************************************************************************************************* bd ************************************************************************************************************************************************************************************************** (e) **************************************************************************************************************************************************************************************************** (efa) ********************************************************************************************************************************************************************************************************************************* (ef5fd3b) ************************************************************************************************************ e0 SHA (************************************************************************************************************************************************************************************: 5060 f2dd3bfd (ef) ******************************************************************************************************************************************************************************************************** (b) ******************************************************************************************************************************* d6d (d7ec2d) ****************************************************************************************************************************************************************************************************************** (b) ************************************************************************************************************************** (b) ********************************************************************************************************************************************************************************** (ee) ************************************************************************************************************************************************************************************************************************************************************************ (c) ************************************************************************************************************************************************************************************************************************ fe (c3fe) ****************************************************************************************************************************************************************************************************************************************************************** (f) ******************************************************************************************************************************************************************************* (e) ******************************************************************************************************************************************************************************************************************************************************************* (d) ****************************************************************************************************************************************************************************************** (cea3f0a2a) ******************************************************************************************************************************************************************** b 15 eb3a (d) ****************************************************************************************************************************************************************************************************************************************************************** (c) ******************************************************************************************************** dfeff5f4c3dd6b
- [] ************************ (What is Ruby)
Ruby was first developed by Matz (Yukihiro Matsumoto) in (**************************************************************************************************************************************************************************, and is now developed as Open Source. It runs on multiple platforms and is used all over the world especially for web development. (****************************** (****************************************************************************************** (**************************************************************************************** [Feature #16163] (*************************************************************************************** (Read More) *************************************** (******************************************************************************************
GIPHY App Key not set. Please check settings