% cat

不定期!弊社のslackで話題になった技術tips集!😘 Vol.5

🐉 説明しよう!tips集とは!?

弊社のslackチャンネルには、各々が感じた、技術的なtipsを誰に向けるわけでもなく放り投げるチャンネルがあります!

↑こんな感じです。

この記事は既出であろうがなかろうが、tipsをひたすらまとめていく記事である!!😄

内容にまとまりがないのはご愛嬌です!弊社の仕事の様子の鱗片が少しでも感じられれば幸いです👌

次回: Vol.6
前回: Vol.4

📌 Ruby & Ruby on Rails編

rubyの数値系メソッド

zero?

0のときtrueを返す

インデックス付きのループ

インデックス付きのループはeach_with_indexだけかと思ったら、Enumerator#with_indexでいける!

map.with_index => ok!
select.with_index => ok!

Rubyのmapやselectでもeach_with_indexみたいにindexを使いたいときはEnumerator#with_index - Qiita

1から始めたいときは

map.with_index(1) do |item, idx| 
end

メールがバウンスするのを防ぐ

Bounce rateを防ぐのため、下記のgemでemailが存在しているかどうか確認出来ます。

kamilc/email_verifier github

SMTPのRCPT TOで存在チェックしてますが、一度に大量にチェックするとスパム認定される可能性あります。あと、ezwebにはこの手段は使えないようですね。

Ruby で メールアドレスの有効性チェックしてみた - Qiita

Rails5からbelongs_to関連はデフォルトでrequired: trueになる

Rails5からbelongs_to関連はデフォルトでrequired: trueになる - Qiita

🖌これ気づかずにRails5使い始めてハマったのはいい思い出...

RailsのRoutingでresourceとresourcesが2つある。

  • resourcesは、複数のリソースに対するCRUD処理を行うためのルーティングを生成する。
  • resourceは、ただ1つのリソースに対するCRUD処理を行うためのルーティングを生成する。

これがどういう挙動の違いを出すかと言うと

resource  :video # get '/video' => Videos#show
resources :videos # get '/videos' => Videos#index

みたいな挙動になるぞ!

WARN: Clearing out unresolved specs.が出た時

「同一のgemが複数バージョンでインストールされていて、システムでどれを選ぶか決めきれないよ」という警告。

RubygemでWARN: Clearing out unresolved specs.が出た時の対応 - Qiita

def 内で定数への代入文を書くとエラーになる(呼び出し時ではなくて定義時)

define_method でなら定数代入可能

Request-log-analyzer

Railsのログ解析に使えそうなgemとしてRequest-log-analyzerというgemがある

$ gem install request-log-analyzer
$ request-log-analyzer path/to/production.log

でうごく。絞り込みができ

$ request-log-analyzer --select controller HogeContoroller --select show path/to/production.log

みたいなこともできる・・・が、これらは統計的な情報しか得られない。こいつの真骨頂はdオプションで、なんとログデータからsqilte形式のDBを作ってくれる。

$ request-log-analyzer hoge.db path/to/production.log

とすればなんかhoge.dbにアクセスログのDBが出来上がるよやったね!

gemの最終更新が2014年と古いですがRails4系のlogは大丈夫でした。

nestされたresourceに対してlink_to使いたい時

resources :hoges do
  resources :piyos
end

みたいなときに、 [GET] /hoges/:hoge_id/piyo/:id みたいなアクセスしたときは

link_to hoge_piyo_path(@hoge,@piyo)

みたいに変数を2つ与えてやると良い

form object

Form Object実装メモ - Qiita

ざっくりいうと、modelクラスとして定義し、それをform生成のためだけに使う。そのクラス自体は保存処理などのデータのやり取りを請け負う。

保存の際の処理などを分家して記載しておくことができるのでfat class対策になる。いいね!

↓スレッド返信

これのおかげでかなり有用になりましたね

ActiveModel::Attributes が最高すぎるんだよな。 - Qiita

