Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

VimConf2018 へ行ってきました

$
0
0

VimConf2018 へ行ってきました

今年も、vimconf へ行ってきたので、そのレポートを書きました。
今年は、Bram(当然ですが Vim の Author) さんも来られていて、特別な開催だったと思います。
今年も、印象に残るトピックがあったので、後の章に書いています。 ご査収下さい。

私個人ですが、この VimConf が終わって、昨年同様一念発起をするのですが、気持ち的には今年が終わった気持ちです。
聞いてるだけだけど、燃え尽きた。

May the Vim with you.
Vim よ、 TextEdit よ永遠なれ。

date : 2018/11/24 9:30 - 19:30
place : akiba hall (fuji soft)

この記事の目的

vimconf の熱量を冷めぬ内に(まあ冷めないのですが)参加した方、来れなかった方にお届けするのが目的です。
今年は、後日、Keynote などは動画として youtube にアップロードされるそうなので、
興味のある方はそちらをご覧いただくのがよいと思います。

time table

以下が、本日のタイムテーブルとなります。
こちらの情報は VimConf オフィシャルのままで、
実際の開催においてもこのタイムテーブルからの変更はありませんでした。
(とてもクリーンなタイムマネジメントでした)

Content Speaker Language
09:30 - 10:00 Reception
10:00 - 10:10 Opening mopp English
10:10 - 11:00 Keynote - What is the next feature? Yasuhiro Matsumoto Japanese
11:00 - 11:10 Short break
11:10 - 12:10 Keynote - Vim: From hjkl to a platform for plugins Bram Moolenaar English
12:10 - 13:10 Lunch break
13:10 - 13:40 Migrating plugins to standard features daisuzu Japanese
13:40 - 14:10 Modes Tatsuhiro Ujihisa English
14:10 - 14:20 Short break
14:20 - 14:40 A day in the life of (ordinary) Vimmer OKURA Masafumi English
14:40 - 15:00 Modern editor-independent development environment for PHP USAMI Kenta Japanese
15:00 - 15:30 Effective Modern Vim scripting Alisue English
15:30 - 15:40 Short break
15:40 - 16:10 Oni - The GUI-fication of Neovim Akin English
16:10 - 16:40 Vim ported to WebAssembly rhysd Japanese
16:40 - 17:15 Lightning Talks (5 Speakers) Mixed
17:15 - 17:25 Closing mopp English
17:30 - 19:30 After party

Contents

以下が、本編の内容となります。
筆者のメモがベースのため、実際のの内容と乖離がある場合がございます。
ご了承ください。

Reception

  • ノベルティが配布された
    • Tシャツ
    • パンフレット
    • スポンサー様のクリアファイル、ステッカーなど
    • Vim x Emacs の缶バッチ(by Mercari)も

Opening mopp English

  • 一般社団法人 VimConf 準備会が運営
  • スポンサーが豪華
    • Google
    • Mercari
    • cookpad
    • IIJ
  • 例年通り、JP <-> EN 同時通訳あり
  • コーヒー飲み放題

