車輪の再発明でもいいじゃない

フリーランスエンジニアがいろいろ試したりすること

S3 + CloudFront + Route53 で独自ホスト名で静的ページを公開する

前書き

アフェリエイトなんかで稼ごうとしても独自ドメインじゃないとってことが多いですよね。 今回は静的ページ公開までやってみます

構成図

f:id:takimotoTurkey:20200831170247j:plain

https 通信するために ACM で認証情報を使用します。S3に配置しているコンテンツをCloudFront 経由でアクセスできるようにします

静的ページ公開

まずは 静的コンテンツをブラウザで見れるようにしましょう

  1. S3 に コンテンツを配置する
  2. CloudFront の設定
    • とりあえず Webとして設定しましょう f:id:takimotoTurkey:20200831171152p:plain
    • Origin Domain Name に先ほど追加したS3バケット名を選びましょう。ほかの項目は一旦記載しなくてよいです f:id:takimotoTurkey:20200831171736p:plain
  3. しばらくすると一覧に Enabled として表示されるのでしばらく待ちます f:id:takimotoTurkey:20200831171955p:plain
  4. CloudFront のアドレスで表示を確認する

赤枠のアドレスで表示できるのでしばらくしたのちに表示できるか確認しましょう

f:id:takimotoTurkey:20200831170927p:plain

独自ドメインの取得と証明書の登録

  1. Route53 でドメイン購入
  2. 証明書の登録
    • CloudFront の編集画面から ACM 登録画面に遷移します f:id:takimotoTurkey:20200831172706p:plain
    • ドメイン名を設定します。ひとまず「 www.購入ドメイン」でよいでしょう f:id:takimotoTurkey:20200831172837p:plain
    • 検証方法を DNS のままで進める f:id:takimotoTurkey:20200831172947p:plain
    • 発行がうまくいくと 「Route53 でのレコード作成」ボタンが出るので押下後、しばらく待機する
  3. route53 の設定

独自ドメインで CloudFront にアクセスする設定

  1. レコードを作成する f:id:takimotoTurkey:20200831173829p:plain
    • シンプルルーティング を選ぶ
    • ルーティング先に CloudFront ディストリビューションへのエイリアス を選ぶ f:id:takimotoTurkey:20200831174404p:plain
      • 一番最後のリソースは一度「シンプルなレコード定義」を押下すると出てくるようになる

SSL 接続設定

  1. CloudFront の設定画面で Alternate Domain Names(CNAMEs) とSSL Certificate を設定する f:id:takimotoTurkey:20200831173516p:plain
  2. 祝!作業終了

これにて独自ドメインで静的コンテンツを表示できるようになったはずです!

WSL で Ubuntu GUI 環境構築

WSL で Ubuntu GUI 環境構築

目標

  1. Windows Subsystem for LinuxUbuntu インストール
  2. GUI 環境でいじれる
  3. 日本語表示できる
  4. 日本語キーボードで入力できる

特に 3,4 は超重要ですね。’ を打ちたいのに & がしか打てないって致命的ですし。

ひたすら悩みまくったり、Windows で書いて共有ファイルにおいて Ubuntu に持って行ってとか。思い出しただけでも( ;∀;)

環境

  • Windows10 Home Edition バージョン 1909

GUI Ubuntu をインストールする

@MERIK さんの記事[1]を参考にやっていきましょう

  1. Windows Power shell で Windows Subsystem for Linux インストール

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

  2. VcXsrvWindows にインストール
    • Windows 用 X サーバでこのアプリに Ubuntu の画面が表示されます
  3. Micrisoft Store から Ubuntu インストール
    • user や password 聞かれますが良しなに入力してください
    • システムをアップデート

    sudo apt-get update sudo apt-get upgrade

    • Windows とファイル共有する場合は metadata を 追加して mount しなおす[2]

      sudo umount /mnt/c sudo mount -t drvfs C: /mnt/c -o metadata

      • 共有フォルダ配下に git clone したい場合、上記で mount しなおさないと permitted エラーとなり、作業できません
  4. Ubuntuxfce をインストール

    sudo apt-get install xfce4-terminal sudo apt-get install xfce4

    export DISPLAY=:0.0 export LIBGL_ALWAYS_INDIRECT=1

  5. GUI の起動
    • xlaunch の起動
      • One Window を選択し、Display number は0を選択します。真っ黒な画面が出たらOK
    • xfce4 の起動
      • xlaunch が起動していることを確認

      startxfce4

  6. 祝! GUI 起動
    • xfce4 の起動コマンドは覚えられないので shell スクリプトで叩けるようにしたほうが良いです

