AWS S3のJPEG画像のExif情報を一括で削除して更新する

Google PageSpeed Insights*1で、自作のRailsWebサービスの短歌投稿サイトUtakataを調べていたら、「適切なサイズの画像」という項目に引っかかった。詳細を見てみると、アイコンに使われているJPEG画像のサイズが、数KB〜数100KBまで妙に差があることが原因のようだ。

Exifとは、デジタルカメラで撮影した画像データに、撮影条件に関する情報(メタデータ)を追加して保存できる、画像ファイル形式の規格のことである。

同じ大きさの画像なのにファイルサイズが大きく異なるのは、Exifというメタ情報がJPEG画像に保存されていることによるらしい。

試しに上のWebツールでExif情報を除去してみたら、確かにファイルサイズが減った。

Rails + PaperclipでアップされるJPEG画像のExif情報を除去する

UtakataはRails向け画像アップロードライブラリのPaperclipを利用しているので、まずは今後アップされる画像についてはExif情報を除去して保存されるように設定する。

これは上のように、convert_options: { all: '-strip' }を追加するだけでOKだった。

S3のJPEG画像のExif情報を削除して更新する

これで新規にアップされる画像についてはExif情報が除去されるけれど、既にS3にアップされているJPEG画像のExif情報を除去する必要がある。

S3の画像を一括でダウンロードする

S3はWebの画面上の操作で画像を一括でダウンロードできないけれど、AWS CLIコマンドラインインターフェース)を使えば一括でダウンロード/アップロードできることが分かった。

$ brew install awscli

AWS CLIを使うのは初めてだったので、まずはインストールする。

$ aws configure

を実行すると、AWSアクセスキー、シークレットアクセスキー、リージョン情報、Default output format*2の4項目が聞かれるで、それぞれ入力する。

そこまで出来たら、

$ aws s3 cp s3://utakata/ ./utakata --recursive

このコマンドでS3にアップされている内容をそのまま全部ダウンロードする。

Exif情報を一括で除去する

$ find ./utakata/ | grep ".jpe\?g$" | xargs -t -n 10 -P 4 mogrify -strip

その後、上の参考サイトにあるこのコマンドを実行したら、ガガっと一瞬でExif情報が一括で除去された*3

S3に画像を一括でアップロードする

最後に、

$ aws s3 cp ./utakata s3://utakata/  --recursive

このコマンドで一括アップロードしたら、Exif情報が除去された状態ですべての画像が更新されて目的を達成することができた。

f:id:fuyu77:20190316194728p:plain

PageSpeed Insightsのスコアも94点まで出るようになって良い感じだ。

*1:任意のWebページの表示速度をチェックして改善のアドバイスを貰えるWebサービス

*2:デフォルトのjsonの他にtextとtableがあるらしい。取り敢えず何も打たずにエンターで良さそう。

*3:このコマンドを実行するにはImageMagickがインストールされている必要がある。

VSCodeのRuboCop拡張を入れたら捗った

RailsアプリのコーディングスタイルのチェックにRuboCopを使う際に、毎回コンソールから起動するのを面倒に感じていたけれど、会社のエンジニアに教えて貰って、VSCodeのRuboCop拡張があることに気づいた。拡張機能をインストールすると、ファイルを保存する度にRuboCopの警告が表示されて捗る。

ローカルにRuboCopがない場合は、

$ gem install rubocop

を実行する必要がある。

Gillette「ベストな男性」CMを読み解く ―男性性のポジティブな再解釈と逃れ得ない「強さ」への期待―

*1

アメリカの剃刀メーカーGilletteの"We Believe: The Best Men Can Be"というCMが話題になっている。私も視聴してみて興味深く感じたため、その内容と論点を整理したい。

CMの内容 ―Gillette自己批判と新たな男性性の提示―

「有害な男性性」への批判に、呆然とする男たち

冒頭に、世間からの男性性への批判に呆然とする男たちが映る。"Toxic Masculinity(有害な男性性)"という言葉が使われている点に注目すべきだろう。

Gillette自己批判 ―The Best a Man Can Get―

The Best a Man Can Get

その直後に、Gilletteの過去のCMが流れる。"The Best a Man Can Get"というのはGilletteの昔からのキャッチコピーらしい。

「The Best a Man Can Get〜♪」と陽気な歌声が流れ、CM本編の、女性にキスされる男性の映像(旧態的な「ベストな男性」のイメージ)がチラッと映った後に、「バリッ!」とその映像が突き破れられて「古い男性性から離脱する少年たち」が出現する(この「疾走する少年たち」はその後も出て来る)。