Keynote - What is the next feature? Yasuhiro Matsumoto Japanese

  • 言わずと知れた mattn さん
  • Twitter では 服をきていない人
  • Vim-jp の発起人
  • Vim に凄まじい数の patch を送っている人
  • Bram を前に緊張されているそう
  • Go 界隈でもいろんな Package をリリースしている

  • 今日はエモい話

  • 今日の話

    • なぜ vim-jp をはじめたか
    • vim-jp とは
    • 次の機能は誰が知っているのか
  • なぜ vim-jp をはじめたか

    • 大学から vi を触ってきた
    • Linux, BSD などでも
    • first patch は Windows IME に関する patch
    • なぜ、みんな fork したままほっとくのか
      • コントリビュートするのが当然だよね、と Kaoriya さんと話をしていた
      • もったいない
    • 2011 年に vim-jp を Kaoriya さんと立ち上げた
    • vim-jp の主な目的は知識の共有
    • 他の OSS コミュニティからも「良い活動ができている」と評価されている
      • うまくいく定番の考えを元にしているからと自己評価している
  • vim-jp とは

    • バグレポートを集める
      • 日本人は英語のレポートが苦手
      • 「いつか誰かが」となってしまう
      • コードレビュー
        • 議論も code review もないことが問題ないので
      • patch を書けば vim-jp が review をしてくれる
      • Vim は Github の PR の仕組みではない
      • patch に自分の名前が載るのは嬉しい
    • Help
      • ヘルプファイルを翻訳して配布している
      • Vim に貢献したいなら、翻訳も手伝って
    • 機能追加
      • 日本語に特化した機能
      • Lambda
        • 使ってる??
      • job と channel の改良
        • プロセスを逐次起動して CLI へアクセスすることができるようになった
        • back ground job が扱えるようになった
        • color emoji をリリース
        • incsearch
          • 元々 plugin だったものを本体に取り込んだ
        • :terminal
          • Vim が IDE になったなあ、という気持ち
  • 次の機能は誰がしっているのか

    • vim-jp は Vim の開発者グループ
    • しかし vim の次の機能を教えてと言われてもわからない
    • 今回は提案を持ってきた
      • :terminal の中で DRCS Sixel を動かそう
        • graphic を terminal で表示する
        • patch を書いてみた(まだちゃんと動いていない GUI をサポートしてない...etc)
        • これができれば、グラフィカルなアイコンを扱えるようになる
      • Add ch_listen()
        • listen socket を実現する
        • アドレスと、コールバックを渡す API を作った (ch_listen())
        • サーバーが作れる
        • Vim のクラスタが作れる??
        • Vim Script は NUL byte が使えないのが問題
          • 画像ファイルが serve できない
          • BLOB(Binary Large Object) 型を足して work around とした
          • 新しいリテラル ("0zXXXX") を追加した
        • Web server のデモ
          • ブラウザに "Hello VimConf2018!!" と表示された!!(しゅごい)
    • 入らないと思っていた機能が入ってくるので、何が入るのかわからない
  • まとめ

    • コードがかけるなら vim dev へ patch を送って下さい
    • コードのレビューと、 patch の introduction をやります
  • May the Vim be with you

  • QA

    • q : 苦労した patch は??
      • a : シンタックスが真っ白になるバグ
      • a : terminal
    • q : vim のデバッグ方法は
      • a : vim をデバッグビルドして、vim-debugger で動かす
      • a : or gdb や vs などでデバッグする