日本語表示と日本語入力

’ を入力してみましょう & になります( ;∀;)これを何とかしましょう

以下の1,2をやった後に GUI で設定したら1,2いらないかも。。。 というかこれやったほうが CUI からも使えるからこっちしか選択肢がない VS Code のターミナルからでも使えるぜ

  • アプリケーション > 設定 > キーボード で設定を開く
  • レイアウトタブで「システムデフォルトを使用する」を外す
  • キーボードモデルを「Generic 105-key PC(intl)」にする

  • 日本語表示

    sudo apt install fcitx fcitx-mozc sudo apt install dbus-x11 x11-xserver-utils sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id" sudo apt install language-pack-ja sudo update-locale LANG=ja_JP.UTF8 sudo apt install fonts-takao export GTK_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export QT_IM_MODULE=fcitx export DefaultIMModule=fcitx xset -r 49 fcitx-autostart

  • 日本語キーボードの設定

    fcitx-config-gtk3

    • キーボード選択画面で Mozc を選択
    • fcitx-autostart を xfce4 起動スクリプトに追加しておく
    • X 経由で GUI からじゃないと日本語キー配列使えないという罠が。。。

これで開発環境葉できました!お仕事できます

参考

投資信託複利分配金計算ツールを作った話

初めに

投資するにあたって目的は配当や評価額の差額ですよね。

差額といっても1年後の評価額の値動きは全く予測できないです

複利で投資すれば効果が高くなるってのはわかるんですが、少額で投資する場合は結局どれに投資すれば費用対効果が高いの?ってのが疑問です。

今まで比較する際にいちいちエクセルで計算していたんですが、めんどくなったのでエクセルで計算シート作りました。

エクセルシート

drive.google.com

1年後にどれくらい分配金がもらえているかがわかります。

軽く計算した感じ、配当が多少低くとも評価額が安めのやつ買ったほうが配当はよくなる感じですね。

ただ、安すぎると減配の恐れもありますが

エイブル管理物件はダメかも

前書き

引っ越しして3週間目で、小さい不具合や不満なんかがちらほらと見えてきました。

次回引っ越しする場合はエイブル管理の物件は選ばないようにしようと思います。個人情報の管理&漏洩対応がザルですし

何があったのか

一言でいえば対応が遅い。

大家さんへの確認が遅い

エアコン取付の確認

部屋に備え付けのエアコン用固定ボルトが使えないことが発覚し、7/24に管理会社に「ビス止めしてよいか?」を問い合わせを行いました。

支店が対応という話になったのですが、1週間たっても連絡がありません。こちらから8/1に問い合わせてようやく回答でした。

真夏の時期なんです。とっとと大家さんに問い合わせてください。

設備仕様の確認

うちの部屋はどうやら工費をケチったのか3室換気のタイプで、トイレ・脱衣所・お風呂の換気扇が連動しているっぽいです。

トイレはタイマー式で切れるタイプなので、たぶんスイッチはトイレ > お風呂場 の優先順になっているのか、トイレ作動中はお風呂場で操作できないようになっているっぽいです。

つけた覚えのないお風呂場の換気扇が動いており、かつお風呂場で操作(切れない)できないため、「こういう仕様なの?それとも壊れているの?」と8/2に問い合わせしました。

大家さんに確認 or 業者に修理と回答もらっていますが、さて何日に返答があるやら

勝手に動くので当初はどこかでショート(何かが原因で配線が物理的に動いてON)しているかもと思っていました。

前住人宛資料が部屋に残る

入居した際に、背表紙に氏名が記載された入居のしおりみたいなのをもらいました。

そして部屋に入ると先ほどもらったものとほぼ同じ前住人宛のしおりが。。。

8/2 問い合わせると「回収したい」となったので「平日ならいつでもいるから取りに来て」と言って待って3日目です。

こちらもどれほど放置されるのやら。

DMが送られてきてとかなら前住人のミス?ですが、自社が管理する空き部屋に残したままって。

最低でも情報漏えい発生時の対応ポイント集[1] の紛失・盗難時の応急対応は当たり前にしてほしいです。

[1] 情報漏えい発生時の 対応ポイント集 - IPA https://www.ipa.go.jp/security/awareness/johorouei/rouei_taiou.pdf

alpine linux + Rails(Puma) 起動エラーで悩みまくった話

前書き

世間ではコンテナ技術が一般的になりますが、任せちゃうがゆえに低レイヤーの知識がなくても使えてしまいますね。

そしてコンテナを作ろうとした際にはまる。私もそんな一人です。対応としては動かしてみてエラーをつぶすしかないでしょうね。