「ベストな男性*2」をCMのイメージとして扱って来たGilletteが、自己批判として「これからの男性のありかた」を提唱するのがこのCMの目的だと分かる。

旧態的な男性性の象徴として挙げられるもの

その後に、長く続いて来た「有害な男性性」の発露の具体例として、以下のものが挙げられる。

  • LINEのようなテキストメッセージでいじめられる男の子*3
  • 女性差別的なテレビ番組
  • 女性の社会的活躍を阻害する男性経営者
  • つかみ合いの喧嘩をする男の子

そして最後の喧嘩する男の子のシーンで、"Boys will be boys(男の子はいつになっても男の子、男の子だからしゃーない)"と、腕組みをして低い声で呟き、喧嘩を冷やかに静観する「圧倒的多数の父親たち」がズラッと並ぶ。

セクハラ告発によって「ベストな男性」の意味は変わった

一方で、近年強まる#MeTooなどのセクハラ・性暴力告発によって、そういった男性性をナイーブに良いものとする価値観は大きな転換を迫られており、

And there will be no going back. Because we, we believe in the best in men.
もはや時代が元に戻ることはないだろう。何故なら私たちは、「男としてのベスト」を信じるからだ。

Gilletteは、そういった時代の変化に対して、「男としてのベスト」を追求することで適応することができると言う。

Men need to hold other men accountable

ここで、俳優のTerry Crewsの"Men need to hold other men accountable(男性は他の男性に責任を持たせるべき)"という言葉が場面転換のきっかけとして用いられる。

上の動画を見るに、男性は、セクハラをしている他の男性を見かけたら、その行為を制止すべきというニュアンスが込められているようだ。

この発言に呼応するように、GilletteのCMでも、

  • 水着女性を一方的に撮影するテレビ番組撮影クルーを制止する男性
  • ナンパを制止する男性*4
  • (再び登場する疾走する少年たち)
  • 喧嘩を仲裁する男性*5
  • 娘に自己肯定感を教える父親*6
  • 子供の喧嘩を制止する父親
  • 息子の見ている前で、集団で苛められている男の子を救済する父親

これらの男性が描かれ、それは、

To say the right thing. To act the right way.
正しいことを言い、正しく振る舞う。

ことだと言う。そして、そのような大人の男性のありかたを見て育った"boys"が未来の"men"になると語られ、"THE BEST A MAN CAN GET"と、冒頭に旧態的男性性の象徴として出て来たGilletteのキャッチコピーが、その意味を変えて再び提示されて、CMの幕が引かれる。

Gilletteは、過去のプロモーションに対する自己批判を、新たな男性性の提示へと鮮やかに転換してみせたという訳だ。

CMの論点

男性性を否定するのではなく、ボジティブに再解釈するというアプローチ

ここからは、このCMが提起している論点についての私見を述べる。

まず、旧態的男性性からの離脱を考える場合に、「有害な男性性」を批判するだけではなく、男性性をポジティブに再解釈するというアプローチを取っている点に注目したい。ただ男性性を暴力的なものとして否定するだけだと、男性にとって抑圧的な印象が否めないけれど、このGilletteのCMは「男としのてのベスト」を追求することが、性差別の撤廃や非暴力の実践につながるというビジョンを示している。

マッチョな規範の押し付けを感じる部分も

その一方で、"To say the right thing. To act the right way."の部分に表れているように、何だか規範的な印象も強いCMだ。

特に、"Men need to hold other men accountable"というCrewsの言葉には疑問がある。CMでは美しく描かれているけれど、暴力的な加害者を制止するのは実際には容易なことではないし、男性だって怖いものは怖い。身近な被害について、見て見ぬ振りをせずに可能な範囲で救いの手を差し伸べる、そういった公共心の重要性については同意したい。しかし「同じ男性として、他の男性の加害行為を」というのは根拠のない性役割の押し付けではないだろうか。

このCMは、古い男性性を否定しつつも、「男たるもの、強く、正しく、弱者に優しくあれ」というマッチョな規範を依然として保持している点で、CMに表れている男性のありかたが魅力的で好ましいという点についてはほぼ異論がないとしても、視聴者の男性が自分事として「乗れる」かどうかには個人差が出て来ると思った*7

また、男女二元論的な価値観が自明視されている点も、CMという性質上やむを得ない部分があるとは言え、違和感がある。上で懸念点を示した「同じ男性として、他の男性の加害行為を抑止すべき」という発想についても、「同じ男性として」の部分に、「そこをそんなに自明に言ってしまって良いのだろうか」という引っかかりを感じる部分があるのだ。