Short break

  • スポンサーの atWare さんのスポンサー紹介
    • Vim エピソードにあふれる会社
    • 昨年からスポンサーに(今年はなんとプラチナスポンサー)
    • Google で "アットウェア vim" がでるようになった ### Keynote - Vim: From hjkl to a platform for plugins Bram Moolenaar English
  • 今は Google で働いている
  • ウガンダの支援を行っている

  • なにを話そうかな、と考えていた

  • 今回は誰も話せないことを話して欲しいと言われた

  • Vim は本がたくさんあるが...

  • 最近は plugin をインストールして使うか、が増えてきた

  • 全ては vi からはじまった

    • 小さなソフトだった
    • 当時はそれでもリッチだった
    • undo は 2回だけ
    • mapping は当時からあった
      • recurse できたから迷路を解決することができた(state machine として扱えるので)
    • jump、 mark も最初からあった
    • 補完やマルチタブ、ウィンドウもできなかった
    • リソースが少なかったので
  • Vim

    • もっといいものをつくるぞ、と思って Vim(Vi improved)と名付けた
    • Autocommands を ver 4.0 で追加された
      • フックを定義してコマンドを実行する
      • 非常にパワフルな機能
      • いろいろなものがこれでつくられているので、バグもある
    • Vim script の始まり
      • 最初はごく小さな実装だった
      • 最初から gabage collection がつかわれていた
      • 最初、syntax highlight でつかわれていた
      • 協力な機能を使うには、正しい vimrc を使う必要があった
      • それがプラグインを作るきっかけになった
      • 長年をかけて、様々な機能がサポートされるようになった
        • 浮動小数点なんかいらないと思っていたので、
      • 基本的には新たな機能は入れない、という方針でやっているが、必要という人が居ればいれる
      • 組み込み機能は、Vim5.0 から今へ書けて 10倍以上になった
      • プラグインの速度を落としたくない
        • profile 機能で調べるのが便利
        • vim --startuptime {fname} も起動が遅いときの調べ物に便利
        • 高速化するには??
        • load time or Execution time の削減
        • -> 高性能マシンを買うのが一番 (lol)
        • でも、今時はそうも行ってられない
        • if has('win32') みたいなものも活用するとよし
        • hot spot を見つけるのは難しい
        • profile をつけてそれを見つける方法もある
        • plugin を別々の thread でやる
          • ただ、これは実装が難しい
          • plugin を別々の namespace でやる
        • プラグインの速度落としたくない(plan B)
        • Python Perl Ruby Tck Scheme Lua をサポートしている
        • Python が popular
        • 依存関係があるのがややこしくはある
        • よって、全てのプラグインで使われるわけではない
      • -> Vim の中の人的には Vim script を早くする側で考えたい
        • intermediate form へ変換するような案がある(WIP)
          • 要ははコンパイルするということ
        • ただ、作業が大変だし、実装が大変
      • plugin management
        • 既存の plugin インストールでは、いろいろ問題がある
        • packadd という機能を Vim8.0 で追加した
        • plugin manager plugin もある
      • plugin dependencies
        • version 管理は問題となる
        • まだまだ plugin management は考えていく必要がある
      • builtin plugin management
        • みんなが使いたいのはどういうもの??
        • implementation が大変なのはやだよね
        • plugin 作者はいろんな要求をもっている(非同期実行など...etc)
        • plugin 作者はどうやってテストしてる??
        • いろいろ聞いてみた
          • ポップアップウィンドウが欲しい、という意見が多かった
          • プロパティをどこかにアウトプットしたい(シンタックスハイライトなど)
          • LSP のサポート
        • テキストプロパティによって、ポップアップウィンドウの実装に繋げられる
  • QA

    • Q : 一番好きな新機能は??
    • A : Text propertie は重要と考えている サイドの parse は必要なくなる場面がある だからこれを推す
    • Q : LSP についてどう思う??
    • A : 実際のところ聞いたことなかった まだ理解度が低いので Native Support が必要なのか判断できない 教えて欲しい
    • Q : Vim と NeoVim はどうなると思う??
    • A : Newoim はいろいろ開発している 誰かが NeoVim にいい機能があれば入れたいが Vim にいれるには誰かがやってくれなければいけない
    • Q : これから将来別のコントリビュターが出てきたら??
    • A : いろいろと考えてみたいとは考えている
    • Q : 今日観客になにを求める??
    • A : 楽しんで下さい みんな使ってくれてありがとうと思っている 多くの人が集まって嬉しい

Lunch break

  • 去年に引き続き「今半(IMAHAN)」のすき焼き弁当
  • おいしい(関西人でもなじみのある味でした)
  • ベジタリアン用のお弁当もあって国際意識が高くて素晴らしい

Migrating plugins to standard features daisuzu Japanese

  • 発表する人

    • Vim 暦 10年
    • Test engineer to Server side engineer
  • 英題どおり「プラグインを標準機能で置き換えよう」がテーマ

  • 原理主義者というわけではなく、標準機能を理解しよう、という想い

  • プラグイン作りのきっかけになれば、という想いもある

  • Shougo さんの plugin ばっかり使っていた

  • Test Engineer をやっていた

    • 組み込み機器を動作した時のログを触っていた
    • 秀丸、サクラも候補にあった
    • 巨大なファイルを扱える、なども Vim を選んだ理由
    • ログの確認を効率化するために色々な plugin を入れていた
    • plugin の補完でコードがかきやすくなった
    • 採取的に 108?? の plugin を使っていた
    • プログラムを書きたいので、プログラマへ
  • プログラマ

    • 周囲に Vim を布教していた
    • プラグインから脱却しよう、という気持ちになった
    • Kaoriya さんの「スパルタン Vim」を読んで plugin なしでなんとかしようということにした
  • 脱 plugin

    • 脱 neocomplete
      • complete opt などをモディファイした
      • complete command はたくさんある
      • オムニ補完
        • plugin ではよくある
      • キーワード補完
        • 他のファイルからの補完
        • 辞書補完
      • ファイル名補完
        • ctrl-x, ctrl-f
      • 行補完
        • ctrl-x, ctrl-l
    • 脱 neobundle
      • パッケージマネジメント
      • system(), job, timer で置き換えていった
      • packpath へ git clone すると、プラグインが使えるようにする
      • git clone XXXXも system() で実行する
      • update plugins も git pullと system() で実行する
      • Lazy loading(遅延読み込み) も autocmd で実現できる
        • background loading でやる
    • 脱 unite (file finder として)
      • ファイルのリストとその読み込みの機能を標準機能でなんとかしたい
      • shell command lsdirなどを使う
      • 簡易的なもので Unite をファイラのように使ったものが実現できる
    • tree.vim
      • gf でできる
  • まとめ

    • より安定して Vim をつかうことができるようになった
    • plugin で動かない、とかがなくなった

