Inside PRESSBLOG

PRESSBLOG / Instagram / SNS マーケティングとか

世紀末の渋谷ハロウィンから逃避して、千葉で開発合宿をした話

どうも、モテモテになりたいmotemotentenです。10/30~11/1 にかけて、千葉の 土善旅館 にて開発合宿を行いました。 参加者はPRESS BLOGの開発チームの以下4名です。(ライターの主観が入っています)

  • sainu

    • 愛されCTO 兼 CEO ( Cheif Esa Officer )
    • ツッコミ担当
    • 弊社には珍しい常識人
    • PRESS BLOG の開発
    • インスタグラマー www.instagram.com
  • redhairedsomu

    • 赤髪のシャンクスプログラマー、リードエンジニア
    • PRESS BLOG の公式iPhoneアプリの開発
    • 口癖は「チュパチュパ」
    • 最近ハマっていることは、盆栽
    • よくお菓子くれる
    • オフィスのBGM担当、DJ、替え歌得意
    • いびきなら誰にも負けない
  • key

    • 社内ツールの開発
    • パパ担当
  • motemotenten

    • 新規事業のサービス開発
    • 幹事
    • みんなの弟

1日目

出発

f:id:motemotenten:20181102031844j:plain

弊社の開発陣はみんな夜型なので、眠気の中出発です。

f:id:motemotenten:20181102032145j:plain

パパ担当のkey の運転で宿まで向かいます。

車内では、二刀流で有名な大谷翔平と同じく岩手出身のredhairedsomu が田舎あるあるを披露し盛り上げてくれました。

ランチ

www.instagram.com

ランチはしじみ丼が有名な 青柳亭 にて食べました。 the 地元のお食事処という感じで、赤髪のredhairedsomuは完全に浮き気味でした。

土善旅館到着

f:id:motemotenten:20181102032734j:plain

渋谷から車で2hほどで到着しました。

f:id:motemotenten:20181102032842j:plain f:id:motemotenten:20181102032851j:plain f:id:motemotenten:20181102032905j:plain

開発部屋の様子。外部ディスプレイや Yogibo・電源タップにホワイトボード・200インチのスクリーン&プロジェクタまで完備されていて、この充実具合に思わずCTOも思わず2件連続tweetしていました。

テーマ発表

f:id:motemotenten:20181102033454j:plain f:id:motemotenten:20181102033513j:plain f:id:motemotenten:20181102204921j:plain f:id:motemotenten:20181102034605j:plain

荷物を置き、ホッと一息ついてから、今回の合宿での開発目標の発表をしました。 今回は各メンバーそれぞれ自身の通常業務を行うという形でしたが、今後人数増えていくにしたがって参加者で一つのテーマに着手するような形でもやりたいですね。

開発

f:id:motemotenten:20181102200125j:plain f:id:motemotenten:20181102033947j:plain f:id:motemotenten:20181102194710p:plain

猫と戯れつつも各自、淡々と進捗を生んでいきます。

夕食

www.instagram.com

待ちに待った夕食です。基本弊社のエンジニアはコンビニ飯なので、こういった食事は体に染みました。

二日目

ランチ

www.instagram.com

二日目のランチは、表参道にあってもおかしくないような佇まいのとんかつ屋さんのいなよし にてランチを食べました。

食後は、運動も兼ねて車で海に行きました。海まではだいたい土善旅館から車で20分程度でした。

f:id:motemotenten:20181102035005j:plain

各自広大な海を目の当たりにして、いろいろ思うところがあったようです。

宿に帰り開発!

f:id:motemotenten:20181102200259j:plain f:id:motemotenten:20181102035248j:plain

立ち作業でも進捗を生んでいきます。

夕食

f:id:motemotenten:20181102035525j:plain

二日目の夕食は串焼きでした。

f:id:motemotenten:20181102035602j:plain

なお、ハロウィーン仕様になっていた模様。

pressblog.me

ちなみに PRESS BLOG もハロウィーン仕様でした。

開発の追い上げ、渋谷ハロウィンに対抗

f:id:motemotenten:20181102200947j:plain

開発合宿もハロウィン仕様になりました。

f:id:motemotenten:20181102040218j:plain

ワリオもお疲れの模様です。

f:id:motemotenten:20181102040318j:plain

そしてここから追い込みます。

f:id:motemotenten:20181102201318j:plain f:id:motemotenten:20181102201336j:plain

結局この日はみんな朝食まで開発していました。

最終日

成果発表

f:id:motemotenten:20181102201436j:plain f:id:motemotenten:20181102041229j:plain f:id:motemotenten:20181102041256j:plain

朝まで開発した成果はどうでしょうか

f:id:motemotenten:20181102041419j:plain

ご満悦の様子です。

まとめ

f:id:motemotenten:20181102203503j:plain

非日常感というのが集中力を高めてくれていて、生産性が高い状態で作業ができました。

