WindowsにRocket.Chatをたてる

Docker Kitematicを使うと、簡単にたてられたのでメモ。

1.Docker Toolboxをインストール
Docker Toolbox | Docker

2.Kitematicを起動し、mongodbをとってくる
f:id:noifuji:20170218135502p:plain

3.rocket.chatをとってくる
(officialのほうを使いました)
f:id:noifuji:20170218135645p:plain

4.このままだと、rocket.chatの起動時にエラーがおきるはず。
そこで、下記のACCESS URLの値をひかえておく。
f:id:noifuji:20170218140115p:plain

5.rocket.chatのsettingをクリックし、MONGO_URLをさっきの値に書き換えて、
「SAVE」をクリック
f:id:noifuji:20170218140515p:plain

6.rocket.chatのメイン画面を見ると、WEB PREVIEWにログイン画面がうつているのが見えます。このWEB PREVIEWをダブルクリック。
f:id:noifuji:20170218140600p:plain

7.ログイン画面がブラウザで表示されます。
ここで新規アカウントを作成して進むと、次のWarningが表示されるので、「はい」を選択。
f:id:noifuji:20170218140850p:plain

8.外部のLANから見えるようにする。
Virtualbox Managerを開いて、defaultを右クリック>設定>ネットワーク
アダプター1のポートフォワーディング
ルール追加で、ホストポート8080、ゲストポートをrocket.chatのpublished IPに設定する。

【node】node.jsでサムネイルっぽいものを作る。

そのへんに転がってる画像からサムネイルっぽいものを作ります。
easyimageというライブラリを使用しました。

github.com

まずインストール。

$ apt-get install imagemagick
$ npm install easyimage

下記の感じで変換します。
ここではrescropというメソッドを用いて、リサイズと不要部分の切り取りを同時に行っています。

sample.js

var easyimg = require('easyimage');

easyimg.rescrop({
            src:'変換前ファイル名', dst: '変換後ファイル名',
            width:400, height:5400,
            cropwidth:100, cropheight:100,
            x:0, y:0
        }).then(function (file) {
            console.log("completed");
        });

【javascript】順番に非同期処理を実行する。

async.jsというライブラリを用いる。nodeでよく使われているらしい。

npm install async --saveでインストール


下記のコードで各URLに対して画像を取得してくる処理を実行できる。

test.js

var request = require('request');
var fs = require('fs');
var async = require('async');

var urls = ['URL1',
    'URL2',
    'URL3'
];


async.each(urls, function(url, callback){
    request({
            method: 'GET',
            url: url,
            encoding: null
        },
        function(error, response, body) {
            var filename = getFilename(url);
            if (!error && response.statusCode === 200) {
                fs.writeFileSync('./img/a' + filename + '.png', body, 'binary');
                console.log("loop:" + filename);
            }

            // 次のリクエストを呼ぶ。
            callback(null, filename);
        }
    );

}, function(err, results) {
    if (err) {
        throw err;
    }
    console.log('series all done. ');
});

function getFilename(url) {
    var temp = url.split('/');
    return temp[temp.length - 1 ];
}

アーキテクチャ・DIしらべもの

Dagger2
Android: Dagger2でDIをする. 基本編 Part1 · Don't Stop The World

アーキテクチャ
AndroidではMVCよりMVPの方がいいかもしれない - Konifar's WIP
The Clean Architecture | 8th Light
Architecting Android…The clean way? | Fernando Cejas

【Android】Drawer使用時、アニメーションにラグが生じる件

DrawerLayoutを閉じる際に、Fragmentのreplaceを実行していると動きがカクつく問題があった。

下記リンクの記述を発見し、Drawerを閉じきってからFragmentのreplaceを行うと解消できた。


DrawerLayout | Android Developers

Avoid performing expensive operations such as layout during animation as it can cause stuttering; try to perform expensive operations during the STATE_IDLE state.

Drawerレイアウトの開け閉めをしている際などには、Fragmentの遷移等の重い処理を避けるのが良いということのようだ。

【Android】Drawerを実装する(Material Design)

com.android.support:design:22.2.0に含まれているNavigationViewを用いて、
MaterialDesignのDrawerを実装できるようなので、やってみた。
下記を参照www.android4devs.com

【Android】Drawerを実装する(android.support.v7)

f:id:noifuji:20151111213805p:plain:w200
android.support.v4の方法は見つかったが、非推奨になっていたのでv7の方法をまとめる。

下記を参照stackoverflow.com

style.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    </style>

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

</resources>

MainActivity.java(AppcompatActivity)のonCreate()

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawer, null,
                R.string.app_name, R.string.app_name) {
            @Override
            public void onDrawerClosed(View drawerView) {
            }

            @Override
            public void onDrawerOpened(View drawerView) {
            }

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
            }

            @Override
            public void onDrawerStateChanged(int newState) {
            }
        };

        mDrawer.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        mDrawerToggle.syncState();
    }