おかゆ++

IT業界の片隅で生き残るブログ

vimrcをファイル分割する&VimとNeoVimで共通化する

vimrc分割の理由

Vimを使っていれば、プラグインを追加したり、設定を変えたり等々でvimrcは長くなっていく一方です。 ということで、読みやすさと拡張性を確保するためにも当然分割したいわけです。

分割ついでに、VimとNeoVimの両方で同じvimrcを使うようにしたい。vimrcの中身が同じって意味ではなくて、同じvimrcファイルをVimとNeoVimの両方で参照するってことです。

分割の仕組みというか、sourceについて

Vimのコマンドに source というのがあります。まんま指定したVim scriptファイルを読み込むコマンドです。これを使えば複数ファイルに分割できそうですね。実際には source をラップした関数を作るのがいいんじゃないでしょうか。

今回のディレクトリ構成

以下の方針でディレクトリを分けます。

  • 全ての設定ファイルは ~/.dotfiles/vim に配置して、所定の位置にはシンボリックリンクを張る。
  • プラグイン管理には dein を使う
  • Vim で dein を使った時のファイル類や、その他のファイルは ~/.vim に配置する。
  • NeoVim で dein を使った時のファイル類、その他のファイルは ~/.nvim に配置する。
  • 設定ファイル類は *.rc.vim という名前にする。

ということで、こんな感じ。

~/
├─.vim
│  ├─dein    deinがダウンロードしたリポジトリとかが入る
│  └─rc      ~/dotfiles/vim/rc へのシンボリックリンク
├─.nvim
│  ├─dein    deinがダウンロードしたリポジトリとかが入る
│  └─rc      ~/dotfiles/vim/rc へのシンボリックリンク
└─dotfiles
    └─vim
        └─rc  色々な設定ファイル類が入る。vimrcからsourceで読み込む。

VimとNeoVimの判定

vimrcの先頭でVimとNeoVimの判定を実施して、ディレクトリパスなどをグローバル変数に入れておきます。以後はこの変数を使うようにします。

NeoVimの場合は has('nvim') がTrueになるので、これを使います。

if has('nvim')
    let g:vim_home = expand('~/.nvim')
    let g:rc_dir = expand('~/.nvim/rc')
else
    let g:vim_home = expand('~/.vim')
    let g:rc_dir = expand('~/.vim/rc')
endif

読み込み用の関数

基本的には rcディレクトリからのみ読み込むようにするので、それ用に関数を作ります。 また、VimとNeoVimではディレクトリが違うので、そのあたりもさっきのグローバル変数で吸収します。

" rcファイル読み込み関数
function! s:source_rc(rc_file_name)
    let rc_file = expand(g:rc_dir . '/' . a:rc_file_name)
    if filereadable(rc_file)
        execute 'source' rc_file
    endif
endfunction

call s:source_rc('init.rc.vim') のような感じで書けば、dotfiles/vim/rc/init.rc.vim が読み込まれます。

最終的なvimrc

最終的には以下のようになりました。

if has('nvim')
    let g:vim_home = expand('~/.nvim')
    let g:rc_dir = expand('~/.nvim/rc')
else
    let g:vim_home = expand('~/.vim')
    let g:rc_dir = expand('~/.vim/rc')
endif

" rcファイル読み込み関数
function! s:source_rc(rc_file_name)
    let rc_file = expand(g:rc_dir . '/' . a:rc_file_name)
    if filereadable(rc_file)
        execute 'source' rc_file
    endif
endfunction

"------------------------------------------------------------------------------

" 基本設定
call s:source_rc('init.rc.vim')

" エディタの設定
call s:source_rc('editor.rc.vim')

" Dein.vim
call s:source_rc('dein.rc.vim')

" カラースキーマ
call s:source_rc('color.rc.vim')

" ターミナル設定(今の所NeoVimの :terminal の設定)
call s:source_rc('terminal.rc.vim')

" neocomplete
call s:source_rc('neocomplete.rc.vim')

" unite
call s:source_rc('unite.rc.vim')

" caw.vim
call s:source_rc('caw.rc.vim')

" NERDTree
call s:source_rc('nerdtree.rc.vim')

" lightline.vim
call s:source_rc('lightline.rc.vim')

ちょっと設定ファイルを分けすぎた感もあるけど、まぁ許容範囲かなーということで。