Modes Tatsuhiro Ujihisa English

  • VimConf スタッフの人
  • Ruby Scala とかのプログラマ
  • Vim 暦20年
  • quipper という会社の人
  • 自己紹介

    • 115 plugin を使っている
  • キーボードをみてください

    • "i" キーは、モードによって変わります
    • よって、 Vim の Mode について話す
  • Vim Mode が発表のテーマ

    • GDB termdebug.vim を使ってみていく
    • 初級、中級者用の内容
  • vimtutor

    • みんなやってるよね
    • 25-30 分でできる
  • help

    • mode switching についても詳しく書かれている
  • Modes

    • Normal Visual Select Insert Replace... とてもたくさんある
  • 振る舞いと実装を図にしたもの(スライド)

    • 今日発表するのは、モードとその実装について
  • src (understanding implementation)

    • vim/vim/src にソースコードがある
    • どのように Cコードを読むか
      • 上から下へ読む
      • 関数を探してじっくり読む
      • GDB
        • 特別な flag で build する必要がある
        • Makefile を変更する (add -ggdb3)
          • Mac OS だと大変
      • Termdebug
        • GDB の wrapper
        • vim の中で :terminal して Termdebug を使う
          • term にデバッグ中の vim が見える
          • gdb をそこで使う
      • main
        • vimmain -> vimmain2 -> mainloop function とつづく
        • mainloop は while loop
        • safe_vgetc() で user input を受けっとている
          • p/c var で gdb で見れる
        • nv_cmds[] にユーザ入力の情報が入っている
  • まとめ

    • GDB, termdebug で、Vim のソースがどんどん読んでいける
  • 最近 Contribution したこと

    • f_mode()の改善
      • プラグインが使いやすくなるだろう

Short break

  • 特になし(綺麗なビルだなあ)

A day in the life of (ordinary) Vimmer OKURA Masafumi English

  • 普通の Vim ユーザの1日がテーマ
  • Bram と一緒に参加できて嬉しい
  • みんなのVim or NeoVim を使っているだろう
  • Vim 暦 5年

  • 普通の Vimmer の1日とは??

    • 3 つのケースでどう使っているか紹介する
      • 日々の開発(Rails)
      • コードを読む
      • リモートサーバのファイルを編集する(Docker Container など)
  • なぜ近代的なエディタを使わないのか

    • Atom も素晴らしいが、 Vim になれてしまっている
    • VsCode も素晴らしいが、デフォルト機能が too much である
    • IDE ??
      • RubyMine というのがあるが、Vim でできてしまっている
    • 日々のスタートアップ
      • Vim/NeoVim の upgrade
      • plugin の update
    • 日々使う plugin
      • vim-rails, deoplete/UltiSnips, ale(on the fly lint)
      • vim-test fugitive gitgutter
      • fzf(fuzzy search)
    • コードリーダーとしての Vim
    • Vim ファイル間移動するのに適したエディタ
    • fzf.vim は :Tag :Ag という便利な機能を提供している
    • vimgrep は使いやすいが、スコープが大きいと時間がかかりすぎる
    • fzf でタグジャンプができる
    • リモートサーバでやらないといけないことは多々ある
    • vim のマクロは強力
    • 場合によっては、plugin なしで高速に起動させたりもする
    • デモでは、マクロで、1行を綺麗にインデントするものをしたかった
  • Recap

    • Vim はユビキタスだ
    • Vim のみが(他のエディタと比較して)こういったものを提供しています

