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

Mastodonにプルリクしてみました。

辛い。
でもやる価値があるとおもうんだよ。
コミッターに載れたらめっちゃ嬉しいやん!

機能は簡単なもので、間違えてavatar消してしまったときにavatarを再取得するって言うrake task。

  • 手元の環境のrubocopが上手く動いていなくてそこで怒られる。
  • ループをnextで飛ばせと怒られる。

→辛い。
でも、たしかに言われたことやるとループの深さも浅くなって見通し良くなった。
これは力がつくね。rubocopは手元の環境をもうちょっときちんとしてそこでつまづきたくないね。
ともかくMastadonから目が離せない今日このごろ。

ていうかブランチ切らないでmasterで作業していたことにプルリクしてから気づく有様。
ちょっと無様だねー

どうか本家に取り込まれますように。お願い!

github.com

Mastodonのアップデートv1.2へ

dockerのデプロイ、アップデートの方法がごっそり消えとる(キレ気味)
サンクス@nukosu@pao.moeさん
Main README developer documentation · Issue #1830 · tootsuite/mastodon · GitHub
短絡的。documentの方を整備してから変更してよ。あんまり英語読みきれてないけどお前のshouldとか知らん。
仕方がないので
README.mdを掘る
github.com
docker-compose.ymlとか編集しているので退避しないとだめね~
以下、流したコマンド

git stash save
git pull
git describe --tags `git rev-list --tags --max-count=1`
# versionを確認
git checkout -b v1.2 $(git describe --tags `git rev-list --tags --max-count=1`)
git stash list
git stash list -p
git stash show stash@{0}
git stash apply stash@{0}
docker-compose stop
docker-compose build
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails assets:precompile
docker-compose up -d
#追記
git stash drop stash@{0}

以上です。
次はdb/redisもバックアップすべきですねー。

MastodonをDB永続化忘れて起動したけど最小限の犠牲で済ませた

要はdocker psとdocker cp

hoge@ubuntu16:~/tmp/bk$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                              NAMES
5b96312a6b26        mastodon_web         "bundle exec rails..."   About an hour ago   Up About an hour    0.0.0.0:3000->3000/tcp, 4000/tcp   mastodon_web_1
960bb0ec5396        mastodon_streaming   "npm run start"          28 hours ago        Up About an hour    3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
e5436243c18a        mastodon_sidekiq     "bundle exec sidek..."   28 hours ago        Up About an hour    3000/tcp, 4000/tcp                 mastodon_sidekiq_1
69e8481531c6        redis:alpine         "docker-entrypoint..."   28 hours ago        Up About an hour    6379/tcp                           mastodon_redis_1
8c5100e9fec4        postgres:alpine      "docker-entrypoint..."   28 hours ago        Up About an hour    5432/tcp                           mastodon_db_1
hoge@ubuntu16:~/tmp/bk$ docker cp mastodon_db_1:/var/lib/postgresql/data ./data

あとはdockr rm dbとかしてやればdocker-compose.ymlの設定が反映される

  db:
    restart: always
    image: postgres:alpine
### Uncomment to enable DB persistance
    volumes:
      - /path/to/postgres/data:/var/lib/postgresql/data

最小限の犠牲(3トゥートぐらい)ですんだ。
泥臭いですね!

Mastodonのインストール

  • Docker初挑戦
  • 動的IPなのでMydnsでドメイン取得
  • nginxではなくApacheで。NameBaseVirtualHost
  • rvm、nvm
  • let's encrypt

いろいろ四苦八苦してサービス提供開始できました。Dockerがむずい。

mastdn.lovesaemi.daemon.asia
是非きてください。

インストールは公式と
github.com
このqiitaでなんとかなる
CentOSUbuntuの読み替え必要だけど基本同じ
qiita.com
MyDnsは
dotnsf.blog.jp
rvm、nvmはググって。

最初はサブディレクトリ運用出来ないかで四苦八苦した7時間ぐらい→無理と判断
ドメイン取ってすんなり3時間ぐらいで色々成功。
SparkPostがよくわからなくて辛かったよ。

本当は適切なドメインをお金だして買うべきなんだろうけど無料に固執した。
構築はとても楽しくて没頭しました。

サインアップして盛り上がって欲しいな。

Unity5の教科書 8章

おわりー。
レベルデザインはあまりふみこまないようにした。
もっといろいろできるのだろうけど。
とりまUnity触れまーす、初心者でーすぐらいには行けたかと。
Unity WebGL Player | AppleCatch


github.com

次はDeepLearningかなー

値渡しと参照渡し

値渡しだとコピーされるので値は変更されない。
参照渡しだと中身を変更できる。
ただし、参照型のオブジェクトだと常に参照渡しの模様。
あえて参照渡しをする意味も無い気がします。

<?php
$str = "hoge";

// 値渡し
function mod($str){
    $str .= "fuga";
}

// 参照渡し
function modref(&$str){
    $str .= "hoge";
}

mod($str);

echo $str . "\n"; // => hoge

modref($str);

echo $str . "\n"; // => hogehoge

// ただし、参照型だと常に参照渡し
$obj = new stdClass();
$obj->x = "10\n";

echo $obj->x; // => 10

function mod2($obj){
    $obj->x = "20\n";
}
mod2($obj);
echo $obj->x; // => 20

参照渡しについては下記によくまとまってる。
qiita.com

JavaScriptのカスタムイベントとプロトタイプベースのオブジェクト指向(継承は知らん)

JavaScriptのカスタムイベントとプロトタイプベースのオブジェクト指向(継承
は知らん)

<html lang="ja">
  <head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  </head>
  <body>
    <div id="d1" style="background-color:red;height:100px">
      ターゲット1(生JavaScript)
    </div>
    <div id="d2" style="background-color:yellow;height:100px">
      発生源1(生JavaScript)
    </div>
    <div id="d3" style="background-color:green;height:100px">
      ターゲット2(jQuery)
    </div>
    <div id="d4" style="background-color:lightblue;100px;height:100px">
      発生源2(jQuery)
    </div>

    <script>
      // イベント
      // 生JavaScript
      var d1 = document.getElementById("d1");

      d1.addEventListener("myevent",function(){
         alert("myevent fired");
      });

      var d2 = document.getElementById("d2");
      d2.addEventListener("click",function(){
        var event = document.createEvent("HTMLEvents");
        event.initEvent("myevent",true,true);
        d1.dispatchEvent(event);
      });
      // イベント
      // jQuery
      $("#d3").on("my-ev",function(){ alert("my-ev fired"); });
      $("#d4").on("click",function(){
        $("#d3").trigger("my-ev");
      });

      // プロトタイプベースのオブジェクト指向(継承とか知らん)
      var Hoge = function(){};
      Hoge.prototype.bar = function(){ console.log(this.x); };
      Hoge.prototype.x = 999;
      var obj1 = new Hoge();
      obj1.x = 10;
      var obj2 = new Hoge();
      obj2.x = 20;
      var obj3 = new Hoge();
      obj1.bar();
      obj2.bar();
      obj3.bar();
    </script>
  </body>
</html>