読者です 読者をやめる 読者になる 読者になる

Shiho's engineering blog

誰でもみれるノートのようなもの

Deviseで管理者が承認したらユーザーのアカウントをアクティベートする実装【Rails】

userカラムにapprovedを足す

class AddApprovedToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :approved, :boolean, :default => false, :null => false
    add_index  :users, :approved
  end

  def self.down
    remove_index  :users, :approved
    remove_column :users, :approved
  end
end

userモデルをオーバーライドする

def active_for_authentication? 
    super && approved? 
  end 

  def inactive_message 
    if !approved? 
      :not_approved 
    else 
      super # Use whatever other message 
    end 
  end

利用承認待ちだというメールを自動送信

  after_create :send_admin_mail
  def send_admin_mail
    AdminMailer.new_user_waiting_for_approval(self).deliver
  end

view も作る。

path を指定

def after_sign_up_path_for(resource)
  after_sign_in_path_for(resource)
end


def after_inactive_sign_up_path_for(resource)
  welcome_index_path
end

環境に応じて改変する

参考

How To: Require admin to activate account before sign_in · plataformatec/devise Wiki · GitHub

How To: redirect to a specific page on successful sign_in, sign_out, and or sign_up · plataformatec/devise Wiki · GitHub

私のSanDisk16GBが唐突に壊れて思い出の写真が消えたがMini_Tool_Recoveryのおかげで復旧できた話

意気揚々と、SDカードをmacに入れた私。

だがしかし、「なんか読みとれないよ」的な文章が現れる。 macの「写真」アプリも起動しない。

一眼レフにセットした状態ではプレビューできるのにな〜と思い、 もう一度カメラに入れて見ようとしたところ…

「画像がありません」

の文字。

絶望。

しかし、あるはずだ!解決策!

だって、こんだけデータ復旧サービスが世の中にあるのだから。

その一部の方法は家庭でも出来る可能性は高い(ちなみに依頼すると9000円くらいかかってしまうっぽい…)。

・・・

ということで、

SDカードがエラーで読み込めない?フォーマットする前に試してみたい3つの手段と予防のための3つの方法【Android】 | ガシュログ.com

を参考に、

片っ端から色んなフリーソフトを試す。

※ 色んな方法を試すまえに、SDのロックをかけて「読み取り専用」にしておきましょう。

Renee leader。

ダメ。

datarecovery。

ダメ。

・・・(略)

Mini_Tool_Recovery。

www.minitool.com

何やら、スキャン結果が他のものに比べて圧倒的に多い。 他のだと20ファイルくらいだったんだけど、 これは3000ファイルくらい。

これはいける・・・!

→いけました。

f:id:serendipity4u:20170212220029p:plain

ありがとう!!!!

女子大学生が法人設立(LLC)をしてきたので感想・苦労したことをまとめます

フリーランスとして請けていたweb制作ですが、だんだん規模が大きくなってきたのと、個人で開発しているウェブサービスもより本格的に運用していきたいとの思いから、法人化を行うことにしました。

なぜ法人にしたか

  • 運営するサービスの信頼を得るため。
  • 自宅ではなくオフィスの住所を掲載したかったから。
  • 法人経営の知識 [ 税務・法務 ] を早めに得たかった

なぜ株式会社ではなく合同会社を選んだか

  • 設立のために要する手間が株式会社と比べて大幅に少なかった
  • コストが株式会社よりかからなかった
  • 上場がゴールではないので株式会社である必要性がない
  • 合同会社は、特定の取り決めを行えば、出資比率に関わらず、事業への貢献の度合いなどに応じて利益配分や損失負担を自由に決定できるなど柔軟

作成した書類

  • 合同会社設立登記申請書
  • 登記用紙と同一の用紙
  • 電子定款
  • 代表社員の印鑑証明書
  • 払込証明書
  • 印鑑届出書
  • 資本金決定書

私は現物出資があったため、

  • 資本金の額の計上に関する証明書

も用意しました。書類の内容と作成方法については

inqup.com

などを参考にして下さい。

私はネットで見つけた司法書士さんに依頼して定款作成と電子認証をやってもらいました(定款の作成は freee などのサービスを使って無料でできます。雛形も沢山ネットに落ちてます。認証は司法書士に依頼する場合有料ですが、1500 ~ 5000円程度です)。

電子認証は自分でやろうと思ったのですが、ソフトウェアを揃えるコストを考えると、 数千円で依頼してしまった方が楽かなと考えました。24時間以内に作成してくれる事務所さんも多数あります。

苦労したこと・調べてもなかなかヒットしなかったこと

電子定款はフロッピーディスクかCDしか受け付けてくれない!

あるサイトで、USBもしくはCDで… という記述を見つけ、USBでも提出できるのかと思いきや、やはり受付で断られてしまいました。でも流石に対応していてほしいなあ…フロッピーもCDも、いまどき使用頻度が少なすぎて読み書き用の機器を持っていない人が多いと思うんですよ。

結局、近くのネカフェに行ってUSBからCDに移しました。

電子定款を選択する場合、CD(もしくはフロッピー)には、定款だけではなく、「登記すべき事項」というテキストファイルも入れるべし!+レギュレーションを確認すべし!