Modern editor-independent development environment for PHP USAMI Kenta Japanese

  • pixiv の人
  • 色々エディタは使った
  • 普段は emacs を使っている
  • 以前は vim を使っていた
  • Vimconf では宗教戦争には触れられない

  • PHP 開発環境の現在を伝える

  • PHP は web plattform

  • いろいろなサービスで使われている

  • 弱い性的型付け

    • でも、静的解析には適している言語
  • 昔に Perl でかかれていたものを PHP で置き換えていたりする

  • PHP に IDE は必要??

    • 誰も使っていなかったけど、色々なサポートツールが必要
  • PHP に静的解析が重要

  • PhpStrom すごい

    • ただし、プロプライエタリなソフト
  • Phan

    • 静的解析ツール
  • LSP にも対応している

  • Vim だと

    • ALE をつかっている
    • Veonim
      • neovim を使った IDE

Effective Modern Vim scripting Alisue English

  • 去年も出てた人
  • フロントエンジニア
  • 研究寄りから出てきたひと
  • Dark Vimmer

    • deo..dei..de.. な人
  • vimawesome にたくさんプラグインが紹介されている

  • モダンな vim plugin の作り方を紹介する

  • 自分自身の plugin を作ろう

    • *.vimを作るだけ
    • /autoload /plugin
  • Hello, Worlid

    • どのように vim script を作るかの基本を説明
    • abort を覚えるのは重要
  • 同期的に実行する

    • 外部プログラムを実行して新しいバッファへ出力する
    • ランナーを作る
    • 関数でバッファを開ける
  • 非同期的に実行する

    • バックグラウンドで実行する
    • Vital.vim を利用する
      • Vital.vim は新しいモジュールシステムを Vim に提供する
      • 様々な機能が提供される
        • vim.Buffer
    • job という機能を使う
      • Vim と neovim で実装が異なる
  • Vim-awake を使って、非同期な plugin を作ろう

  • fix point 社ではすごい Vimmer 募集中

    • プログラマの 45% が Vimmer

Short break

  • メモを書き続けているとここら辺から正念場になってきます
  • 毎日同じくらい Vim を触っているとはいえ、メモをぶっ通しはなかなかにきつい

Oni - The GUI-fication of Neovim Akin English

  • London の engineer

  • Oni について話す

  • Oni??

    • GUI
      • neovim 用の GUI
      • neovim の機能性を GUI の中にレンダリングすることが目的
    • neovim でできなかったことをやりたい
      • syntax higilight とか
      • language server 機能
  • Oni のアーキテクチャ

    • electron を利用したソフトウェアとなっている
    • File Explore のコンポーネント
    • Git Integration などもコンポーネントされている
  • Demo

    • landing page
    • とてもグラフィカルな UI
    • モダン UI やなあ...すごい
    • なんかブラウザも開くぞ...
  • plugin

    • Oni 自体を plugin で拡張する
    • Git Blame をする plugin もある
    • csv を綺麗にレンダリングしたりできる
    • JS / TS で plugin が書ける
  • よく出る問題

    • パフォーマンスが問題になりやすい
    • electron は充分早いが、もっと改善したいと考えている
  • link

    • Oni の HP もある
  • QA

    • Q : MS がパフォーマンスをあげているが、そのあたりは知ってる??
    • A : VS code の code を読んでいるが 余裕があるところから早くする実験をしている
    • Q : newovim にどんな機能が欲しい??
    • A : BLOB もほしいけど.. 機能の外部化をしたい

Vim ported to WebAssembly rhysd Japanese

  • dog な(twitterr のアイコン)人(linda_pp)
  • plugin 70 個くらい作ってる
  • エディタのフロントエンド

  • vim のソースコードを web assembly へ変換して動かす

  • Web Assembly ??

    • JS みんなつかってるよね
    • WebAssebmbly(Wasm)
  • C コードを WASM にコンパイルする Toolchain がある

    • emscripten というものがある
    • hello.c -> hello.html, hello.js, hello.wasmができる
  • WASM の制約

    • 直接 DOM を触れない
  • どうやる

    • JS に runtime を作って頑張る
    • C のコードにプリプロを切って WASM 用の分岐を用意する
    • 実際に GUI のバリエーションを増やす
    • Vim は terminal lib は必須
      • それはブラウザにはないので、disable している
    • C -> LLVM bitcode -> Javascript を 合体 -> executable へ
  • コンポーネント間のデータフロー

    • key input は JS でもらってきて、vim へ追加したレイヤで vim へ渡せる形へ変更する
      • もらってきた情報が add_input_buf()?? へ渡る
    • output はその逆
      • 追加した wasm.c へレンダリング用の関数を実装している -> 中から JS へ情報を渡す I/F を呼ぶ
  • JS Runtime

    • ファイルシステムを動的に作成する
      • Vim からは普通のファイルシステムに見える
  • なにが難しかったか

    • デバッグが難しかった
    • Wasm が Sleep() できない
      • ブロッキングができない
      • input_polling がブロッキングなので、ブロッキングしないといけない
      • -> emscripten_sleep() というものが提供されているのでなんとかなった
        • 実はブロッキングしていない -> 一度殺して復活されるようにしている(インタプリタを介しているので実現できる)
  • インプレッション

    • tiny 機能が役にたった
    • 作業量は8日分くらいで動いた
    • ポーティングを emscript がやってくれているので楽になった
  • 今後

    • 無理やり実行しているブロッキングをなんとかしてみたい
    • IME 対応したい
  • QA

    • Q : WASM 上で plugin 使いたい
    • A : できると思う