そんな PRESS BLOG ではエンジニアを募集しています。

  • 業務歴3年以上
  • 転職希望
  • toC向けサービスをやりたい

上記に当てはまる人は以下のアカウントに連絡してください!

twitter.com

月間2000万pvでている http://pressblog.me というブログサービスの開発、または、その周辺プロジェクトの開発を一緒にしてくれる仲間を探してます!!

参考になった記事

qiita.com kan-kikuchi.hatenablog.com

渋谷で働くちょいワル(?)社長おすすめの2万のビジネス書を読んでおもったことを書く

どうも、事業を成功させてお金を稼いでモテモテになりたいmotemotentenです。事業をやってきてモテモテになった社長の溝口(自称稼ぐ前からモテてたらしい)を超えるべく先日このブログで紹介したユダヤの商法を読んだので、思ったことを書きたいと思います。

こちらのブログの続きです。気になる方はこちらも読んでみてください。

inside.pressblog.me

ユダヤの商法―世界経済を動かす (ワニの本 197)

ユダヤの商法―世界経済を動かす (ワニの本 197)

この「日本マクドナルド」創業者の藤田田が書いた「ユダヤの商法」を要約すると主に以下の3つの内容に集約されます。

  • 商売をするときは、女(女性)と口(食品)を狙え
  • 数字と時間を大事にしよう
  • 契約は必ず守ろう

商売をするときは、女(女性)と口(食品)を狙え

まず1つ目についてです。女性をターゲットにした商売をするべきというのは大いに賛成です。オフィスにいても、女性はいつもオシャレで華やかな格好をしていて、僕とかはユニクロの3つで500円とかのTシャツを着ています。明らかに女性の方がお金を使います。異議は認めません。

総務省の平成26年全国消費実態調査でも、「単身世帯のうち勤労者世帯の実収入は,男性が女性よりも多い」「単身世帯のうち勤労者世帯の消費支出は,女性が男性よりも多い」という調査結果がでてるそうです。

http://www.stat.go.jp/data/zensho/2014/pdf/gaiyo2.pdf

ただ口に入れるもの(食品)を狙うというのは、あまり賛成できません。これだけ、様々なチェーンの飲食店が増えてる今、新しくそこに参入するというのはなかなか厳しい気がします。

ちなみに僕がよく食べるのは、大盛り券が無料の富士そばの300円のもりそばです。

数字と時間を大事にしよう

次に2つ目です。ユダヤ人は、数字に強くて時間を大切にするそうです。 数字に強いという性質は、仕事のできる人に共通していることだと思っていて、基本的に仕事ができる人は意思決定を数字で行う人が多いと思います。ちょっとしたことでも自分なりの仮説で数値化して、判断しています。たとえば、東京にあるマックが何店舗かというようなことを考えるときに、渋谷には3店舗くらいあり、東京にある駅の平均のマックの店舗数が1.5店舗だと仮定すると、東京には654駅あるので、654*1.5=981店舗ということになります。(ちなみに、東京にあるマックの数は340軒だそうです。) 今回は外しましたが、数字に強いというのは商売をする上で大事な要素だと思います。

マクドナルド店舗数【総数順】 [ 2018年第一位 東京都 ]/都道府県別統計とランキングで見る県民性

もう一つ時間についてですが、ユダヤ人は時間を非常に大切にするそうです。これも仕事のできる人に共通することですが、電話・急な訪問など、予定せずに相手の時間を奪うようなことは絶対にしない気がします。僕も日々、ありとあらゆる時間を計測して、「あー、ちょっと友達と話しすぎちゃったな」とか反省したりしてます。

数字に強くあることと、時間を大切にすることは、圧倒的同意です。

契約は必ず守ろう

最後の「契約を必ず守ろう」ですが、これはいわゆる法的な契約書と個人同士の約束の両軸あると思ってます。法的な契約書できちんと条件を握っておくのは、外国に比べると日本ではまだ甘いところがあると思っていて、そういう意味で約束をちゃんと明文化して契約書という形で合意を取るというのは、お金を扱う上で非常に大事だと思います。個人同士の約束という点も、一度やると言ったことを必ずやるというのが、一つ一つ信頼になっていくので、商売をやる上では大事だと思いました。

3つ目だけなんとなく雑になってしまいましたが、そんなこんなで今日は失礼したいと思います。最後まで読んでくれてありがとうございました。今amazonで2万にまでなっている絶版本を借りたい人・"挑戦する全ての人に公正に活躍するチャンスを提供する" 月間2000万PVのPRESS BLOG の運営に関わりたい方は以下に連絡してください!!

twitter.com

PRESSのちょいワル(?) 社長が今若者に読んでほしい本5選+α

どうも、最近 PRESS BLOG を手伝っているエンジニアの motemotenten です。久しぶりに食べた松屋の牛丼が美味しすぎて涙が出ました。

