Ich habe hunger

あふりかエンジニア、アフリカ向けのB2BのSaaSを開発する

インターネットのない生活

インターネットのない生活と書くと少し大げさかもしれない。


先日、引っ越すことが決まった。そうなると郵便の転送から何から何まで新住所に移さないといけなくなる。もちろん、インターネットも、だ。前の家では、インターネットは光を引いてたが夜や休日になると遅くなる。ベストエフォートとかいうやつのおかげで遅くなる。それは分かる。しかし、容量を気にしないで良いというメリット以上のものを無線インターネット系のWiMAXなどは提示してくれない。なので、光にしていた。


インターネットがないと仕事もできないし、Amazon Primeで動画も見れないし、Apple Musicも聞けないし、仕事も出来ない。そう、仕事が出来ないのが問題。前にも書いたが、仕事上ウガンダやケニアとやり取りをすることが多くて、Slackやgithubを使ったりはしているが、skypeやappearやfacebook messangerで音声通話をすることもある。ウガンダとやり取りをする時に通信状況が悪くてどうにも遅延したり、断絶したりと困ってたんだけども、それは上で書いたインターネットが遅くなることが原因だった。まさか、アフリカ V.S 日本で日本の方が環境悪いなんて想像もしないよね(実際のところはどうかというのは置いといてイメージとしてね)。


そういうわけで、引っ越し先では違うとこに契約してやろうと乗り換える手続きをした。しかし、もちろん工事までの日程も先だし、更に開通ももっと先だろう。もしかしたら2ヶ月ぐらいかかってしまうかもしれない。辛い。辛過ぎる。こんなくだらないことで、記事にしてしまうほど辛いということ。今のところは、dmm mobileで契約をしている自分の携帯からテザリングしているが、まだ5/8なのに既に2GB / 5GBを使い切るぐらいなので、月末までは持ちそうにないので何か手を考えないといけない。


それはともかく、そういった理由で今は(PCを使う前提の)インターネットからかなり隔絶されつつある。パケットを気にしないといけないから。つら。


しかしながら、そのおかげか環境が変わったからか、仕事をする時にしかテザリングしないし、だらだらと何か見ることも減ったし、その分お買い物やカフェでお茶したりいつもと違う行動をするようになっているようで自分でも驚いている。


とりあえず、身体を鍛えるために近くのジムには入会をして、そこでwifiが使えるそうなので、そこのwifi使って見逃しているamazon primeの番組などは走ったり自転車をこぎながら消化することにすれば身体も鍛えられるし一石二鳥。インターネット欲求駆動生活改善。環境が変わったことを生活習慣を変えるチャンスと考えて、もう少し健康に、より生産性高く、楽しく生きれるように色々考えてみようと思う。


とりあえずは、ジムに通うことと常備菜を少しずつ作り始めるところかな。

やってることは同じ

多分、どこで仕事をしてもやってることは同じなんだと思う。

もちろん、どこで仕事するかによって、事業や地域、文化や人という変数はそれぞれ違い、それを取り上げていくと無限にパターンは存在するんだけども、どこかの地域で仕事をする限り文化的な背景や人という部分は情報を獲得していきながら変数を定数化していくことが必要で、そういうことを繰り返していく。変数を如何に定数化していくか、という部分と最後まで変数のままで残っている部分とどう戦っていくかというところが非常に面白い。面白いというか、面白いと思わない人はやってられないんだろうな、と思う。

こういう感覚を持っていると、どういうところを対象にしても色々もがいて反応を見てそれをフィードバックしながら事業を進めていく、という感じになって、どういうとこを対象にしても本質的には「やってることは同じ」なのかな、と思う。

それが、経営者なら事業が対象になるし、事業部長なら事業部全体、課長なら課という風にそれぞれ持ってる範囲は違うし、難易度も見るべきこと、粒度は違うけど、とはいえ本質的には一緒なのかな、と。

とはいえ、事業ドメインや地域みたいなところで苦労の差とかはめちゃめちゃあると思うけどね!

僕はまだアフリカの洗礼を受けていないので、早くアフリカに行きたいな、と思います₍⁽⁽(ી(*´ω`*)ʃ)₎₎⁾⁾

ウガンダな環境で働くエンジニアも少し増えた

sugi511.hatenablog.com

以前、この記事を書いたおかげで何人も、と書くと大げさだけども色んな方からお声かけいただいたり、こっちが声かけたりして少しエンジニアが増えました。本当にありがとうございます。

まだまだ、僕自身が未熟なのもあって恩返しをきちんと出来るかは分かりませんが、一緒に手伝ってくれる人には気持ちよく働いてもらえるように頑張りたいです₍⁽⁽(ી(*´ω`*)ʃ)₎₎⁾⁾