プライベートで採用してるんですけど、超きもちよいです

pdfを開かせずに、DLさせたい場合

send_dataを使うと良い。もしくはcontent_typeを、'application/force-download'と指定するとよい。

migration null 許可 / 非許可 変更

method change_column_null

文字列から直接日時に変換できる

'2015-10-01 00:00:00'.in_time_zone

boolean を 入力必須にする

【Rails】ValidationでBoolean型を入力必須にしたいとき

結合強度

三項演算子さん...

piyo = []
piyo << true ? : 'dog' : 'cat'
p piyo
# => [true]

でも

piyo = true ? 'dog' : 'cat'
p piyo
# => "dog"

→スレッド返信

File: precedence.rdoc [Ruby 2.2.0]

Operator precedenceだね。優先度が高いやつが優先で実行してくれる。

📌HTML編

input タグ

inputタグに pattern: '\d*' (←slimの書き方)をオプションとして付けてやることでスマホのキーボードを数値入力に変更できる(数値以外を入れさせない)

HTML5におけるinput要素のpattern、type属性のおさらい - Qiita

input type = 'range' (範囲選択バー)なんてものもあるんですね

📌 Javascript編 (nodeなども含む!)

JavaScript の動画に関するAPIが便利

videoElement.loop = true でループになる。videoElement.muted = true でミュートになる。他にも倍速にできたり自動再生にできたりと便利。

開発者ツールで選択した要素はconsoleから$0で呼べるので、⌘ + shift + c で動画要素選択、 console から $0.loop = true で手軽に動画ループさせられる

javascriptはmethodを呼び出す時

javascriptはmethodを呼び出す時は絶対に()必要ですね。coffeeはちょっと曖昧です

hoge "piyo"
-> hogeのメソドを呼び出す

hoge
-> hogeのsource codeを表示される

ajaxで通信しているサイトで、ブラウザバックでJSONが表示されてしまう場合

$.ajaxに cache: false のオプションをつけてあげるとなおる

その場合URLは

http://www.example.com/sample?_=12345678123456

といった感じのパラメータが付与されます

nullや空文字を配列から排除したいとき

.filter(Boolean)でいけたりする。

というかBoolean()は引数に入った値が 0, -0, null, false, NaN, undefined, ""のいずれかだった場合にfalseを返すので、基本的に文字列が入った配列など、中身の要素の型が限定されるときに使った方がよさげ。

["hoge", "", null].filter(Boolean)
=> ["hoge"]
["hoge", true, false, "", null].filter(Boolean)
=> ["hoge", true]

📌 CSS(style)編

自分のオブジェクトの中心点を操作

transform: translateX(-50%);

自分のオブジェクトの中心点を開始位置にできる。中央揃えする時にすごく便利。

📌 データベース編

Mysqlのpecified key was too long

MySQLでpecified key was too longとエラーが出た - Qiita

varcher型にindexつけようとすると怒られた。utf8mb4設定なので767 bytesを超える可能性があるらしい。

MySQL 256バイト以上あるカラムに索引を貼る

SET GLOBAL innodb_large_prefix = 1

これで回避できる。

📌 Git & Github編

GitHubのコメントのプレビューを表示/非表示

Cmd + Shift + pでGitHubのコメントのプレビューを表示/非表示を切り替えることができる

📌 Docker & Kubernetes編

Kubernetes is 何

コンテナオーケストレーションシステムというものらしい。

コンテナ化されたアプリケーションの展開、スケーリング、および管理を自動化するためのオープンソースシステムです。