ところで、今日も黒い画面をカタカタやってたわけですが、仕事の合間に PRESS を作ってる凄腕エンジニアの @sainu さんと PRESS を作った社長の話になりました。そうするとどうやら、PRESS を作った社長は、どうやら今までいろんな事業をやってきていて、商売の天才らしいということを聞きました! 普段牛丼を食うお金すら惜しくなる僕は、それを聞いて思いました!「よし僕もこっそり社長からそのエッセンスを聞いて商売して、松屋の普通の牛丼じゃなくて、チーズ牛丼毎日食ってやる」と。

ということで、僕が話しかけたら慌てて YoutTube を閉じた社長の溝口(@yasainet)におすすめされた本を紹介します。(本当はみんなには内緒にしたいのですが、社長に言われたのでしょうがなくこの記事を書きました。)

1. ユダヤの商法―世界経済を動かす

ユダヤの商法―世界経済を動かす (ワニの本 197)

ユダヤの商法―世界経済を動かす (ワニの本 197)

この本は、「日本マクドナルド」「日本トイザらス」を作った藤田田さんが書いた本で、お金持ちが多いとされるユダヤ人のビジネスにおけるノウハウが書いてあるそうな。

藤田田 - Wikipedia

なおソフトバンクを作った孫さんもどうやらこの本を熟読しているらしいです。

newspicks.com

社長がこの本において大事にしていることは、特定の土地をもたない民族が商売で成り上がった背景を知ることと、女性を相手に商売することでした。 商売の方法は数多くあるかもしれないが、社長が入信した商売の宗教はこのユダヤの商法らしい。

なお、今は絶版になってしまっているようで、Amazonで買おうとすると、二万弱くらいかかるので、さっそく買った僕は、今月もチーズ牛丼が食べられなさそうです。

2. 女の一生

女の一生 (新潮文庫)

女の一生 (新潮文庫)

話し合いの途中から、「私も聞いていいですか?」と参加してきた、早稲田大学に在籍しながらPRESSでインターンをしている @maiyan に、社長が読んでほしい本だと言ってました。

おとぎ話のようなロマン主義の時代から打って変わって、自然主義文学の時代の作品であり、救いのない話だと。

一人の女性として、人間として、これを読んでどう感じるのか。 若いうちに、自然主義であったり現実主義に触れることで、自身の価値観を考え直すきっかけになるのでは、と話をしていた。

3. 封神演義・水滸伝・史記・項羽と劉邦・三国志

「これはちょっと頭をよく見せる”tips”なんだけど」と、言い出した社長。 なんのことやら、と話を聞いていたら以下のように話をしていた。

キングダムって流行ってるよね?
まずキングダムの歴史的背景を知るために、その前後の本も予備知識として知っておいたほうがいい。
キングダム単体だけではなくて、封神演義・水滸伝・史記・項羽と劉邦・三国志まで読破しておくことで、ある程度は中国の歴史を学ぶことができるよね。
そうすることで、キングダムの時代におきた”法治国家”になったことの重みが理解できたりする。
前後の文脈を知ってるか知らないかで、キングダムの解像度と輪郭がくっきり見えてくると思う。

それに、この前後を知っているだけで、勝手に感心されてよく勉強してる人だなって思われるんだよ。

とのこと。

映画、音楽、娯楽、小説、インターネットのサービスなどなど、すべての物事において前後の文脈への理解があることで、解像度と輪郭が見えてくるという話だった。

なるほどなー!

4. わが闘争

わが闘争(上)―民族主義的世界観(角川文庫)

わが闘争(上)―民族主義的世界観(角川文庫)

ヒトラーの本。 近代における良くも悪くも大きな影響力を与えた人の本は読んでおくべきだと話をしていた。 特に、大事にしているのは大衆性(ポピュラリティ)だった。

社長がキングダムの話をしているときに、呂氏春秋における一字千金の話をしていた。 いままで法治国家じゃなかった国が、法治をするために、大衆にまで法を説いた一字千金の話と関係しているとのこと。

正論をそのまま伝えても、大衆は動かない。会社も動かない。 大事なのは、大衆が動くように共感を得ながら扇動しつつも本質は外さないこと。

歴史的に見て批判を受けているかもしれないが、悪いところだけではなく、なぜそこまで大衆を扇動することができたのか?という点に着目してほしいとのことだった。

5. 聖書・コーラン・死者の書

宗教や死生観にまつわる本だが、ここで大事にしてほしいことは2つだと話をしていた。

  1. 過去の歴史上最も出版された聖書を読むということ。 激動している歴史の中で、ここまで残っている文章には真理が多くあるのではないかと話をしてた。 「100年残っている言葉は真理だと考えていい」というのは印象的だった。 ちなみに採用において大事にしたことは「先ず隗より始めよ」らしい。 いい部下が欲しかったら、まずは側近の部下の待遇を良くすることである、とのこと。 それによって @sainu の給料があがって、いい開発メンバーが増えたことはあとから聞いた。 なるほど、僕の給料も早々に上げてほしいものである!

  2. 日本では中国文化に影響された倫理観が多く散見されていることから、世界中の倫理観や死生観を学ぶべきだという話。 アフリカ、欧米、アジアとざっくり分けて、それぞれの死生観に触れることは、自分の価値観や判断基準をひろげる手助けになるだろうとのこと!


