某Webアプリ、スマホアプリ開発の企業に勤めているエンジニアの日記です。主に、技術系記事や本の要約を発信します。

ransackで#Array:〜〜のエラー

問題

配列処理したいが、以下のエラーが発生する。

#[Array:0x00007f55f06941f8](array:0x00007f55f06941f8)

原因

Arrayクラスになっているのが原因

ransackではActiveRecord_Relationクラスにする必要がある。

解決策

where、mapをつかい、Array→ActiveRecord_Relationクラスに変換する

.where(id: items.map{ |item| [item.id](http://item.id/) })

参考サイト

配列をActiveRecord::Relationで再取得するメソッドを作ってみる - Qiita

普段ZOOMを利用するエンジニアが、Aroundを使ってみた

「Zoom out.」
パワーワードとともにZOOMに変わるビデオ会議ツールになるか?と、

話題になりつつあるAround。

 

普段、ZOOMやDiscordなど様々なビデオ会議ツールを使い、

仕事をしているエンジニア視点で使ってみた感想を述べていきます。

www.around.co

良かった点

  • テキストシェア機能(マークダウン対応も良い)
  • UIがスマート
  • リモートコントロールペアプロできそう

悪かった点(アップデートの見込みありか?)

  • リモートコントロールはキーボード操作のみで、マウス操作ができない。

 マウス操作するとアプリが落ちる。。。

まとめ

例えるならば、

zoom + TeamViewer って感じの機能でした。

3月時点では、「まだZOOMでいいかな〜」と思いました。

今後のアップデート次第では、本当にZoom outするかもしれないです!

【Flutter】CupertinoPageRouteで前画面に戻るときだけスワイプ可能にする

やりたいこと

iOSアプリでよく見る、前画面に戻る際にスワイプで戻れるようにしたい。

ただし、前画面に戻る以外の画面遷移はスワイプしないようにする。

解決策

  1. CupertinoPageRouteクラスを作成

    ※引数がいくつか入っていますが、適宜変更してください

  2. CupertinoPageRouteにDurationを設定

  3. 次の画面に進む処理を0秒に設定
  4. クラスを任意の画面遷移処理の部分で呼び出す
// スワイプバック可能にする
class MyCupertinoPageRoute<T> extends CupertinoPageRoute<T> {
  MyCupertinoPageRoute({ WidgetBuilder builder, RouteSettings settings })
    : super(builder: builder, settings: settings);
  
  // 次の画面に進む処理
  @override
  Duration get transitionDuration => const Duration(seconds: 0);

  // 前の画面に戻る処理
  @override
  Duration get reverseTransitionDuration => const Duration(seconds: 1);
}

実際は全ての画面遷移時にもスワイプしてますが、遷移時間を0秒にすることで

スワイプには見えない処理にすることができました。

もっと良い方法があればぜひ教えて下さい。。。

参考サイト

https://api.flutter.dev/flutter/material/MaterialRouteTransitionMixin/transitionDuration.html

https://medium.com/flutterdevs/page-transitions-in-flutter-5236a8afae92

null byteエラーが発生したときの対処

やりたいこと

①S3から複数のZipファイルを取得

②複数のzipファイルを解凍しディレクトリ形式にする

③最終的に1つのzipファイルにしたい。

起きた問題

①でget_objectしたところ、以下のようになってしまい、②で必要なファイルパスが取得できない状況。

PK\u0003\u0004\u0014\u0000\u0000\u0000\u0000\u0000\xA1\x9AYQ\u0000\u0000\u0000

client = Aws::S3::Client.new(
    :region => 'ap-northeast-1',
    :access_key_id => '***',
    :secret_access_key => '***',
)      
@orders.each do |order|
    obj = client.get_object(
    bucket: "*",
    key: order.zip_file_name
    ).body.read  
    
    Rails.logger.debug obj.inspect
    #=> PK\u0003\u0004\u0014\u0000\u00....
end

原因

zipファイルの中身はバイナリデータ。

ダウンロードしてきたファイルの中身をobjに参照させている。.body.readという関数は、zipファイルの中身を参照する関数。なので、当然バイナリがログで出てくる。

解決策

readせずに、rubyzipのopen_bufferメソッドを使って、zipファイルを開く。 ただ、open_bufferメソッドはrubyzipの公式ドキュメントには載っていない。。。 もっと良いやり方見つけたい。

client = Aws::S3::Client.new(
    :region => 'ap-northeast-1',
    :access_key_id => '***',
    :secret_access_key => '***',
)      
@orders.each do |order|
    obj = client.get_object(
    bucket: "*",
    key: order.zip_file_name
    ).body  >> readしない!    
end

## get_objectでopenする
Zip::File.open_buffer(obj) do |zip|
    ~~
end

Railsについて初心者なりに調べてみた

ドキュメント

Ruby on Rails ガイド:体系的に Rails を学ぼう

Railsドキュメント

Railsとは

  • Rubyにより構築されたWEBアプリケーションフレームワーク
  • MVCアーキテクチャに基づいて構築されている
  • 他のフレームワークより少ないコードでアプリケーション開発ができるように考慮されている
  • それを実現するためにRailsには制約が多く存在し、慣れるまでは少し窮屈に感じることもあるかも?

Rubyの他フレームワーク

Sinatra

・軽量なフレームワークで簡潔に記述できる、最小限の労力でWebアプリケーションをすばやく作れる。 ・MVCアーキテクチャに基づいた設計ではない。 小規模開発に向き http://sinatrarb.com/

HANAMI

・バージョン1.0が2017年4月にリリースされた比較的新しいフレームワーク。 ・メモリの消費を抑えるために提供されている100以上の安定したAPIを利用できる ・応答速度などで高いパフォーマンスを発揮 長期的なメンテナンスを考え作られている https://hanamirb.org/

Ramaze

Sinatraと同様にシンプルかつ軽量で柔軟性のあるフレームワークRubyの書き方をそのまま踏襲できるようになっている http://ramaze.net/

他言語フレームワークとの比較

Web開発フレームワークのシェアと推移

Stack Overflow

image.png

djangoとlaravelがトレンド上昇している。

ruby on rails は2011年以降、下降している。

Ruby on rails のトレンド下降している要因

Twitterが、Ruby on RailsからJavaVMへ移行する理由

Twitterの膨大化したアクセスを、railsで構築されたシステムよりもJavaVMの方が速やかに処理できる。

→大規模システム開発で使われるケースが世界的に減っている。

なぜ一時期、一世を風靡したRuby on railsが、「railsはもう終わった」と言われるようになったのか?

その一部の背景を上記で説明しました。以下は具体的にかかれている記事

「Railsは終わった」と言われる理由 - Qiita

ただ日本ではスタートアップ中心に仕事がまだまだたくさんある。

例、Cookpad, Gunosy, 食べログ, Freee, Crowdworks

開発環境

  • ローカル
  • Virtual Box
  • Docker
  • Cloud9(AWS)

開発の流れ(ローカル環境)

基本的にMVCモデルの設計に沿って、ファイルを作成する。

image.pngrailsチュートリアルから抜粋

参考文献

Ruby on Railsだけじゃない!Rubyフレームワーク6選

Ruby on Rails チュートリアル:プロダクト開発の0→1を学ぼう

zipとgzipの違い

Adminerをいじっていてこれなんだ?と疑問に思ったので、さくっとメモしておきます。

zipとは

圧縮ファイルの形式で現在一番ポピュラーなもの

gzipとは

GNU Zipのこと。

GNU(グヌー、[ɡnuː] ( 音声ファイル))とはオペレーティングシステム であり、かつコンピュータソフトウェアの広範囲に渡るコレクションである。 GNUは完全にフリーソフトウェアから構成されている。 GNUは"GNU's Not Unix! "(「GNUUNIXではない」)の再帰的頭字語である。 wikipediaより https://ja.wikipedia.org/wiki/GNU#:~:text=GNU%EF%BC%88%E3%82%B0%E3%83%8C%E3%83%BC%E3%80%81%5B%C9%A1n,%E7%9A%84%E9%A0%AD%E5%AD%97%E8%AA%9E%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82

それぞれの主な役割

zip

圧縮アーカイバ

※圧縮アーカイバ = 複数のファイルを一つのファイルにまとめる機能をもつ

gzip

単なる圧縮機能