男性主体の運動になっていない

このCMのYouTubeの評価を見ると、低評価が高評価の2倍近くになっている*8ことにも注目したい。多くの視聴者の反発を呼んでいるということだ。

また、Twitterで「ジレット」で検索すると、そういった男性の反発を嘆くフェミニストの声が多くヒットする*9

上の渡辺さんの記事に代表されるように、このCMを評価する声の大部分は、「有害な男性性」を無害化したい「非当事者の声」に占められているように見える。

Gilletteの#TheBestMenCanBeは、十分に当事者的な運動になっていないというのが率直な印象だ。少し想像力を働かせてみれば、このCMは肯定的なメッセージを含みつつも、押し付けがましい点も多く、素直に支持できない男性もそれなりにいるであろうことは納得できるはずだけれど、そういった部分の指摘がすぐにアンチフェミ的であったり、「有害な男性性」の発露だと糾弾されかねないような空気感があることは残念に思う。

私がメンズリブを通してやりたいこと

私見をまとめると、映像作品としてのクオリティは素晴らしく、社会批評としての見所もたくさんあったけれど、CMが打ち出している「望ましい男性のありかた」については十分に共感できなかった。共感できなかったのは、「否定すべき男性性」と「望ましい男性性」があらかじめ「非当事者的に」揺るぎなく決まっていて、それをトップダウンで押し付けられているような印象が感じられたからだと思う。

私は昨年からうちゅうリブというメンズリブの団体*10をやっているけれど、この活動では、「有害な男性性」や「望ましい男性性」をあらかじめ設定しない、当事者性を重視した緩い連帯を模索してゆきたいと考えている。

GilletteのCMに表現されているように、社会的に「加害者」として告発される体験を通じて、男性ジェンダーには困惑が生じている*11。この困惑に向き合い、自分なりの落とし所を見つける中で、ジェンダーの問題に当事者的に向き合う必要性を感じている男性も増えて来ているだろう。そういった模索の中で、各自が辿り着く答えは、GilletteのCMに表れているような画一的なものにはならないということは確かだと思う。

追記*12

この記事では私の見解を示したけれど、記事の論旨に否定的なものも含めて、補足情報を追記したい。

TLで実施したアンケート

TLでアンケートを実施したところ、YouTubeの評価とは異なり、肯定的な評価が大幅に優勢となった。

Gilletteの見解

ジレットのチームは全米の男性たちから意見を聴くなど独自の調査を重ね、専門家の助言を受けながらコマーシャルを制作したという。

この記事では「男性主体の運動になっていない」と批判したけれど、Gilletteの制作チームの視点では、当事者の声を十分に収集して作られたもののようだ。

P&GグループとしてのGillette

Gilletteポリティカル・コレクトネスを意識したCMを打ち出した背景に、P&Gグループの存在を挙げる声が複数寄せられた。

http://b.hatena.ne.jp/entry/4663425809213202081/comment/shibaone


CMのマッチョイズムを指摘する声

この記事と同様に、CMのマッチョイズムを指摘する記事をいくつか見つけた。

世間の言う「男らしさの否定」は、今回のCMのように、暴力とかセクハラに代表される男性性がもたらす負の側面にNoを突きつけるものがほとんどである。
それはそれで大事なものであるが、一方で男性性がもたらす正の側面(男は女を守るべきであるという規範、たくさん稼ぐ男は立派であるという価値観)は滅多に問題とされない。

誰もが薄々気づいているとは思うが、男性性のもたらす負の側面と正の側面は簡単に切り離せるものではない。
「男は女を守るべき」という規範がある限り、力の強い男が優れている存在とされ、強権的に振る舞うことができてしまう。

では、「男らしさ」から脱却するために必要な態度とはどのようなものだろうか。

それは「弱い男」「ダサい男」「頼りない男」を否定しないことだと愚考する。
刃物に怯え逃げる「弱い男」、おごってくれない「ダサい男」、声の小さい「頼りない男」を決して見下さず、彼らを対等な人間として扱うことがスタートラインなのである。

ジレットのCMの件で思ったけど。
正直、ジレットのCMは新たな男性性の押しつけに過ぎないしあんまり俺も共感できなかった。
あたらしいマチズモを作り出そうとしてるだけだと思うし。

Twitterでも同様の意見を複数いただいている。


議論を強く喚起するCMになっていることは間違いない

上に揚げたCNNの記事には、