以上、社長が今若者に読んでほしい本でした。

上記の本を借りたい・自分も社長の @yasainet と話してみたい・"挑戦する全ての人に公正に活躍するチャンスを提供する" 月間2000万PVのPRESS BLOG の運営に関わりたい方は以下に連絡してください!!

twitter.com

追記 - この話を聞いた後、松屋で牛丼をごちそうになりました。本当に美味しかったです。ごちそうさまでした。

スマブラ一筋で生きてきたゲーマーがPRESSにジョインした話

2018年5月27日 PRESSに入社しました。大阪出身、現在二十歳のえつじ( えつじ(@kn_tsuji)さん | Twitter )と言います!

ゲーマーとして生きてきた10代

軽く自己紹介させてもらうと、根っからのゲーマーで中学から6年前後、任天堂のゲーム、スマブラに大半の時間を捧げる人生をおくってきました。

f:id:etsujix:20180528130247j:plain


月に一回行われる大会を楽しみに毎日を過ごし、才能があったのか、ぐんぐん実力を伸ばし、早いペースで日本でも有数のトッププレイヤーになりました。 思い返すと僕にとってスマブラは、部活動の代わりの様な存在であったと思います。

参考記事&動画  fgamers.saikyou.biz

1P側、シークが自分です。 www.youtube.com

スマブラをプレイする事への葛藤

そんな情熱を注いでいたスマブラですが、段々とプレイする時間が減っていきました。 ゲーム以外にも何かしなくちゃという気持ちや、消費するだけの毎日に嫌気が差していたんです。 当時、ゲームで食っていくという考えが無かったわけではないですが、そんな突き抜ける気概も根性もなく気持ちに蓋をし、違う分野で食えるようになったらまた戻ろうと言った感じでゲーム活動はほぼストップしました。俗に言う妥協です。

自分と同じフィールドにいたかつてのプレイヤーが活躍する話を聞くたび、耳を塞いで「やれば俺だって」という想いで唇を噛みしめ、気持ちを抑えました。

そんなこんなで、自分に合うものは何かと探し奔走していた所、ITエンジニア職に目が止まりました。 エンジニアは実力をある程度つければ、フリーで自由に働くことができる。という情報が魅力的で、「これならスマブラ活動と両立していけるんじゃないか」と思い、目指すことに決めました。

そう決めてから、東京のプログラミングスクールに行くために上京。本格的に勉強を始めました。が、スクールでの勉強はイマイチ集中できず、モチベーションが低迷していました。 日に日に実践で身に付けたい、どうにか現状を変えたいという思いが強くなり、何か行動しようとツイッターでベンチャー企業のCEOさん何人かに会いに行くことに。 PRESSの匠さん(溝口匠😣❣(@yasainet)さん | Twitter)もその内の一人でした。

匠さんと会ってスマブラの話をすると、面白がって頂いて、スポンサードしてもいいと言われ衝撃を受けました!エンジニアとして学びつつ、スマブラに打ち込める環境があるんだと。 この最高の環境で頑張るしかないと! スクールを辞退し、入社を決意するに到りました。

PRESSのえつじとして、世界一を目指す

最後に目標ですが、スマブラでは世界一のプレイヤーになります。 やりさえすれば一番強いのは自分だと、証明したいです! そして、広告塔としての自覚を持って、アピール力を高めていきたいと考えています。 エンジニアとしては、作品を完成させた経験がまだないので、作品を生成し、実務に携われるよう精進したいと思います! どちらの分野でも、PRESSの一員として貢献出来る様になります!どうかよろしくお願いします。

追記
対戦相手は常時募集中ですので、いつでもお声がけください(^ ^)

Linuxディスク使用量を100%から40%まで減らした

こんにちは、PRESSの開発統括をしているさいぬ(sainu_____)です。

今回は、EC2インスタンスのディスク使用量が100%になり、サーバーが落ちてしまったので、その時に施した対応についてまとめたいと思います。

状況把握

とりあえずディスク使用量を df コマンドで確認します。

[ec2-user@ip-172-31-15-187 log]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       59G   59G  00G  100% /
devtmpfs        1.9G   56K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm

# 左から以下の項目で表示されます
# ファイルシステムの名前 割りあてサイズ 使用領域サイズ 空き領域サイズ 使用率 マウントポイント

Use% が100%で、ファイルシステムの容量がいっぱいになってしまっています。