インストール用のスクリプトも作っておく

install.sh とか install.bat とかを作っておけば、git clone して sh install.sh すれば環境が整うはず。

Unix用のinstall.shはこんな感じ。

#!/bin/sh
cd $(dirname ${0}) 

vim_home=~/.vim
mkdir -p ${vim_home}
ln -sf `pwd`/vim/vimrc ~/.vimrc
ln -sf `pwd`/vim/rc ${vim_home}/rc

nvim_home=~/.nvim
mkdir -p ${nvim_home}
mkdir -p ~/.config/nvim
ln -sf `pwd`/vim/vimrc ~/.config/nvim/init.vim
ln -sf `pwd`/vim/rc ${nvim_home}/rc

Windows場合、シンボリックリンクの作成に管理者権限で実行する必要があることだけ注意が必要です。 また、vimrcの置き場所とかも色々*1だと思いますので、以下はあくまでも例です。

@echo off
@setlocal
cd %~dp0
set current=%~dp0

set vim_home=%HOME%\.vim
mkdir %vim_home%
mklink "%HOME%\.vimrc" "%current%vim\vimrc"
mklink "%HOME%\.gvimrc" "%current%vim\gvimrc"
mklink /D "%vim_home%\rc" "%current%vim\rc"

set nvim_initdir=%userprofile%\AppData\Local\nvim
mkdir "%nvim_initdir%"
mklink %nvim_initdir%"\init.vim" "%current%vim\vimrc"

@endlocal
@echo on

*1:自分は環境変数HOMEを用意して、vimrcなんかもそこに置いてます。

はてなブログの背景にアニメーションをつける(自作テーマ不使用)

このブログの背景にアニメーションをつけてみました。コードはGitHubで公開しています。

github.com

はてなブログではhead要素の中に自由に要素を追加できるので、こういうちょっとした改造がすぐできていいですね。

自作テーマを作ることでも実現できると思いますが、そこまでは……という気持ちだったので、JavaScriptでゴリゴリやりました。

ざっくりした方法

  1. canvas要素を画面いっぱいのサイズで最背面に追加する
  2. canvas要素に適当なアニメーションを描画する(アニメーションはsetIntervalとかで愚直に書く)
  3. ウィンドウがリサイズしたときに、canvasも合わせてリサイズする

さくっと自分のはてなブログに適用したい方へ

はてなブログの 設定>詳細設定 を開きます。

f:id:okayu-moka:20170929164807p:plain
はてなブログ 設定>詳細設定

headに要素を追加 に、以下のソースを貼り付けます。

<script>
!function(n){function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var e={};t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{configurable:!1,enumerable:!0,get:i})},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=0)}([function(n,t){!function(){var n=15,t=null,e=null,i=[];window.addEventListener("load",function(n){o(),a(),r(),d()});var o=function(){t=document.createElement("canvas"),t.id="__background_animation_canvas__",t.style.position="fixed",t.style.top=0,t.style.left=0,t.style.zIndex=-1,t.style.margin="0",t.style.padding="0",t.width=window.innerWidth,t.height=window.innerHeight,e=t.getContext("2d"),document.body.appendChild(t)},a=function(){var e=window.innerWidth;n=e>1920?20:e>1600?15:e>1024?10:7;for(var o=0;o<n;o++)i.push({x:t.width/2,y:t.height/2,angle:2*Math.PI*Math.random(),size:30+70*Math.random(),speed:.02+(.05-.02)*Math.random()})},r=function(){var n=null;window.addEventListener("resize",function(){null===n&&window.clearTimeout(n),n=window.setTimeout(function(){t.width=window.innerWidth,t.height=window.innerHeight,n=null},200)})},l=function(){e.beginPath(),e.clearRect(0,0,t.width,t.height),e.closePath();for(var n=0;n<i.length;n++){var o=i[n];e.beginPath(),e.fillStyle="rgba(255, 170, 1, 0.1)",e.arc(o.x,o.y,o.size,0,2*Math.PI,!1),e.fill(),e.closePath()}},u=function(){var n=null;return function(){var e=t.width,o=t.height,a=Date.now();null===n&&(n=a);for(var r=0;r<i.length;r++){var l=i[r],u=l.speed*(a-n),d=u*Math.cos(l.angle),c=u*Math.sin(l.angle);l.x+=d,l.y+=c,(l.x<=0||e<=l.x)&&(l.angle=Math.atan2(c,-d),l.x=l.x<=0?0:e),(l.y<=0||o<=l.y)&&(l.angle=Math.atan2(-c,d),l.y=l.y<=0?0:o)}n=a}}(),d=function(){var n=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=function(t){n?n(t):window.setTimeout(t,33)},e=function(){try{u(),l()}catch(n){console.log(n)}t(e)};t(e)}}()}]);
</script>