ほげ...(´Д`)

kubectl

kubectlはKubernetesを操作するためのコマンド。gcpを操作するものとは関係ない。gcp上にあるKubernetesを操作するのに使ったりする。

Kubernetesを始めよう!

kubectlのチートシート

やれること多すぎて大変

minikube

Kubernetesを試しに触ってみたい場合minikubeが便利

ローカルVM上でシングルノードのKubernetesクラスタを稼働するやつを使うと気軽に使える。

📌 Mac便利にする編

macをcli上で便利に扱えるコマンドラッパー

m-cli

使い方はこっち観たほうがいいかも?→ https://www.softantenna.com/wp/review/m-cli/

📌 ツール編

絵文字を無限につくる

MEGAMOJI

Slack Emoji Uploader | Chrome ウェブストア

を使うと無限に絵文字が作れる(が動く絵文字(gif)に非対応・・・)

Redashテクニック

Redashで1つのカラムに保存されたJSONデータを取り扱う - LCL Engineers' Blog

🖌 OSSで提供されているダッシュボードツール、Re:dash(リダッシュ)は弊社でもかなり活用されているツールです。

SQLがわかればエンジニア以外も動的にデータを閲覧できるので非常に便利です!

Rico's cheatsheets

Rico's cheatsheets

🖌 様々なチートシートが確認できる。非常におしゃれで見やすい!

circle ci テクニック

CircleCIで.gitディレクトリをキャッシュしてチェックアウトを高速化する - Qiita

iTerm起動できない?

これにハマり、iTermが起動出来ない状態でプチパニックでした

teminalが動かなくなってしまいました - umegusa's blog

レターパックの宛名をPDFでいい感じに出力してくれるサイト

レターパックラベルメイカー

📌考え方編

死活監視

死活監視にはExponential Backoffを考えて実装するといい。

例えば1秒おきに監視して500が返ってくるとき、たまたまか本当にだめなのかを切り分けたい場合もう一秒待ってx5回で確認ではなく、相手のこと思いやり1,2,4,8...秒と少し待ってから確認すると良い。

AWSユーザーは必ず覚えておきたいExponential Backoffアルゴリズムとは何か

exponential backoffのメモ

📌 おすすめ編

フリーフォントのチェックができるサイト

ためしがき

🖌 おしゃれやな〜

📌 小ネタ

chrome 開発者ツール

  • chrome 開発者ツールの console で copy(piyo) を使うと piyo をクリップボードにコピーできる。

  • console に一度表示された Object は右クリックから Strore as Global Variable で変数に格納できるcopy() と組み合わせると便利かも。

  • Style のプロパティ値を⌘ + Clickすると、その指定があるCSSの行まで飛ぶ

Surprise me!

slack の Advanced にある Surprise me! を押すとサプライズされる

🖌 編集後記

ひぇ〜急にtipsの量が尋常じゃなく増えてきてるぅううう。

3人よれば文殊の知恵とかって言うけど、こんだけの人が知見出しまくればすぐに賢者になれそうですね!

さて、今回は2018/07/02 ~ 2018/07/09で放出されたtipsをまとめてみました。こんな感じで弊社の開発部はわいわいがやがややっておりますぞい!

知見はやっぱり貯めるだけじゃなくて使うことで肉になる。得た知見はどんどんみんなで使っていきたいですね。

とはいえ、投げられた知見のスレッドには、使ってみた感想がすぐに集まるのでみんなフットワークが軽い!コミュニケーションが盛んで楽しいですぞ〜。

では、この企画が続けば、また次回に!

最新記事

BananaCI というツールを運用しています

こんにちは。[@endotakuya](https://github.com/endotakuya) です。 突然ですが皆さんは CI/CD 、してますか? オンプレミス型の Jenkins や Drone 、クラウド型の Cir...

endotakuya
2018年12月06日

シグナルと kill コマンドについてちゃんと調べてみた

開発中にプログラムが固まった時に `kill プロセスID` って打ったことがある方は多いかと思います 僕もそうで、 kill コマンドはプロセスを強制終了するためのコマンドだと思っていました ですが puma のログ...

tkhr0
2018年12月06日

Rails における弊社の CSS 設計

Hi. [rigani_c](https://twitter.com/rigani_c) です。 これはベーシックアドベントカレンダーの記事です。仲間たちの投稿一覧はこちら 🎄https://qiita.com/advent-...

rigani
2018年12月02日