上京エンジニアの葛藤

都会に染まる日々

「初めてのRuby」を読んだ(2章)

前回に引き続いて、今回は2章(配列とハッシュ)についてまとめていきます

前回のリンクはここから okkun-sh.hatenablog.com

配列とは

いくつかのオブジェクトの参照を順に並べたもの
配列が保持している個々のオブジェクト参照のことを配列の要素という
つまりオブジェクトが更新されると、そのオブジェクトを参照している全ての配列要素の値も変化して見える

Array クラスのインスタンスである
また配列同士を比較する場合、対応する要素がすべて同値の場合、同値となる

配列の構築

要素を並べて [] で括る

bar = "bar"
array = ["hoge", 1, bar, [2, 3]]

p array # ["hoge", 1, "bar", [2, 3]]

添字参照

要素は 0 から始まり、その番号 + [](添字参照演算子) でオブジェクトにアクセスできる

様々な添字参照

  • 負の添字
    添字が負の場合には末尾から逆順に要素を指す番号と解釈する
array = [1, 2, 3, 4 ,5]

p array[-1] # 5
p array[-3] # 3
  • 長さ付き添字
    位置と長さの指定をすることもできる
    要素の番号 n に対する要素の個数 m で、n 以降 m 個の要素を含む新しいオブジェクトを返す
array = [1, 2, 3, 4 ,5]

p array[1, 4] # [2, 3, 4, 5]
p array[-3, 4] # [3, 4, 5]
  • 範囲添字
    添字に範囲オブジェクトを渡すと、添字の番号がその範囲に含まれる要素を取得できる
array = [1, 2, 3, 4, 5]

p array[0..1] # [1, 2]

添字代入

添字参照に代入文を組み合わせたような感じに見えるが、添字参照は Array#[] メソッドが呼び出され、添字代入は Array#[]= メソッドが呼び出される

array = [1, 2, 3]
array[3] = 4
array[-1] = 5

p array # [1, 2, 3, 4]

様々なメソッド

  • Array#include?
    配列に特定の値が含まれているかどうか調べるメソッド
    ? 疑問符は真偽値を返す
  • uniq と uniq!
    両者共に重複要素を排除するメソッド ! 感嘆符は、破壊的メソッドと呼ばれ、レシーバの内部状態を変更する
array = [1, 2, 3, 1, 2, 3]
p array.uniq # [1, 2, 3]
p array # [1, 2, 3, 1, 2, 3]

p array.uniq! # [1, 2, 3]
p array # [1, 2, 3]

※疑問符、感嘆符は、あくまでも慣習のため逆らったコードは書くことができる - each, each_with_index, map
このようなイテレータを使うことで、様々なループ処理を書くことができる

ハッシュとは

任意のオブジェクトをキーとして別のオブジェクトに対応を付けるコンテナオブジェクトのこと

Hash クラスのインスタンスである
またハッシュ同士を比較する場合、全ての対応する要素ペアについて、互いにキー、値が等しい時に同値となる

ハッシュの構築

波括弧({})内にキーと値の対応関係を並べることでハッシュを生成することができる

hash = {
  "hoge" => "hogehoge",
  "bar" => "barbar",
  "foo" => "foofoo",
}

p hash # {"hoge"=>"hogehoge", "bar"=>"barbar", "foo"=>"foofoo"}

添字参照・代入

hash = {
  "hoge" => "hogehoge",
  "bar" => "barbar",
  "foo" => "foofoo",
}
p hash["bar"] # "barbar"

hash["aaa"] = "aaaaaa" # {"hoge"=>"hogehoge", "bar"=>"barbar", "foo"=>"foofoo", "aaa"=>"aaaaaa"}
p hash

様々なメソッド

  • each
    each メソッドではブロック引数として、キーと値が渡される
    順不同である

Enumerable モジュール

each メソッドから導出可能なメソッドを集めたモジュール
Array, Hash は Enumerable というモジュールを継承しており、似たメソッドを多数持っている

モジュールとは

共通のクラスを継承せずに実装を共有できる仕組み

感想

内容は簡単なので全然理解しやすい
アウトプットする為にメモを取ったり、サンプルコードを書きながら読んでいるので時間はかかっているが内容は頭に入ってきていそう
とにかく全てオブジェクトだよってことを凄い意識して書かれてるなと思った

「初めてのRuby」を読んだ(1章)

「初めての Ruby」を読み始めたので、まとめていこうと思います。