以上でアニメーションは適用されますが、全面の要素で隠れてしまう場合があります。その場合はCSSで背景を透明にします。このブログでは記事の部分(#content の部分)に背景色 #ffffff が設定されており、アニメーションが隠れてしまったので、記事部分の背景を透明にします。

cssはデザイン設定からも上書きできますが、コードが近いほうがわかりやすそうなので、同じく headに要素を追加 の部分に以下を追記します。

<style>
#content{ background-color: transparent !important; } /* 背景透過 */
</style>

このあたりは使用しているブログテーマによってまちまちなので、調整が必要です。

コードの解説

簡単にポイントのみ解説します。

jQueryを使うかどうか

ブログテーマによってはjQueryが使用されているものがあり、今使わせてもらっているこのテーマでも読み込まれています。

が、今回は使わずに素のJavaScriptだけにしました。jQueryを使わないと面倒なところが特になかったのと、他のブログテーマに乗り換えたときにも使えるようにしたかったのが主な理由です。

canvas要素を画面いっぱいに追加する

document.createElementcanvas要素の生成して、body要素の直下に追加します。

画面いっぱいに広げる際に注意が必要なのが、canvasのサイズはcssで設定せず、canvas.widthとcanvas.heightで設定する点です。canvas自体のサイズを調整せずにcsswidth:100% などとすると、canvasの解像度はそのままに、横に引き伸ばした表示になってしまいます。今回はウィンドウサイズ=canvasサイズとしたいので、canvas.widthとcanvas.heightを設定します。

var canvas = null;
var context = null;
var createCanvas = function() {
    canvas = document.createElement('canvas');
    canvas.id = '__background_animation_canvas__';
    canvas.style.position = 'fixed';
    canvas.style.top = 0;
    canvas.style.left = 0;
    canvas.style.zIndex = -1;
    canvas.style.margin = '0';
    canvas.style.padding = '0';

    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    context = canvas.getContext('2d');

    document.body.appendChild(canvas);
};

初期化とアニメーション開始のタイミング

案としては DOMContentLoaded イベント時と、windowの load イベント時があります。

はてなブログでは DOMContentLoaded 後にも色々スクリプトが走ったりしているぽいので、今回は load イベントで初期化・アニメーション開始としました。実際、 DOMContentLoaded だとアニメーション開始後のカクツキがひどかったので、load が無難だと思います。

window.addEventListener('load', function(event) {
    createCanvas();
    createCircles();
    initOnResize();
    startTimer();
});

アニメーションの描画

canvasにアニメーションを描画するために、タイマーを回します。タイマーとしては setInterval などでも良いですが、こういう画面更新の用途としては requestAnimationFrame を使うのが良いみたいです。

ただ requestAnimationFrame は対応していないブラウザなんかもあるみたいなので、対応していない場合は setTimeout で代用するようにしておきます。

var startTimer = function() {
    var requestAnimationFrame = 
            window.requestAnimationFrame || window.mozRequestAnimationFrame ||
            window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
    var requestFrame = function(loopFunc) {
        if (requestAnimationFrame) {
            requestAnimationFrame(loopFunc);
        } else {
            window.setTimeout(loopFunc, 33);
        }
    };
    var loopFunc = function() {
        try {
            move();
            draw();
        } catch (e) {
            console.log(e);
        }
        requestFrame(loopFunc);
    };
    requestFrame(loopFunc);
};

JavaScriptの圧縮(minify)

そのままのコードでだいたい130行くらいになってしまったので、圧縮して短くします。Webにオンラインで圧縮してくれるサービスがいくつもあるので、それを利用するのが一番手軽だと思います。

ただ今後のことも考えて、webpack3でminifyするようにしました。plugins にminifyプラグインを指定すると出力時に圧縮してくれます。

const webpack = require("webpack");

module.exports = {
    entry: {
        'build': './src/bubble-anim.js',
        'docs': './src/bubble-anim.js'
    },
    output: {
        filename: "./[name]/bubble-anim.min.js"
    },
    plugins: [
        new webpack.optimize.UglifyJsPlugin()
    ],
}

まとめ

ブログのカスタマイズは楽しいですね。<head> に自由に追加できるということは、実質何でもできると思うので、色々試していきたいです。

Debian 9 stretch インストール直後から環境を整えるメモ

自分用の最低限の環境を整えるためのメモです。

本当は何らかの方法で自動化したいところですが、それはまたの機会に。

sudoできるように

usermod -G sudo [username]

ホームディレクトリの英語化

ホームディレクトリの「デスクトップ」とか「ダウンロード」を英語にします。

sudo apt-get install xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update

Git、GitKraken

たしかGitが入ってなかった気がするので導入。 クライアントはGitKrakenがお気に入りです。

sudo apt-get install -y git
wget https://release.gitkraken.com/linux/gitkraken-amd64.deb
sudo apt install -y ~/gitkraken-amd64.deb
rm -y gitkraken-amd64.deb

VimGVim、NeoVim、ついでにPython3

これがないと何もできない……

sudo apt-get install -y vim vim-gnome neovim
sudo apt-get install -y python3 python3-pip
sudo pip3 install --upgrade neovim
git clone [dotfilesリポジトリ] ~/dotfiles
sh ~/dotfiles/install.sh

Vivaldi

最強ブラウザ。 最新版を取ってくるようなURLが見つからなかったので都度探すしかないかも……

wget https://downloads.vivaldi.com/stable/vivaldi-stable_1.12.955.36-1_amd64.deb
sudo apt install -y vivaldi-stable_1.12.955.36-1_amd64.deb
rm -y vivaldi-stable_1.12.955.36-1_amd64.deb

Node.js

公式サイト通りの手順で、aptで入れます。

パッケージマネージャを利用した Node.js のインストール | Node.js

sudo apt-get install -y curl
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g npm-check-updates

その他

sudo apt-get install -y build-essential
sudo apt-get install -y peco
sudo apt-get install -y byobu
sudo apt-get install -y chromium chromium-l10n
sudo apt-get install -y caja-open-terminal

今日の飲み会の店を探す方法

飲み会の会場を探すのが難しい

なぜかしょっちゅう自分に回ってくるような気がする、会社の飲み会の幹事。 おかしい。もう入社して5年目、後輩もたくさん入ってきているハズなのに、なぜ自分が幹事なのか……

一番大変なのは、お金の計算だったり参加者の募集だったり……ではなく、お店を探すことです。

参加人数と参加者の好みに合わせて、適切な会場を選ばなくてはなりません!

知ってる店から選ぶ

これまでに行ったことのある店を候補にして、その中から選びましょう。 お店の雰囲気や料理の味もわかっているので、無難な選択ができます。

が、普段プライベートで飲みに行かない人なので、行ったことある店=会社の人と行った店。 過去の飲み会とガン被りです!

別に気にする人はいないと思うんですけどねー、なんとなくイヤですよねー……

知ってそうな人から聞く

よく飲み会の幹事をやってそうな人に聞きましょう。大体いい店を知ってると思います。

なんなら参加者に「今度の飲み会、どこ行きたい?」と聞いてしまうのでもいいように思います。 知りもしない、料理がおいしいかどうかも分からない店に行くくらいなら、 参加者の行きたい店に行くほうがベターですよね。

ネットで探す

ホットペッパーグルメとかぐるなびとかで探しましょう。 ちょっと前にステマだサクラだヤラセだと話題になったような気がしますが、 料理の写真と地図がまとまっているというだけでも利用価値はあると思います。

ただ、今度は逆に情報が多すぎて何を選ばいいのかわからなくなってくるのが欠点ですね……

最後の一押し

参加人数にあった店も見つけた、それも肉料理と魚料理の2店舗を見つけた、さぁ、どっち?!

最後はもう、自分が行きたい店にしてしまえばいいと思います。 幹事が決めた店に文句つける人、空気読めって思います。 てか文句つけるなら自分で幹事やれよ!

逆に自分が幹事じゃない時は、幹事の仕事っぷりや店選びに文句をつけないようにしたいものですね。 みんな頑張って店を選んで、集金して、当日キャンセルした人の連絡をしているんです。

おおらかな心でおいしい料理とお酒が飲みたいものです!

『約束のネバーランド』1~5巻をまとめ買いしたので感想

ネタバレありですので、読んでいる途中の人、これから読むつもりの人はUターンお願いします。

たまたまKindleで1巻無料おためしをやっていて、読んでみたら面白かったので 『約束のネバーランド』1〜5巻をまとめて買いました。コミックス以外の部分は未読です。

↑は最新刊の5巻。かっこいい。

三人の主人公 VS 牧場のママ という対立構造がわかりやすくて、かつ戦いがスリリングでグイグイ引き込まれました。 設定自体は「人間牧場からの脱出」という、ありがちとまでは言いませんが珍しいほどではない設定なんですが、話の進め方、構成、魅せ方がうまいなぁと思います。

基本は頭脳戦、でもやるときやる=アクションシーン、という流れがスムーズで、どちらか一辺倒でないのがその要因だと思いました。ずーっとセリフだけとか、延々相手の裏をかいてるだけとか、面白くないですからね。ちゃんと選択肢として具体的な行動が示されて、かつ実行に移されるのでそこが気持ちいい。

ただ、1〜4巻までの牧場編が面白かっただけに、牧場を脱出してからの5巻以降、失速しないかどうかだけが心配です。 まぁ牧場に残した子どもたちを助けに戻ることも宣言していたり、ノーマンは本当に死んだのか? など伏線も沢山あるので、これからも楽しみに読んでいきたいです。

個人的にはノーマンは生きていて、牧場側の人間としてエマ達と対立する、という流れになるんじゃないかなーと思います。

【まだ】3連休にバンドリをインストールして★3を覚醒させるまでの記録【無課金】

バンドリをインストールしてしまったのが運の尽き

2017/9/16~18の3連休、台風が直撃することが明らかとなり、この機会に仕事関係の勉強をしようかなぁと漠然と考えていました。

金曜日、寝る前にたまたまバンドリの広告が目に入り、iPadにインストールしました。 プレイしてみると音ゲーとしてそれなりに遊べるようになっており、少しだけ遊ぶつもりが夜更かししてしまいました。

そしてせっかくの3連休のいくらかをバンドリに費やすことになったのです。

1日目:音ゲー楽しい期

音ゲー自体が楽しくて、ひたすらフリーライブで難易度ハードを埋めていく……曲数自体はあまり多くはないですが、カバー曲などもあり、「プレイしてみたい」と思わされてしまいます。オリジナル曲の出来も悪くない。

昔はIIDX、数年前はスクフェス、今はたまにチュウニズムを遊ぶ程度の音ゲー歴ですが、やっぱり音ゲーは楽しいです。特にバンドリはシャンシャン音が鳴るのが気持ちよくて、1日目にしてすでにシャンシャン中毒。

リセマラはしていないので、最初に引いたのは★3の「湊友希那[歌姫の覚悟]」でした。

↓この子です

bangdream.gameapper.com

無課金でやるつもりなので、当分の間は我がバンドのリーダーとして活躍してくれることでしょう……

それから無料で手に入るスター(ガチャを回すためのアイテム。いわゆる「石」)が2500個集まったので10連ガチャを1回まわし、★3が2枚出て合計3枚に。プレイヤーレベルもどんどん上がり、スマホゲー序盤によくある「ずっとプレイしつづけられるぅぅぅうう」の状態でした。音ゲー楽しい。キャラかわいい。

そんなにスマホゲーを遊ばないのでただの感覚ですが、スマホゲーは序盤はサクサク進むように作られているように思います。序盤にガッツリ遊ばせて、後半になるにつれて必要なカードやアイテムが増え、知らずしらずのうちに時間とお金を費やしてしまう……というのが基本戦略。課金してしまうほどハマっている人はカモですので、そうはならないように……できるならしますけどね。

2日目:課金の誘惑に耐える期

プレイをしているとカードのレベルも上がっていき、総合力(カードの能力の合計値)が70000を超えたので、協力プレイをやってみました。すると、それまでフリーライブをやっていたのがバカだったなぁと思うくらい、クリア報酬(アイテム)がもらえることに気づきました。バンバン協力プレイをやっていると、キャラのレベルが最大になり、それ以上成長させるには「特訓」をする必要が出てきました。

しかしこの「特訓」を行うには、特定のアイテムが必要です。我がバンドのリーダーである「湊友希那[歌姫の覚悟]」を特訓するためには、

  • ハッピーのかけら(小) × 1,000
  • ハッピーのかけら(中) × 300
  • 奇跡のクリスタル × 3

が必要です。このうち、ハッピーのかけら(小)と(中)はすぐに集まりました。しかし、「奇跡のクリスタル」が出ない……説明文を見るとライブ(音ゲー)でごく稀にドロップすると書いてあるんですが、なかなか出ない。Twitterで検索して、同じように「出ない」と嘆く人を見て、いや俺が聞きたいのは愚痴ではなく出現確率や確実な入手方法だどうすれば手に入る、とネットの海をさまよい、やっぱりひたすらライブをしてドロップを狙う……

もう一つの入手方法として、ゲーム内イベントの報酬としてもらうという方法もあり、そちらを取得するためにもライブを繰り返す……どんどん上がっていく音ゲーの腕前……でも最大難易度のExpertはクリアできたりできなかったり……

現実的に狙えそうなイベント報酬は受け取り、それでも手に入った「奇跡のクリスタル」は2個。1個足りない!

「もう奇跡のクリスタルを入手するために課金してしまおう」と悪魔がささやきます。いや今月はロードバイクの部品を買ったりして金欠、ここで使うようなお金は……あるけどそれは貯金というやつで……来月の給料を考えると……払えなくもないが……嫁にバレさえしなければ……いやでもマリオオデッセイ出るし……

誘惑にはなんとか耐えて、協力ライブを繰り返すこと50回。奇跡のクリスタルはドロップしませんでした。

3日目:熱が冷めたと思いきや再燃期

プレイ初期の「たーのしー!」の感覚が薄れてきた3日目、それでも淡々と協力ライブを繰り返します。もはや音ゲーは作業に成り下が……らない。バンドリは音ゲー部分が楽しいです。これはうれしい反面、完全に沼。

そして、協力ライブの合計回数が70回に届きそうという頃、ついに……

ドロップしたー!

すぐさま特訓! いやっほー! 友希那ちゃんのイラストが変わったぜー! レベル上限も解放だー!

バンドリ楽しい。

で? これからどうするの?

★3を特訓できた、バンドの総合力も上がってきた。次にするのは……

  • ★4を手に入れる ←スターが必要。現実的には課金が必要か……?
  • Roseria(湊友希那の所属バンド)以外のバンドレベルを上げる ←無課金でいける。
  • エリア内アイテム(能力値アップアイテム)を集める ←これは無課金で結構いけそう。
  • 音ゲーの実力をあげる ←当然無課金でできる。

このあたりかなーと思います。こうしてみると結構無課金でも遊べますね。

ただ、スマホゲーあるあるで、やっぱり新しいキャラクターが出るとそれがほしくなる。 ついでにバンドリでは同じバンドのメンバーをそろえると利点が多いので、同じバンドの強いカードを揃えたくなってくる。こうなるともう課金しかない。

結局、今も昔もスマホゲーで自由を手に入れるには課金しかないのです。でもバンドリは無課金で遊びたいと思います。

というか知らなかったけどアニメあるんですね、見ようかな……完全にラブライブ!にハマった時と同じ流れなのが不穏ですが、時間があれば見てみようと思います。

それでも無課金を貫く!

Ubuntu/DebianにVivaldiをインストールする手順

f:id:okayu-moka:20170920161743p:plain

DebianVivaldiをインストールしたので、その覚え書き。すんなり入ったので本当にただのメモとログですが……

前提

今回は Debian 9.1 stretch にインストールしました。Ubuntu系でも結局は同じだと思います。

公式サイトからダウンロード

公式サイトから、DEBパッケージファイルをダウンロードしてきます。

vivaldi.com

方法はなんでもいいですが、私は普通にFirefoxでダウンロードしました。

インストール

Ubuntuだと *.deb ファイルをダブルクリックするだけでインストールできるみたいです。

Debianの場合はそこまで親切ではないので、以下のコマンドでインストールします。

$ sudo apt install ./vivaldi-stable_1.11.917.43-1_amd64.deb

apt コマンドだと、依存パッケージも同時にインストールしてくれるみたいです。以下、実行時のログ。

$ sudo apt install ./vivaldi-stable_1.11.917.43-1_amd64.deb
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
注意、'./vivaldi-stable_1.11.917.43-1_amd64.deb' の代わりに 'vivaldi-stable' を選択します
以下の追加パッケージがインストールされます:
  libappindicator1 libdbusmenu-glib4 libdbusmenu-gtk4 libindicator7
推奨パッケージ:
  adobe-flashplugin oxideqt-codecs-extra
以下のパッケージが新たにインストールされます:
  libappindicator1 libdbusmenu-glib4 libdbusmenu-gtk4 libindicator7
  vivaldi-stable
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
50.6 MB 中 300 kB のアーカイブを取得する必要があります。
この操作後に追加で 190 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://ftp.jp.debian.org/debian stretch/main amd64 libdbusmenu-glib4 amd64 12.10.2-2 [104 kB]
取得:2 http://ftp.jp.debian.org/debian stretch/main amd64 libdbusmenu-gtk4 amd64 12.10.2-2 [90.8 kB]
取得:3 http://ftp.jp.debian.org/debian stretch/main amd64 libindicator7 amd64 0.5.0-3+b1 [52.9 kB]
取得:4 /home/okayu/vivaldi-stable_1.11.917.43-1_amd64.deb vivaldi-stable amd64 1.11.917.43-1 [50.3 MB]
取得:5 http://ftp.jp.debian.org/debian stretch/main amd64 libappindicator1 amd64 0.4.92-4 [52.5 kB]
300 kB を 0秒 で取得しました (431 kB/s)     
以前に未選択のパッケージ libdbusmenu-glib4:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 183636 個のファイルとディレクトリがインストールされています。)
.../libdbusmenu-glib4_12.10.2-2_amd64.deb を展開する準備をしています ...
libdbusmenu-glib4:amd64 (12.10.2-2) を展開しています...
以前に未選択のパッケージ libdbusmenu-gtk4:amd64 を選択しています。
.../libdbusmenu-gtk4_12.10.2-2_amd64.deb を展開する準備をしています ...
libdbusmenu-gtk4:amd64 (12.10.2-2) を展開しています...
以前に未選択のパッケージ libindicator7:amd64 を選択しています。
.../libindicator7_0.5.0-3+b1_amd64.deb を展開する準備をしています ...
libindicator7:amd64 (0.5.0-3+b1) を展開しています...
以前に未選択のパッケージ libappindicator1:amd64 を選択しています。
.../libappindicator1_0.4.92-4_amd64.deb を展開する準備をしています ...
libappindicator1:amd64 (0.4.92-4) を展開しています...
以前に未選択のパッケージ vivaldi-stable を選択しています。
.../vivaldi-stable_1.11.917.43-1_amd64.deb を展開する準備をしています ...
vivaldi-stable (1.11.917.43-1) を展開しています...
libindicator7:amd64 (0.5.0-3+b1) を設定しています ...
mime-support (3.60) のトリガを処理しています ...
desktop-file-utils (0.23-1) のトリガを処理しています ...
menu (2.1.47+b1) のトリガを処理しています ...
libdbusmenu-glib4:amd64 (12.10.2-2) を設定しています ...
libc-bin (2.24-11+deb9u1) のトリガを処理しています ...
libdbusmenu-gtk4:amd64 (12.10.2-2) を設定しています ...
libappindicator1:amd64 (0.4.92-4) を設定しています ...
vivaldi-stable (1.11.917.43-1) を設定しています ...
update-alternatives: /usr/bin/x-www-browser (x-www-browser) を提供するために自動モードで /usr/bin/vivaldi-stable を使います
update-alternatives: /usr/bin/gnome-www-browser (gnome-www-browser) を提供するために自動モードで /usr/bin/vivaldi-stable を使います
update-alternatives: /usr/bin/vivaldi (vivaldi) を提供するために自動モードで /usr/bin/vivaldi-stable を使います
libc-bin (2.24-11+deb9u1) のトリガを処理しています ...
menu (2.1.47+b1) のトリガを処理しています ...
$ 

起動

インストール時点で、ランチャーに登録されていました。

f:id:okayu-moka:20170920155016p:plain
最初から登録済み。便利。