ジレット・ブランドの北米責任者は「議論が起きることは予想していた。話し合う機会がなければ真の変化は起きない」「私たちにとって最大の敵は、行動を起こさないこと」と話す。

このようにあるが、このCMが議論を強く喚起する作品になっていることは間違いない。ジェンダー対等な社会を構想していく中で、男性がこういった問題を自分の言葉で考えていけるようになるのは重要なことだと思う。

*1:2019/02/09追記。NHKが記事を削除したので、はてブページに変更。NHKの記事を削除する運用については何のための公共放送なのかといつも疑問に思う。

*2:直訳的には「男としてのベスト」。

*3:"Sissy"(女々しい)などの言葉が、男性規範と関連していると思われる。

*4:この人の"Bro, not cool. Not cool."の発音のノリが好きで何回か見返してしまった。

*5:CM内のフィクションではなく、路上で撮影された動画が用いられている。

*6:CM内のフィクションではなく、一般家庭で撮影された動画が用いられている。

*7:これは上に述べた「男性性のポジティブな再解釈」というこのCMの強みの裏返しとして起きている効果なので、なかなか悩ましい問題ではある。

*8:2019/01/20現在。

*9:2019/01/20現在。

*10:精確に言うと、男性ジェンダーへの関心を中心とした語り合いの場で、男性でなくても誰でも参加できる。

*11:GilletteのCMにも戸惑う男性の表情のアップが印象的に表現されていた。

*12:2019/01/21追記。

.byebug_historyを自動生成しないようにする

Railsデバッグにbyebugを使うたびに、何の役に立つのか分からない.byebug_historyが生成されてウザかったので、生成しないようにする方法を調べたら、公式のIssuesに答えがあった。

.byebugrcRailsのルートディレクトリに作成して、

と書いて保存するだけ。

それにしても、自分の打ったコマンドが保存されるだけの.byebug_historyには、本来どのような使い途があるのだろうか。どなたか知っていたらコメントで教えてください。

はてなブログのTwitter連携が解除されていたことに気づいた

f:id:fuyu77:20181125212906p:plain

気づいたらはてなブログのプロフィールのTwitterフォローボタンが消えていた(上の画像は復旧後)。

公式から再設定のアナウンスがあったことに今更気づく。

早速外部サービス連携の設定から再連携を行う。

しかし再設定後も、フォローボタンが一部のページでしか表示されない。

  1. はてなブログダッシュボード>デザイン>カスタマイズ>サイドバー>プロフィール編集>Twitterフォローボタン「表示する」のチェックボックスをオフ>適用>変更を保存する
  2. 同上>Twitterフォローボタン「表示する」のチェックボックスをオン>同上

のように、一旦フォローボタンの表示設定を外してからまた付け直すことで正常にTwitterフォローボタンが表示されるようになった。

はてなブックマークTwitter連携も色々と怪しい

f:id:fuyu77:20181124082553p:plain


はてなブックマークTwitter連携機能も10月辺りから挙動が怪しくなっている。私が発見しただけでも、

  • タイトルがURL末尾の文字列に置き換わることがある(上の画像)
  • 一部ページがTwitter連携でブクマしてもTwitterに投稿されない(一部のはてな匿名ダイアリーのページ?)

これらの不具合があった(両件ともはてなに報告済み)。

はてなブックマークTwitterは相性の良いサービスで、連携することで素晴らしいシナジーを発揮できると感じているので、諸々の不具合が解消されることを期待したい。

RailsアプリをHerokuにデプロイした際にApplication errorとなった場合の対処法

f:id:fuyu77:20181125185536p:plain

いつも通りHerokuにデプロイしてサイトにアクセスしたら、上のような画面が出て来て焦った。

画面に書いてある通りに、

$ heroku logs --tail

しても、desc="App crashed"とか書いてあるよく分からないログが出て来るだけで原因特定できない。

ググったら上のStackOverflowが解決策を示してくれた。

 $ heroku run rails console

したら、Rubyファイルにカンマが抜けているシンタックスエラーですよというエラーメッセージが出て来た。実に簡単な話だった。

最近は英語でググる→StackOverflowで問題解決することが多い。素晴らしいサイトだと思う。

Strong Parametersの中身を変更する

RailsのStrong Parametersの中身を一部変更してから更新する必要があり、最初に上のように書いてみたところ、変更は反映されなかった。

この問題の解法は上のStack Overflowに載っていた。

最初に変数に代入しなければ変更できないという、言われてみれば当たり前のような気のする話だった。