これまで作成してきた登記申請書類の内容を法務局のコンピューターに入力する時のために、申請する人が自分で入力内容をテキストファイルに打ち込む、というものです。ちょっとしたファイルであるため、忘れる人が多いのではないかと推測します。

全角じゃないといけなかったり、スペースの入り方も厳密だったりと、レギュレーションが結構あるのでしっかり確認しましょう。

kaisya-tsukuro.net

振込証明書を作成するときは、自分で自分に振り込む必要がある!そのとき「本人」ではなく、自分の名前を振込名に入れることに注意!

代表者の口座に出資額分を振り込むわけですが、代表者は自分の口座だからといって何もしなくていいわけではなくて、一回引き出して、自分の名前で自分の口座に振り込むという一見どうみても不思議な行動をしなくてはいけません。この手続のさい、銀行のお姉さんに「本人」という表記でいいですか、と聞かれましたが(聞かれることが多いと思われます)、自分の名前で振り込むことに意義があるのでそうしてほしい、ということをお伝えするのを忘れないようにしましょう。

印鑑証明を取るために、市役所に行かなくてはならなかった

マイナンバーカードを作成していれば印鑑証明をコンビニで発行できたのですが、作成していなかったため急遽市役所に行く羽目に…。

法務局が早く閉まっちゃう

17時15分に登記申請受付窓口が閉まってしまうんですよね。あと、登記は登記予定の会社の本拠所在地を管轄する法務局(出張所)に出すことに注意です。

登記までにかかったコスト

  • 印紙代の6万円
  • CDとネカフェ代
  • 定款の電子認証の2000円

( ※ 電子定款を採用したため、4万円浮きました。)

です。

感想

アメリカはオンラインで登記手続きが完結するらしいです。日本もそうなったらもっと起業が増えるんじゃないかな。 とはいえ、楽するために登記をしたわけじゃありません。私の母の口癖は「進んで苦労を買いなさい、苦労はお前を玉にするから」です。これから法人経営をするにあたってどのような困難にぶちあたるのか、楽しみです。 自分で書類を作成し、法務局に行ったのは、これから自分は本格的に事業をやっていくんだと改めて感じる良い経験でした。 法人化を検討されている方の助けになれば幸いです。

letsencryptの更新が上手く行かなかった時のメモ。自動化までの道のり【rails, nginx,AWS,capistrano環境】

既存のletsencryptディレクトリを消しやり直す

letsencryptの更新が上手く行かなかった時のメモ。

新しく認証し直す。 まず /etc/letsencrypt/ ディレクトリを削除。

sudo git clone https://github.com/letsencrypt/letsencrypt /usr/local/letsencrypt

sudo /usr/local/letsencrypt/letsencrypt-auto --help --debug

sudo service nginx stop 

nginxを止めないと"Could not bind TCP port 443 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again.“というメッセージが出る。

sudo /usr/local/letsencrypt/letsencrypt-auto certonly --standalone -d example.com -d www.example.com --agree-tos

で、

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-05-08. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"

上手くいった。

自動化する

sudo vi /etc/cron.daily/letsencrypt
sudo chmod +x /etc/cron.daily/letsencrypt

/etc/cron.daily/letsencrypt の内容。

#!/bin/sh

LE_HOME=/usr/local/letsencrypt
WEBROOT=/var/www/rails/example/current/public #capistranoを使っているのでcurrentディレクトリを挟む
DOMAIN=example.com
SUBDOMAIN=www.example.com
LOG=/var/log/letsencrypt/renew.log

$LE_HOME/letsencrypt-auto certonly --debug --non-interactive --keep-until-expiring --webroot -w $WEBROOT -d $DOMAIN -d $SUBDOMAIN >> $LOG 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    echo Automated renewal failed:
    exit 1
fi
service nginx reload

nginx設定ファイルで正しく証明書の場所が示されていることを確認。

/etc/nginx/conf.d/example.conf