ディスクがいっぱいだと、データの書き込みができなくなり、サーバーのプロセスが停止してしまうことがあります。つまり、サーバーが応答しなくなります。

サイズが大きいファイルを探す

サーバーのファイルシステムを圧迫している主な原因はだいたいログファイルです。また、PRESSではnginxとRailsで開発しているので、nginxとRailsのログファイルが含まれるディレクトリのサイズを確認してみます。

出力のメモを取り忘れてしまったので、入力コマンドだけ・・・

以下のコマンドで、nginxとrailsのログの使用量を見てみます。すると、それぞれ合わせて30GB近くありました。まずいですね、ログローテーションをちゃんと設定していればこんなことにはなりません。

[root@ip-172-31-15-187 nginx]# du -h --max-depth=1 /var/log
[root@ip-172-31-15-187 nginx]# du -h --max-depth=1 /var/www/press/shared

-hオプションはサイズをGBMBのように、桁数が大きい容量に関しては単位を付けて見やすく表示します。

--max-depth=1は、出力するディレクトリ階層を1段階に指定します。これを省略すると、ディレクトリを再帰的に表示するので、サイズが大きいディレクトリが特定しにくくなります。

圧縮

では、nginxとrailsのログファイル内を見てみます。

[root@ip-172-31-15-187 nginx]# ls -lah
total 23G
drwx------ 2 nginx nginx   12K May 26 03:42 .
drwxr-xr-x 8 root  root   4.0K May 26 16:03 ..
-rw-r--r-- 1 nginx nginx   58M May 26 18:25 access.log
-rw-r--r-- 1 root  nginx  407M Dec 19 03:43 access.log-20171218
-rw-r--r-- 1 root  nginx  1.2G Dec 24 03:46 access.log-20171220
-rw-r--r-- 1 root  nginx  1.2G Dec 30 03:30 access.log-20171226
-rw-r--r-- 1 root  nginx  321M Jan  1 03:11 access.log-20171231
-rw-r--r-- 1 root  nginx  2.5G Jan 10 03:12 access.log-20180102
-rw-r--r-- 1 root  nginx  2.4G Jan 16 03:25 access.log-20180111
-rw-r--r-- 1 root  nginx  1.2G Jan 18 03:14 access.log-20180117
-rw-r--r-- 1 root  nginx  976M Jan 20 03:16 access.log-20180119
-rw-r--r-- 1 root  nginx  2.5G Jan 25 03:14 access.log-20180121
-rw-r--r-- 1 root  nginx 1017M Jan 27 03:43 access.log-20180126
-rw-r--r-- 1 root  nginx  1.1G Feb  7 03:16 access.log-20180202
-rw-r--r-- 1 root  nginx  425M Feb 10 04:41 access.log-20180209
-rw-r--r-- 1 root  nginx  309M Feb 12 03:12 access.log-20180211
-rw-r--r-- 1 root  nginx  1.2G Feb 20 03:41 access.log-20180213
-rw-r--r-- 1 root  nginx  255M Feb 25 03:24 access.log-20180223
-rw-r--r-- 1 root  nginx  614M Mar  2 03:35 access.log-20180226
-rw-r--r-- 1 root  nginx  211M Mar  7 03:33 access.log-20180306
-rw-r--r-- 1 root  nginx  327M Mar 17 04:20 access.log-20180315
-rw-r--r-- 1 root  nginx  291M Mar 20 03:43 access.log-20180318
-rw-r--r-- 1 root  nginx  241M Mar 30 03:18 access.log-20180329
-rw-r--r-- 1 root  nginx  457M Apr  6 03:20 access.log-20180403
-rw-r--r-- 1 root  nginx  209M Apr 10 03:19 access.log-20180409
-rw-r--r-- 1 root  nginx  205M Apr 12 03:19 access.log-20180411
-rw-r--r-- 1 root  nginx  187M Apr 16 03:18 access.log-20180415
-rw-r--r-- 1 root  nginx  163M Apr 19 03:23 access.log-20180418
-rw-r--r-- 1 root  nginx  7.2M Apr 20 03:28 access.log-20180420.gz
-rw-r--r-- 1 root  nginx  7.2M Apr 21 04:29 access.log-20180421.gz
-rw-r--r-- 1 root  nginx  8.8M Apr 22 03:42 access.log-20180422.gz
-rw-r--r-- 1 root  nginx  314M Apr 25 03:45 access.log-20180423
-rw-r--r-- 1 root  nginx  7.4M Apr 26 03:06 access.log-20180426.gz
-rw-r--r-- 1 root  nginx  5.5M Apr 27 03:37 access.log-20180427.gz
-rw-r--r-- 1 root  nginx  6.1M Apr 28 03:26 access.log-20180428.gz
-rw-r--r-- 1 root  nginx  184M Apr 30 03:17 access.log-20180429
-rw-r--r-- 1 root  nginx  375M May  4 03:18 access.log-20180501
-rw-r--r-- 1 root  nginx  251M May  6 12:20 access.log-20180505
-rw-r--r-- 1 nginx nginx  1.7M May  7 03:24 access.log-20180507.gz
-rw-r--r-- 1 root  nginx  9.2M May  8 03:30 access.log-20180508.gz
-rw-r--r-- 1 root  nginx  8.0M May  9 03:25 access.log-20180509.gz
-rw-r--r-- 1 root  nginx  328M May 12 03:16 access.log-20180510
-rw-r--r-- 1 root  nginx  273M May 14 00:30 access.log-20180513
-rw-r--r-- 1 nginx nginx  658K May 14 03:09 access.log-20180514.gz
-rw-r--r-- 1 root  nginx  440M May 17 11:50 access.log-20180515
-rw-r--r-- 1 nginx nginx   90M May 18 09:55 access.log-20180518
-rw-r--r-- 1 nginx nginx  282M May 20 07:49 access.log-20180519
-rw-r--r-- 1 nginx nginx  126M May 21 04:58 access.log-20180521
-rw-r--r-- 1 nginx nginx  223M May 23 08:33 access.log-20180522
-rw-r--r-- 1 nginx nginx  198M May 25 03:17 access.log-20180524
-rw-r--r-- 1 nginx nginx  142M May 26 09:00 access.log-20180526
-rw-r--r-- 1 nginx nginx  428K May 26 17:45 error.log
-rw-r--r-- 1 root  nginx  4.6M Dec 19 03:43 error.log-20171218
-rw-r--r-- 1 root  nginx  7.4M Dec 24 03:18 error.log-20171220
-rw-r--r-- 1 nginx nginx   205 Dec 20 03:38 error.log-20171221
-rw-r--r-- 1 nginx nginx   207 Dec 21 03:39 error.log-20171222
-rw-r--r-- 1 nginx nginx   207 Dec 22 03:48 error.log-20171223
-rw-r--r-- 1 root  nginx  2.4M Dec 30 03:00 error.log-20171226
-rw-r--r-- 1 nginx nginx   205 Dec 26 03:20 error.log-20171227
-rw-r--r-- 1 nginx nginx   207 Dec 27 03:28 error.log-20171228
-rw-r--r-- 1 nginx nginx   207 Dec 28 03:33 error.log-20171229
-rw-r--r-- 1 root  nginx  524K Jan  1 03:07 error.log-20171231
-rw-r--r-- 1 root  nginx  551K Jan 10 02:39 error.log-20180102
-rw-r--r-- 1 nginx nginx   207 Jan  2 03:14 error.log-20180103
-rw-r--r-- 1 nginx nginx   207 Jan  3 03:39 error.log-20180104
-rw-r--r-- 1 nginx nginx   207 Jan  4 03:35 error.log-20180105
-rw-r--r-- 1 nginx nginx   205 Jan  5 03:45 error.log-20180106
-rw-r--r-- 1 nginx nginx   207 Jan  6 03:41 error.log-20180107
-rw-r--r-- 1 nginx nginx   205 Jan  7 03:30 error.log-20180108
-rw-r--r-- 1 nginx nginx   207 Jan  8 03:22 error.log-20180109
-rw-r--r-- 1 root  nginx   12M Jan 16 03:24 error.log-20180111
-rw-r--r-- 1 nginx nginx   207 Jan 11 03:49 error.log-20180112
-rw-r--r-- 1 nginx nginx   207 Jan 12 03:27 error.log-20180113
-rw-r--r-- 1 nginx nginx   205 Jan 13 03:25 error.log-20180114
-rw-r--r-- 1 nginx nginx   207 Jan 14 03:11 error.log-20180115
-rw-r--r-- 1 root  nginx   37M Jan 18 02:58 error.log-20180117
-rw-r--r-- 1 root  nginx  1.7M Jan 20 03:15 error.log-20180119
-rw-r--r-- 1 root  nginx   75M Jan 25 03:03 error.log-20180121
-rw-r--r-- 1 nginx nginx   207 Jan 21 03:20 error.log-20180122
-rw-r--r-- 1 nginx nginx   207 Jan 22 03:38 error.log-20180123
-rw-r--r-- 1 nginx nginx   207 Jan 23 03:10 error.log-20180124
-rw-r--r-- 1 root  nginx  4.4M Jan 27 03:32 error.log-20180126
-rw-r--r-- 1 root  nginx 1019K Feb  7 03:13 error.log-20180202
-rw-r--r-- 1 nginx nginx   207 Feb  2 03:19 error.log-20180203
-rw-r--r-- 1 nginx nginx   205 Feb  3 03:12 error.log-20180204
-rw-r--r-- 1 nginx nginx   207 Feb  4 03:43 error.log-20180205
-rw-r--r-- 1 nginx nginx   207 Feb  5 03:26 error.log-20180206
-rw-r--r-- 1 root  nginx  287K Feb 10 04:38 error.log-20180209
-rw-r--r-- 1 root  nginx  161K Feb 12 03:05 error.log-20180211
-rw-r--r-- 1 root  nginx  1.2M Feb 20 03:38 error.log-20180213
-rw-r--r-- 1 nginx nginx   207 Feb 13 03:48 error.log-20180214
-rw-r--r-- 1 nginx nginx   205 Feb 14 03:06 error.log-20180215
-rw-r--r-- 1 nginx nginx   207 Feb 15 03:18 error.log-20180216
-rw-r--r-- 1 nginx nginx   205 Feb 16 03:21 error.log-20180217
-rw-r--r-- 1 nginx nginx   205 Feb 17 03:34 error.log-20180218
-rw-r--r-- 1 nginx nginx   205 Feb 18 03:37 error.log-20180219
-rw-r--r-- 1 root  nginx  6.1M Feb 25 03:24 error.log-20180223
-rw-r--r-- 1 nginx nginx   205 Feb 23 03:24 error.log-20180224
-rw-r--r-- 1 root  nginx  1.9M Mar  2 03:09 error.log-20180226
-rw-r--r-- 1 nginx nginx   205 Feb 26 03:31 error.log-20180227
-rw-r--r-- 1 nginx nginx   205 Feb 27 03:47 error.log-20180228
-rw-r--r-- 1 nginx nginx   207 Feb 28 03:28 error.log-20180301
-rw-r--r-- 1 root  nginx  559K Mar  7 03:25 error.log-20180306
-rw-r--r-- 1 root  nginx  760K Mar 17 04:12 error.log-20180315
-rw-r--r-- 1 nginx nginx   207 Mar 15 03:28 error.log-20180316
-rw-r--r-- 1 root  nginx  374K Mar 20 03:42 error.log-20180318
-rw-r--r-- 1 nginx nginx   205 Mar 18 03:36 error.log-20180319
-rw-r--r-- 1 root  nginx  115K Mar 30 03:13 error.log-20180329
-rw-r--r-- 1 root  nginx  655K Apr  6 03:15 error.log-20180403
-rw-r--r-- 1 nginx nginx   207 Apr  3 03:14 error.log-20180404
-rw-r--r-- 1 nginx nginx   207 Apr  4 03:11 error.log-20180405
-rw-r--r-- 1 root  nginx  240K Apr 10 03:07 error.log-20180409
-rw-r--r-- 1 root  nginx  143K Apr 12 02:30 error.log-20180411
-rw-r--r-- 1 root  nginx  620K Apr 16 03:15 error.log-20180415
-rw-r--r-- 1 root  nginx  241K Apr 19 03:22 error.log-20180418
-rw-r--r-- 1 root  nginx  418K Apr 25 03:39 error.log-20180423
-rw-r--r-- 1 nginx nginx   207 Apr 23 03:33 error.log-20180424
-rw-r--r-- 1 root  nginx  5.0K Apr 26 03:06 error.log-20180426.gz
-rw-r--r-- 1 root  nginx  6.0K Apr 27 03:37 error.log-20180427.gz
-rw-r--r-- 1 root  nginx   48K Apr 28 03:26 error.log-20180428.gz
-rw-r--r-- 1 root  nginx  839K Apr 30 02:48 error.log-20180429
-rw-r--r-- 1 nginx nginx   181 Apr 30 03:17 error.log-20180430.gz
-rw-r--r-- 1 root  nginx  100K May  4 02:56 error.log-20180501
-rw-r--r-- 1 nginx nginx   207 May  1 03:08 error.log-20180502
-rw-r--r-- 1 nginx nginx   207 May  2 03:21 error.log-20180503
-rw-r--r-- 1 nginx nginx   183 May  4 03:18 error.log-20180504.gz
-rw-r--r-- 1 root  nginx   46K May  6 12:11 error.log-20180505
-rw-r--r-- 1 nginx nginx   207 May  5 04:49 error.log-20180506
-rw-r--r-- 1 nginx nginx   958 May  7 03:24 error.log-20180507.gz
-rw-r--r-- 1 root  nginx  1.6K May  8 03:30 error.log-20180508.gz
-rw-r--r-- 1 root  nginx  6.4K May  9 03:25 error.log-20180509.gz
-rw-r--r-- 1 root  nginx  141K May 12 01:32 error.log-20180510
-rw-r--r-- 1 nginx nginx   207 May 10 03:28 error.log-20180511
-rw-r--r-- 1 nginx nginx   183 May 12 03:16 error.log-20180512.gz
-rw-r--r-- 1 root  nginx  149K May 14 00:30 error.log-20180513
-rw-r--r-- 1 nginx nginx  2.6K May 14 03:09 error.log-20180514.gz
-rw-r--r-- 1 root  nginx  9.5M May 17 11:46 error.log-20180515
-rw-r--r-- 1 nginx nginx   207 May 15 03:22 error.log-20180516
-rw-r--r-- 1 nginx nginx   207 May 16 03:14 error.log-20180517
-rw-r--r-- 1 nginx nginx  453K May 18 08:58 error.log-20180518
-rw-r--r-- 1 nginx nginx  1.8M May 20 07:48 error.log-20180519
-rw-r--r-- 1 nginx nginx   205 May 19 03:35 error.log-20180520
-rw-r--r-- 1 nginx nginx  1.6M May 21 04:41 error.log-20180521
-rw-r--r-- 1 nginx nginx  4.1M May 23 07:54 error.log-20180522
-rw-r--r-- 1 nginx nginx   205 May 22 05:06 error.log-20180523
-rw-r--r-- 1 nginx nginx  1.7M May 25 03:03 error.log-20180524
-rw-r--r-- 1 nginx nginx   205 May 24 03:06 error.log-20180525
-rw-r--r-- 1 nginx nginx  789K May 26 08:43 error.log-20180526