「初めての Ruby」の初版は 2008年で約10年前です。(僕が高校生の頃ですね)
そのため Ruby のバージョンも 1.8 or 1.9 系を対象に書かれており、少し古いので今から読む方はその点を頭に入れておく必要があります。

Rubyオブジェクト指向言語

数値、文字列、正規表現、入出力、クラス全てオブジェクトでメソッドやコードブロックもオブジェクトとして扱うことができる

そもそもオブジェクトとは

  • アイデンティティを持っている
    オブジェクトは何らかのクラスに属している
    自分と自分以外を区別する
  • メッセージを受け取る
    メッセージの送受信ができる
  • 内部状態を持つ

Domain Specific Language (DSL)

Ruby ではブロック付きメソッドなどを活用して Ruby であり DSL でもあるような言語を定義することができる
DSL が汎用プログラミング言語の中に埋め込まれた形なので、言語内DSLという

処理系と実行環境について

Ruby はかつては ruby と呼ばれていたが、実装と区別するために MRI と呼ばれており、実装は C言語で書かれていることから CRuby と呼ばれる
Java 仮想マシンで動作する Ruby の処理系は JRuby と呼ばれる

バージョン

MRI のバージョン番号は、(MAJOR).(MINOR).(TEENY) で MINOR が偶数のバージョンが安定版、奇数のバージョンは開発版である
※1.9系は例外で TEENY が1以上のバージョンが安定版で、0 のバージョンが開発版である

パッチレベルについて

1.8.6-p114 などについている -p114 はパッチレベルと呼ばれるもので、バグ修正をカウントする整数を示している
したがって、パッチレベルが上がる場合非互換性の心配はない

Ruby の構成

  • 言語本体
    • 変数
    • クラス定義
    • メソッド定義
    • 制御構文
  • 組み込みライブラリ
    入出力、文字列ライブラリ、配列などのことで、Ruby 起動時に自動的に有効になる
    • 組み込み定数
      グローバルに参照可能な定数のこと
    • 組み込み関数
      特殊なグローバル変数
    • 組み込みクラス
      文字列、配列、範囲、時間などの基本的なクラス
  • 標準添付ライブラリ
    処理系に付属して一緒に配布されている外部ライブラリでユーザー側が明示的に読み込まないと使えない

構文解析

クラス定義は解析フェーズで構文上の妥当性のみ検証される
require, load メソッドは実行時ロードする

ガベージコレクション

オブジェクトの占有しているメモリーは処理系が管理し適切に解放するので、メモリ管理に悩むことはない

対話的実行環境

irb を使うことで対話的に Ruby を実行できる

リファレンス

ri コマンドで読むことができる

ri String#length

ブロック付きメソッドとは

メソッド呼び出し式の後に do...end or {...} で括ったコードブロックを続けれる

array = ["hoge", "bar", "foo"]
array.each do |name|
  puts name
end

上記例で行くと eachイテレータとなる

続きはこちら

okkun-sh.hatenablog.com

公開した gem のダウンロード数が気になって業務に集中できないから slack に通知するようにした話

はろー。こんにちは。
ここ数日タイトル通りの感じで落ち着きがありませんでした。

前回公開した記事に理由があります。
okkun-sh.hatenablog.com
つまり 初めて 作った gem のダウンロード数が気になって業務に集中できませんでした。
ごめんなさい!

一先ずこのままではいかんのでサクッとダウンロード数を定期的に垂れ流す slack bot を作りました。
github.com

実装

  1. slack のアプリケーションを追加する
    以下のページを参考にしてくれよな!
    SlackのIncoming Webhooksを使い倒す - Qiita
  2. ほんのちょっとだけプログラム書く
    GitHub - okkun-sh/gem_dl_count_slack_bot
    gem として公開してませんが使ってください
  3. crontab の登録をする(別に crontab じゃなくてもいい)
    自分は crontab に登録して、1日4回叩くようにしてます

2. ほんのちょっとだけプログラム書く これをちょっと補足します。

require './gem_dl_count_slack_bot'
GemDlCountSlackBot.new(
  slack_uri: "xxx", # 1 で取得した slack のエンドポイント
  gem_uri: "https://rubygems.org/gems/xxx" # 取得したい gem 詳細ページ
).post_slack

GemDlCountSlackBot では具体的に何をしてるかというと対象の gem のページをスクレイピングして DL 数を取得していて、その値を含めて slack エンドポイント叩いてるだけです。
DOM 構造変わったら悲しみ〜