Lightning Talks (5 Speakers) Mixed

  • 5speakers

  • Takahasi ISHIKAWA - vim orgmode

    • vim-ordmode のプラグインの紹介
    • テキストアウトラインをどないかする plugin
    • タスクマネジメント
    • 議事録をとる
    • 第二の脳
    • WORD でレポート書いて、と言われたら、Export だけしたい
    • いろんなことができる
    • 開発者が少ないので、参加してください
  • notomo -Neovim as a web browser controller

    • neovim から browser を操作する
    • terminal に引きこもって作業したくない??
    • web browser いるよね
    • web browser へ移動するの、めんどくさいよね
    • RPC っぽくブラウザを動かせる
    • Vim っぽく操作ができる
    • 間に web socket server をかませている
    • fizzbuzz を web browser でやる
  • rattcu VimPhone 2018

    • Vim から 電話をかける = Vim スマホを作る
    • いろんな人から翔さんされた
    • Vim app が 2012 くらいから出現
    • Google ストアである
    • Termux
    • どうやる??
    • Coogle COntacts API を使う
    • それを Vim Script から叩く??
    • Vim が Home になった
    • まだ開発中
  • Shougo - Difference of Vim8 and NeoVim

    • 紹介は必要??
    • 2017年 30%~40% が NeoVim ユーザだった
    • NeoVim は API ガちガウ??
    • Nvim is no BDLF project
    • NeoVim は funding している常に開発するために
    • NeoVim はいくつかの機能を削除した
      • crypto など
    • NeoVim はいくつかの新しい機能を実装した
      • LSP
    • GUI を際実装している(Oni とか)
    • Nvim include Lua
    • Nvim の job と terminal 機能は??
  • k_takata - The vim-history repository

    • vim history repository を作った話
    • github 以前の src を追いかける
    • git replace を使った
    • Vim の patch 数は Bram takata mattn の順

Closing mopp English

  • スピーカーに拍手
  • 去年は45件 blog 上がってたよ
  • after party ではスピーカーに話しかけれるチャンスだよ

After party

  • Bram さんは瓶ビールラッパ飲みをこよなく愛していました
  • twitter で知らぬ間にフォローされてていたかたともお話できたり
  • とても若いアカデミックな学生の方と話せたり
  • staff, speaker の方と話せたり
  • 美味しいお酒りんごのウィスキーや、大吟醸で生の日本酒などもあって
  • 料理も美味しいし
  • 自分の英語力(speaking)のなさにがっかりもしましたが
  • とても楽しかったです

個人的に印象に残ったこと

  • text propertie -> これがあれば、不要な parse を繰り返さなくてよいので、とてもよい改善に思えた
  • termdebug -> これでサクサクデバッグできれば、設計ができるエンジニアなら vim に commit できるとおもった(超快適)
  • Onivim などのグラフィカルな UI -> Vim の新しい形なんだなあとおもった
  • Vim 自体が環境に近づいてるな...ブラウザがみれたり -> これには限度はあるとおもいつつ、それだけ I/F が柔軟になっているという感動
  • WASM でブラウザで Vim が動いていた -> すごすぎてわけがわからない
  • Vim の主要なコントリビュータみんな英語が流暢ですごいなあ -> みなさん発音も綺麗

Reference


Viewing all articles
Browse latest Browse all 5608

Trending Articles