いろいろはまり、検索してもあまりヒットしなかったので忘備録として残します。

まとめとしては、 alpine の パッケージ検索して、alpine のバージョンを確認しようでした

発生した問題

  • ベースイメージ: ruby:2.4.4-alpine3.6
  • 起動コマンド(docker-comporse): bundle exec rails s -b 0.0.0.0 -p 3000

上記の時、以下のエラーが出ました。

api_1         | Exiting
api_1         | /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require': Error loading shared library libssl.so.1.1: No such file or directory (needed by /usr/local/bundle/gems/puma-3.12.0/lib/puma/puma_http11.so) - /usr/local/bundle/gems/puma-3.12.0/lib/puma/puma_http11.so (LoadError)
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/server.rb:15:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/runner.rb:1:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/cluster.rb:1:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/launcher.rb:4:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/rack/handler/puma.rb:15:in `config'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/rack/handler/puma.rb:62:in `run'
api_1         |         from /usr/local/bundle/gems/rack-2.0.6/lib/rack/server.rb:297:in `start'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:53:in `start'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:147:in `block in perform'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:142:in `tap'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:142:in `perform'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/command/base.rb:65:in `perform'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/command.rb:46:in `invoke'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands.rb:18:in `<top (required)>'
api_1         |         from /app/user/bin/rails:9:in `require'
api_1         |         from /app/user/bin/rails:9:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `load'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `call'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
api_1         |         from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:70:in `require'
api_1         |         from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:70:in `require'
api_1         |         from /app/user/bin/spring:15:in `<top (required)>'
api_1         |         from /app/user/bin/rails:3:in `load'
api_1         |         from /app/user/bin/rails:3:in `<main>'

TRY & ERROR

  1. openssl-dev を入れてみよう
    • ssl 系なので行けると思ったのですが、コンフリクト[1]が発生して build が失敗
  2. libressl-dev を入れてみよう
    • 1 で記載されているが、alpine では openssl は使われていないらしい、エラーが変わらず
  3. エラーに従って libssl1.1 を入れてみよう
    • build で失敗。 libssl1.0 は入れれたけどエラーは変わらない

最終的な解決方法

パッケージ調べたら alpine 3.9[2] 以降でないとダメそうでした。

仕方がないので、公開されている記事[3]を参考に独自にRuby を入れることにしました。

割と正解じゃないかと思う楽天期間限定ポイントの消費方法

少し前から「〇〇ポイントを使って投資」って CM が D さんとか F さんとか大手ポイント運営やっているところから出てきましたね。

私が主に使っている楽天さんとかは期間限定ポイントをたくさんくれるのですが、今までは市場で無駄な消費(絶対にほしいわけじゃないけど余っているし買おうとか)していました。よさげな消費方法思いついたので公開してみます

名付けて「投資&節税、あと少しだけ社会貢献」です

f:id:takimotoTurkey:20200720185706p:plain

私の場合毎月、通常ポイント 2000、 期間限定ポイント 900という感じでポイントを受け取っています。

ふるさと納税は1000円から(自然災害の復興で返礼品なしのものとか)ありますし、投資信託なら1000円以上1円単位で買えるので、結構よいのでは?と思います。

上記条件で1年間やってみた場合、どんな感じになるか軽くシミュレーションしましょう。

条件

  1. 評価額・分配金は2020/7/20 時点の価格で変動なし

  2. 決算日は 11回(2~12月に分配金がある)

  3. 期間限定ポイントで買えない不足分は損金として計算

  4. 信託手数料、分配金にかかる税金は考慮しない

  5. ダイワJ-REITオープン(毎月分配型)(評価額: 3,456円 分配金:80円)を購入

結果

投資信託評価額: ((1~11の総和)* 2,000) = 22,000円

総分配金:投資信託評価額 / 評価額 * 分配金 ≒ 3,055円

ふるさと納税: 1,000円 * 12 -2000円 = 10,000円

損金: 100円 * 12(住民税は課税所得の10%なので1000円くらい翌年安くなるはず)

⇒ 25,000円くらいの利益

ほぼノーリスクでここまで稼げればそれなりにいい感じじゃないですかね? 投資信託は元本割れのリスクもありますが今回使用したお金は損金だけなので、ほぼノーダメージ(月1回コーヒー我慢レベル)&売却時に元本割れしても損金繰り越しで翌年の利益から相殺できますし。

[1] 住民税の計算方法

https://www.city.edogawa.tokyo.jp/e013/kurashi/zeikin/juminzei/zei_gaiyo/jyuuminzei-keisan.html