こんにちは、しきゆらです。
今回は、前回にセットアップしたRaspberry PiにRubyをコンパイルし、SSH接続ができるようにします。
先回の記事はこちら
手を動かした記録
こんにちは、しきゆらです。
今回は、前回にセットアップしたRaspberry PiにRubyをコンパイルし、SSH接続ができるようにします。
先回の記事はこちら
こんにちは、しきゆらです。
今回は、タイトルにある通りCSVに関するメモです。
時々触ることになるCSVですが、普通のDBでいいじゃん、って思いませんか?
私はそう思ってあまり触ってこなかったんですが、DBを適当に作ると後々変更しにくくなるということにようやく気付きました。
そこで、今回は忘れないうちに基本的なCSVの触り方をメモしておきます。
こんにちは、しきゆらです。
昨年に投稿した「【Ruby】メールを送受信する」のプログラムを書き直す機会があったので、改めて書いておきます。
上記の投稿に載せたスクリプトをクラスに直して、いくつかのバグを修正しました。
その結果はこれ
require 'net/smtp' require 'json' require 'base64' class SendMail def initialize(to: 'to@mail.com', from: 'from@mail.com', option: {}) # 引数を取り込む @smtp_option = { server: 'smtp.gmail.com', port: 465, authentication: :plain, ssl: true, } @smtp_option.merge!(option) # 認証情報を合わせ @smtp_option.merge!(load_secret) @from = from @to = to @date = Time.now.strftime("%a, %d %b %Y %X") end # パスワードとかを記しておくもの def load_secret File.open("./secret.json") do |file| JSON.load(file) end end def create_subject(subject) str = "" Base64.encode64(subject).split("\n").each do |string| str += "=?UTF-8?B?#{string}?= " end return str.rstrip end def create_body(subject: 'sample subject', body: 'mail main body') @message = <<EOS Date: #{@date} From: #{@from} To: #{@to} Subject: #{create_subject(subject)} Content-Type: text/plain; charset=UTF-8 Mine-Version: 1.0 #{body} EOS end def send(subject: "test mail", body: "this mail is test!") count = 0 begin create_body(subject: subject, body: body) mail = Net::SMTP.new(@smtp_option[:server], @smtp_option[:port]) mail.enable_ssl if @smtp_option[:ssl] mail.start(@smtp_option[:server], @smtp_option["mail"], @smtp_option["pass"]) mail.send_mail(@message, @from, @to) mail.finish rescue => e count += 1 if count < 10 then puts "retry" retry else puts e.class puts e.message end end end end
極力外部のライブラリを使わずにメール機能を実装してみました。
使っているのは、標準添付ライブラリのみ。
SendMailクラスのインスタンスを作るときに送信先、送信者のメールアドレスとオプションを渡します。
オプションでは、smtpサーバ名・ポート番号・SSLを使うかどうかなどを連想配列で渡します。
認証情報をsecret.jsonというファイルにJSON形式で書きます。
例えば以下のような感じ。
{"mail": "mail@mail.com","pass": "password"}
これを読み込んで使うようになっています。
デフォルトでは、Gmailのsmtpサーバを利用するようになっています。
Googleで2段階認証を設定している場合は、ログインするためのパスワードでは認証できません。
これに対しては、アプリケーション用のパスワードを作成して、secret.jsonに書きます。
作成方法は以下あたりから。
送信するときは、そのままsendメソッドを使います。
引数として、subjectとbodyを文字列として渡してやります。
これだけでメールを送ることができます。
一定のタイミングで通知を送るとか、使い方はそれなりにありそう。
また、以前のスクリプトでは件名が文字化けしてしまいます。
これをなんとかするために、create_subjectでいい感じに変換しています。
参考としたのは、以下のサイトたち。
charsetを指定しただけでは件名が化けてしまうようです。
どうも、アスキー文字のみしか使えないようです。
これをなんとかするためには、
=?CHARSET?B?エンコードした文字列?=
という形で書かないといけないようです。
UTF-8で場合は
=?UTF-8?B?エンコードした文字列?=
とします。
エンコードはBase64というものを使ってエンコードしています。
また、一定の文字数で区切らないといけないようです。
これに関しては、Base64でエンコードするといい感じのところで区切り文字を入れてくれます。
そこでsplitして、それぞれの文字列を上記のフォーマットで囲ってやっています。
ブログを見ると、メールを書くプログラムをいつかいたのかと思ったら約1年前だったとは。
久々にこの遺産が役に立ったので、驚きました。
思いついたら書いて、保持しておくのは大事なんだなと思いました。
おわり
こんにちは、しきゆらです。
今回はクラスタリング手法の一つであるk-means法を実装してみたのでまとめてみます。
使用言語は、もちろんRubyです。
なお、ライブラリ等は使わずに実装してみました。
こんにちは、しきゆらです
今回は、(この記事を書いている時点での)Ruby最新バージョンである2.4.0をコンパイル&インストールしていきます
詳しい変更点などは、Rubyの公式サイトからどうぞ
いつも通り高速化とかがメインなのかしら
大きく変わりそうなところは「Unify Fixnum and Bignum into Integer」とか
「Introduce hash table improvement (by Vladimir Makarov)」あたりかしら
それではれっつこんぱいる!
こんにちは、しきゆらです
前回の記事でも書きましたが、最近はJavaScriptをよく書いています
その中で、サーバへデータを送信する時はオブジェクトをJSONとして送信するのが便利だということで
JSON文字列をJavaScriptで作って、サーバへ送っています
そして、サーバ側はRubyで書いているのですが
JSON文字列をRubyのオブジェクトに変換するためにはjsonというgemを使います
そこで注意することがあったのでメモしておきます
こんにちは、しきゆらです
自分の中で、絶賛ブログ更新キャンペーン中です
それは置いておいて、今回の内容は
「サーバでのエラーもクライアントに返しちゃおう」
というお話です
こんにちは、しきゆらです
今回はメモ的なもの
今までは、コードを書いたら実際に実行していたんですが
変数や実行した結果を出力するためのコードを書くのが面倒に思っていたので
irbでデバッグを行うようになりました
その中で、自分で書いたコードを
require './hogehoge'
として読み込んでいました
(この時は、.rbなしでも読み込んでくれるんですね。初めて知った・・・)
しかし、requireは一度読み込んだ後にファイルを修正した時、再読み込みができません
その度に一旦exitしてirbを起動し直すのがめんどい・・・
ということで
load './hogehoge.rb'
として読み込むようにしてみました
(loadでは.rbまで入れないとだめっぽい)
この場合はファイルを修正し、もう一度上記コードを実行すると再読み込みができます
これにより、煩わしいものが少し軽減されました
・・・ということで
とても雑いですが、参考になれば
さらに、もっといい方法があれば教えていただければ幸いです
おわり
こんにちは、しきゆらです
今回は、Rubyで木構造を作ってみたので書いておきます