人が増えた分見ないといけない部分が増えたりして、前より適当にながせる部分が少なくなってしまったのですが、その分実装の分担も出来るし、相談もできるし、めちゃ心強く感じているここ2ヶ月です。まだまだノリノリではないですが踏ん張りどころだと思って頑張っていきたいです。

そ・し・て!!

前回の記事を書いてからも、しばらく予防接種を受けてなかったんですが、

「てか、いつウガンダ来るんすか?」

って2月末に代表に予防接種さぼってたことを察知されたので、そっこーで行ってきました(っ・ω・)っ

ぽんぽん打てるもんじゃなくて1ヶ月待たないといけない・・・とか10日後じゃないとこのカードは生きない、とか色々あるんだなーって感じでした(そして予防接種高くない?いや、身体を守ると思うと安いんだけど)


そんな感じでウガンダに5月末ぐらいに行けたらいいなー。あー、航空券取らないと。

時間が出来た訳ではないが

最近やっと、Railsのプロジェクトでテスト書き始めた。

テスト書くために、メソッド見直してるとリファクタリングできそうなのがたくさん・・・(っ・ω・)っ

データが増えてくると遅くなるものもあるだろうし、複雑なロジックのは一旦後回しにして、シンプルなやつからこなしてテスト書く習慣をつけよう。

「社長と経営者は違う。その差はなにか」

diamond.jp

社長ではなく経営者にならなければ株主や従業員、あまたのステークホルダーへの責任を果たせない。

 その弱い会社の経営者の最大の任務は、「見切り」だ。見切りこそが、結果責任だけの社長を経営者に変えると言ってもよいほどだ。

 だから基本的には出たとこ勝負だ。それを猛烈なスピードで繰り返す。そしてダメだと思ったら即座に見切る。それを促す覚悟に満ちた経営者の力こそが、小さな企業が大きな企業に負けない力だ。

自分の認知の範囲での情報に基づいた結論付けをするのが判断だと思っているけど、ここで出てくる「見切り」というのは自分の認知外も含めたものに対して覚悟を決めた上で行う決断なんだと思う。

決断というのは、どうしても論理的に正しくなかったり、先が見えづらいものであるけども、自身の責任においてその選択を実行するというのが決断。この決断は失敗することもあるけど、その失敗した時に何が失敗したのか兆しは見えていなかったのか、など集中し振り返ることを繰り返すことで研ぎ澄まされてある種の超能力のように見える第六感のようなものが身に付くのだと思う。超能力欲しい。

rubyで初心者が間違いそうな間違いしてしまった(まぁ、初心者みたいなもんだけど)

あるあるなのかもしれないけどやってしまった。

RailsでUserモデルがあって、そこにenumでrolesみたいなのを定義している。
しかし、roles内にあるadmin権限は我々スーパー管理者しか触れないようにしたい。
なので、一般ユーザーには目に触れもしないようにしたいため、こうしていた。

    %tr
      - User.roles.delete(:admin)
      %th= f.label :role, "Role"
      %td= f.select :role, User.roles.map{|r| [r[0], r[0]]}

が、しかしこれをするとUserモデルのrolesから:adminから消し去ってしまって、二度と出て来ない。
つまり、スーパー管理者の編集画面ですら:adminの設定が見えなくなってしまって、admin権限を持つユーザーを作成することができなくなってしまった。


さすがにこれはまずい、と以下のように修正した。

    %tr
      - roles = User.roles
      - roles.delete(:admin)
      %th= f.label :role, "Role"
      %td= f.select :role, roles.map{|r| [r[0], r[0]]}


が、問題は解決されない。
で、なんだろうと思ったがこれにも問題があった。

User.roles.object_id
roles.object_id


と調べてみると同じobject_idを保有している。ので、deleteをrolesにかけたところでUser.rolesから:adminが消え去る現象は改善されない。
つまり同じオブジェクトに操作していることになっているので、cloneする必要があるので以下のようにした。

    %tr
      - roles = User.roles.dup
      - roles.delete(:admin)
      %th= f.label :role, "Role"
      %td= f.select :role, roles.map{|r| [r[0], r[0]]}


が、実はこれにも問題(以下略

結論から言うと、今回はこれでOKなんだけども、

User.roles[:admin].object_id
roles[:admin].object_id

は同じなので、実はまだヤバい。
rolesの中から(インデックスとして)消し去るだけなら良いんだけど、:adminの持つ値を自体を変えるとUser.rolesの中の:adminの値まで変わってしまうことになるっぽい。

    %tr
      - roles = Marshal.load(Marshal.dump(User.roles))
      - roles.delete(:admin)
      %th= f.label :role, "Role"
      %td= f.select :role, roles.map{|r| [r[0], r[0]]}

じゃあ、どうすんだよ!って話なんだけど、こうすると良いっぽい。


参考はこちら

qiita.com