あらら・・・圧縮されてないですね・・・

gzipコマンドで圧縮します。

[root@ip-172-31-15-187 nginx]# gzip access.log-20180501 access.log-20180505 access.log-20180510 access.log-20180513 access.log-20180515 access.log-20180518 access.log-20180519 access.log-20180521 ...

こんな感じでファイルを圧縮していきます。圧縮したら、s3とかに移動しておくと良いですね。

そんな感じで、railsのログファイルもどうように圧縮、移動をすると、ディスク容量はだいぶ減るかと思います。

JavaScriptで実装したクリップボードへのコピー機能が動かなかった

はじめまして、PRESSでエンジニアとしてお手伝いをさせて貰っているyamane (id:yusukeyamane01)です Twitterもやっています

JavaScriptで実装したクリップボードへ文字列をコピーする機能を修正した時の事を記事にしたいと思います。

コードが動かなかった理由

結論を先に言うと、CSSの指定が問題で処理が正しく実行できていませんでした。

修正する前はHTMLが以下のようになっていて

button.editor-btn{ onclick: "handleURLCopy();" }
    | プロフィールページのURLをコピー
    p#urlField style="visibility:hidden;position:absolute;" = current_url

JavaScriptが以下のようになっていました

handleURLCopy() {
  const target = document.getElementById('#urlField');
  const range = document.createRange();
  range.selectNodeContents(target);
  window.getSelection().removeAllRanges();
  window.getSelection().addRange(range);
  document.execCommand('copy');
  window.getSelection().removeAllRanges();
  this.hideMenuModal()
  this.$notice.success('コピーしました');
}