これで集中して業務に取り組むことができ、世界に平和が訪れました。
めでたしめでたし

Scrapbox の Api Client を作って gem で公開した話をざっくりする

はろー。こんにちは。
実は今日誕生日!(おめでとう!)

タイトル通り ScrapboxApi Client を作って gem で公開した話をざっくり書きたくなったので書きます。
scrapbox_client | RubyGems.org | your community gem host

github.com

Scrapbox とは

リアルタイムにメンバーと編集できるノートって感じで、自分はただのメモとして殴り書きしたり wiki として利用したりしています。 scrapbox.io

なぜ作ったのか

  • Ruby をキャッチアップしたかった
    今まで Perl メインだったが、今月から Ruby メインに書いてる
    そもそも gem 使ってるけど、どんな感じで作ってるのかよくわからん
    テスト周りもキャッチアップしたい
  • Scrapbox が好き
  • ScrapboxAPI がシンプルだったので、API Client であれば自分でも作れそうだった API - Scrapbox ヘルプ
    詳細なドキュメントが無いので、実際に叩いて確認した
  • これをキッカケに OSS 活動したいと思った
    Perl 書いていた時は結局 cpan に公開もしていなかったので、今度こそやるぞという意気込み

という感じで Ruby 始めて10日目で公開した(よく頑張りました)。

使い方

USAGE を見てください
GitHub - okkun-sh/scrapbox_client: This gem is simple scrapbox client.
本当に簡単なので、改めて説明するほどでもない。。

まとめ

はい、書きたいことは以上です!
フィードバックとかプルリクめちゃくちゃ待ってます!

失敗談投稿・共有サービス「しくじり」をリリースした話

はろー。こんにちは。
すっかり更新サボってしまいました。
サボってしまった理由(言い訳)は、あるサービスの開発に注力をしていたからです。。

そう、表題にもある通り、、
「しくじり」という失敗談投稿・共有サービスをリリースしました。

shi9jiri.net

サイトはこちらです
一応簡単に説明するとジャンル問わず「失敗談」を投稿し、共有し合おうというゆるーいサービス

なぜつくったのか

作った理由は大きく分けて二つ

1. 失敗談を集めて皆で共有し、防げるもの未然に防げたらいいな
生きていく中で失敗は不可欠なもので、大小毎日何かしらの失敗を繰り返している
もちろん僕自身もたくさんの失敗をしている

全ての失敗を無駄とは考えていないが、未然に防げるのであれば防いだ方がいいといった類のものもあると思う
そんな時に皆さんの様々な失敗談を集めたプラットフォームがあれば有効活用できそうと思った

2. 単純に面白いコンテンツ
失敗談の中には面白いものがたくさんある

例えば中学生、高校生の頃に「初めて彼女ができた時にやってしまった失敗談」とか皆なにかしら面白い失敗談を持っていそうだなと思った

そんな今となったら笑えるような話を集めたら単純に面白いと思った

ユーザーといっしょに眺めてニヤニヤしながらコメントしていきたい

今後どのようにしていきたいか

  • まずは、コンテンツを集めたい
    リリースから1週間経過するがまだまだコンテンツが少ないので、もっと投稿数を増やしていきたい

    開発期間は約2週間で平日の深夜、週末にコソコソと作っていたため
    デザイン面がまだまだ未完成だなと思っているので、どんどんブラッシュアップしていきたい

    機能面では、SNS 連携などのログイン機能も増やして「匿名」、「非匿名」を洗濯できるようにしたいなと考えている

  • 新しい技術をどんどん取り入れたい
    サーバーサイドは Perl で作っており、そのまま VPS にのせているだけなので特段新しいことをしていない
    強いて言えば、MySQL は 8.0 を採用しているぐらいだ

    ユーザー数の増加に伴ってクラウドに移行もしていきたいなと考えている

  • ネイティブアプリ化したい Web アプリでのユーザー数をある程度獲得できたら、ネイティブアプリ化したい

まとめ

Web サービスを作るのが趣味でいくつもサービスをリリースをしては、盛り上がらず閉鎖するということを繰り返しているが、やっぱりサービスを作るのは楽しいなと思う

自分ではイケてる、流行ると思ったサービスが全然流行らなかったり、またその逆もしかり

リリース直後でコンテンツ(ユーザー)も少なく全然盛り上がってないですが、頑張って開発していくので「しくじり」をよろしくお願いします!