server {
        listen 443 ssl;
        server_name xx.xx.xx.xx; #アプリのElastic IPに変更してください
        ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_timeout 1d;
        root /var/www/rails/example/current/public; #自分のアプリケーション
...

参考

qiita.com

君が22歳なら、人生の7割はもう終わっている【ジャネーの法則】

思うところがあったので、きょうは技術メモ以外のトピックを書く。

私は死に焦りを持たない若い人が苦手だ。

人間が時間を測る基準なんで、年といった単位に特に意味はなくて、究極的には体感でしか測ることができない。1000年の重みを私たちは 1生、知ることができない。

今まで生きてきた時間と比べることでしか時間を測れない。

だから、人生の時間は均等ではない。0歳の子どもが過ごす1年と、と19歳の人間が1年過ごす1年は、

1/1 : 1/20 で20倍も違う。

なんて考えてて、ちょっとオリジナルじゃね、って思って生きてきたのだが、ググったら名前がついていて、「ジャネーの法則」というらしくて。

まあどっかで聞きかじってたのかもしれない。ごめんジャネー。

22歳で、80歳まで生きるという仮定のもと、ジャネーの法則では人生の何%過ごしてきたかを算出すると、

(1 + ½ + … 1/22) / ( 1 + ½ + /1/3 … 1/80)

で 体感余命は残り15年程度、 既に体感時間の7割以上が過ぎていることがわかった。

私は死への焦りはかなり持っているほうで、それは肉親の思わぬ死とか、街を歩いていて自分の真上を見上げたら、まさに飛び降りしようとしている人がいて、それをスマホで撮影する沢山の人々が輪になっていて、その真ん中から咄嗟にどいてしまった後に「自分がどいたせいであの人が死んだらどうしよう」と恐れてビルに駆け上がってその人と警察を交えて話した昔の出来事とか、たくさん飼っていた生き物のこととか、そういうのが影響しているんだと思うけど、

いい意味で自分に常に疑問を投げかけてるんじゃないかと思う。 「いま、なぜ生きるのか」 という理由がないと自分は生きれないめんどくさい人間で、

だってそうじゃないか、とも思う。だって死ぬとき、肉体的な痛みはあるけどそれは生に伴うものであって死そのものに伴うものじゃない。 死は無であり、死んでしまったら残した人たちに対する気持ちも何もない。何も感じない。だから悪く生きることが怖くても、死じたいは怖くない。 忘れられて悲しいとか、そう思う主体すらない。

だから自分たちには、そんな価値基準のない「ゼロ」である死を選ばないなら理由があるべきだと思う。しかしその理由が「幸せ」である必要はなくて、怒りとか、憎しみとかでも良いと思う。そういう感情を味わい尽くす意義ってすごいあると思う。なんで楽しいとか美味しいは肯定されて辛いとか苦しいはマイナスの価値を付与されるんだろうと思う。人間の偉大な発明はみんなそういう"マイナスの"価値を持つ感情が生み出したと思う。プラスをマイナスが生み出してるならマイナスだってプラスだろ。

と思っていたら、ビートたけしさんが良いことを言っていて、

人生に幸せなんて求めること自体勘違いなんだよ。世間じゃよくどうせ死ぬんだから楽しく生きようなんて言うけど、オイラは逆でどうせ死んで身軽になるんだから、生きてるうちにひどい目に会おう、辛く生きようと思ってる。

私の好きな映画は、「ファイトクラブ」なんだけど、 それはまさにメメント・モリな映画で、 銃口を口に突きつけて「今からお前は死ぬ!お前の本当にしたかったことは何だ!」とタイラーが言う。 やりたい気持ちを押さえ込んで、やれないことに対する辛さにも鈍感になって、感情を持たないで日々を過ごす人々を「ぶっ生き返す」映画。

死に焦りがないと私が思う風景は、 自分が関与しない所にある人間の話/モノにひたすら興ずる人々、 ルールを変えようとしないでそのルールを所与のものとして、つまらないって思いながら生きる人々。

だけど、そもそも「理由がないと何かをしないのもおかしくないか」とも思う。 ふつうに生きるでいいと思う。理由なんてなく。でもそのあり方を忘れてしまったら、私みたいにどうしても理由を考えてしまうなら、こう考えて欲しいと思って書いた。

Railsアプリで自動でURLが含まれたテキストのURLにリンクを貼ってくれるようにしたい

正規表現でやろうかと思いきやセキュリティ的にアレだったりするのかもしれないしgemを利用することにした。

gem で解決

がある。

<%= raw Rinku.auto_link(h(some_text)) %>

参考

ria10.hatenablog.com

qa.atmarkit.co.jp

railsからfacebookにnotification APIで通知を送る

頻繁にユーザーが見るfacebookに通知を送る方法。

jp.techcrunch.com

https://graph.facebook.com/{recipient_userid}/notifications?access_token={application_access_token}&template={Your_Message}&href={URL_to_your_app_or_request}

にPOSTする。

2つのgem

でやる方法がある。 コードをテストするまえに、facebook developperで「プラットフォーム」に「fbキャンバス」を追加しておくこと。 じゃないと

FbGraph::Unauthorized (OAuthException :: (#200) Only web canvas apps can send app notifications):

というエラーが出てしまうので。

koaraを使う

require 'koala'
require 'net/http'
require "net/https"
...

fb_url = "#{fb_id}/notifications?access_token=#{app_access_token}&href=#{FB_CALLBACK_URL}&template=You have a new score! See your results now!"
uri = URI.encode("https://graph.facebook.com/#{fb_url}")
uri = URI.parse(uri)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

fb_req = Net::HTTP::Post.new(uri.request_uri)
fb_response = http.request(fb_req)

fb_graphを使う

uid = hogehoge # facebookのユーザーuid

fb_user = FbGraph::User.new(uid)
app = FbGraph::Application.new(APP_ID, :secret => APP_SECRET)
app.notify!(
      fb_user,
      :href => 'http://www.example.com', #通知をクリックした時のリンク先
      :template => "お知らせがあります") #通知として表示される文字

参考

Using NET::HTTP in Rails to send Facebook App Notifications

stpanisush.hatenablog.com

NOTE

  • ブラウザには出ても、facebook アプリだと通知がない気がする
  • POST “/” になるので、最初エラーが出る