上記のコードでは、HTMLのPタグ内にコピーしたいURLを持たせJavaScriptでPタグ内の文字列を選択状態にして、document.execCommand('copy');でクリップボードへコピーしていました。

問題の原因となっていたのはHTMLにある以下の記述でした。

style="visibility: hidden;position:absolute;"

この記述はコピーしたい文字列をviewに表示させない為に記述していたのですが、visibility: hidden;としてしまうと、対象の要素を選択状態にすることが出来ずに処理が正常に行われていませんでした。

どのように問題を解決したか

動かない原因が対象の文字列を選択出来なくしていたことだと判明したので、解決方法は次の二択だと考えました。

  1. visibility:hiddenではなく、opacity: 0;で文字列を隠蔽する
  2. HTMLにコピー対象を書き込むのでは無く、コピー対象の生成までをJavaScriptで処理する

今回は後者を選択しました。後者の方がより汎用性高く使い回せる関数になると考えたからです。修正後のコードは以下です。

button.editor-btn{ onclick: "handleURLCopy();" }
    | プロフィールページのURLをコピー
function handleURLCopy() {
  copyURLToClipboard(location.href)
  this.hideMenuModal()
  this.$notice.success('コピーしました');
}

function copyURLToClipboard(string) {
  if (!document.queryCommandSupported('copy'))
    return new Error('このブラウザはクリップボードへのコピーに対応していません');
  if (typeof string !== 'string')
    return new TypeError(`except string but got ${typeof string}`);

  // 仮想のdiv要素を作りそこに引数で受けた文字列を持たせる
  var tempElement = document.createElement('div');
  tempElement.appendChild(document.createElement('pre')).textContent = string;

  // 仮想のdiv要素をviewに表示させないようにする
  tempElement.style.position = 'fixed';
  tempElement.style.left = '-100%';

  document.body.appendChild(tempElement);
  document.getSelection().selectAllChildren(tempElement);

  document.execCommand('copy');

  document.body.removeChild(tempElement);
  
}

これでクリップボードへのコピー関数は正常に動くようになりました。この記事が、同じような問題で困っている人の手助けになれば幸いです。

参考

qiita.com

developer.mozilla.org

© DESSART & Co.