ベスパリブ

ベスパもってないです。バイク買いました。

Jupyter Notebookをフォルダ右クリックで開けるようにしてくれるstart_jupyter_cm

Jupyter Notebookを起動したあと毎回フォルダ移動するのが面倒くさい。なのでstart_jupyter_cm というリポジトリをインストールします。Windows と GNONE に対応(2019/08/23現在)されています。

github.com

インストール方法はリポジトリのREADMEを読めば書いてあるのですが、一応書くと、私の場合Windowsなので、Powershellまたはコマンドプロンプトを開いて、以下のコマンドを打ちます。

# pipでインストールする場合
$ pip install start_jupyter_cm

# condaでインストールする場合
$ conda install -c conda-forge start_jupyter_cm

# インストール後、下記コマンドを打つ
$ start_jupyter_cm

これで、フォルダを右クリックすると「Jupyter Notebook here」という項目が追加されるようになります。やったね。

アンインストール方法は、

pip uninstall start_jupyter_cm

です。

Windows環境にMySQLを入れたかったけど、ネットワークが頻繁に切れるからやめた話

Windows10 64bit 環境にMySQLを入れたい。

やり方がさっぱりだったので、ドットインストールに頼りました。

ドットインストールのMySQL入門

やればわかりますが、まずはローカル環境を構築してくださいと言われます。

ドットインストールのローカル環境の構築(Windows編)

WindowsVagrantVirtualBoxを使って仮想マシンを作って、そこにMySQLをインストールすればよさそうです(この時点でめんどくさくなり、ラズパイでいいじゃんと思ってしまった。まあいいや)。

Vagrantが立ち上がらないエラーは、BIOSでVirtualization Technology: Enabled にすると解消できました。詳しくは ドットインストールの補足情報を参照。もしくは仮想化支援機構(VT-x/AMD-V)を有効化できません Vagrant upでOS起動失敗したを参照。

と、色々やって仮想マシンの環境を構築しました。

すると、ネットワークが頻繁に繋がらなくなりました。

PCを再起動しても現象は治らず。仮想マシン構築してからなので、たぶん原因はVagrantVirtualBoxだと思います。

で、調べると次のような記事を見つけました。

VirtualBoxを入れてからローカルPCが頻繁にネットにつながらなくなる

こちらの方もVirtualBoxが原因っぽくて、VirtualBox類その他ツールのアンインストールや、LANドライバの更新をしたら治ったとのこと。

ということで、私も以下をしました。

これらをやると、無事ネットワークが安定しました。どれがクリティカルな原因だったかは不明ですが、個人的には「VirtualBox Host-Only Ethernet Adapter」「VirtualBox Host-Only Ethernet Adapter #2」のデバイスを無効にしたのが良かったのかなと思います。知らないですけど。

たぶん、VagrantVirtualBoxの設定をうまくこねこねすれば治ると思うのですが、ネットワークが頻繁に切断される状態で調べ物するのはめんどくさいし、そこまで時間をかけたくないのでやめました。

MySQLはラズパイに入れることにします。おわり。

大阪府立大学の「アカデミックライティング入門」がとても良かった

私は大学はとっくに卒業してるのですが、大阪府立大学が学生向けに出している「アカデミックライティング入門 レポートの書き方」というPDFを読みました。私は大阪府立大学とは全く関係のない人間ですが、大学1回生のころに読んでおいたほうがいいというか、私が学生時代に知りたかったことが端的に短くまとめられていた、とても良い文書でした。

読むきっかけになったのは、お盆に実家に帰ってて暇を持て余してツイッターをしてるときに気になるツイートを見つけたからです。

中高生さんはね、学生じゃなくてね、生徒なんですよ・・・。

へぇ、生徒と学生の違いってなんか決まりがあるのかな、と思い、ツイッターで検索をかけてたら、以下のツイートに出会いました。

アカデミックライティングができていない人は確かにいるのですが、それは日本人で日本語ネイティブでも日本語で論文が書けないのと同様で、まだその指導はやる意味を感じますが、英語の文法ばかりに添削を入れていると、これは自分の仕事ではないと思うのですよね。。。

学生時代は不真面目な学生でしたので、恥ずかしながらアカデミックライティングという言葉自体知りませんでした(レポートや論文は人が書いたのを参考し真似てそれっぽいフォーマットで書いてました)。

アカデミックライティングでググって、検索結果の一番上に出た当該PDFを読んでみました。そこには早速最初のツイートの答えが書いてありました。

小中高の児童・生徒は学習することを求められるが,大学の学生は学問することを要求されている。

なるほどなぁ。というわけで興味が惹かれ、全文を読みました。学生時代に知りたかったこと、疑問に思ってたこと、共感したことが書かれていましたので、いくつかかいつまんで引用して記録します。

課題を分析する

「4.1 課題を分析する」節で、私が学生時代に言われていた(あるいは漏れ聞いた)「研究では良い『問い』を設定すること」といったことがここには言葉が研究からレポートに代わって書いてありました。

具体的な例で説明しよう。「鳥類の呼吸について述べよ」というレポート課題では,「他の脊椎動物と比べた鳥類の呼吸の特徴は何か?」という「問い」を設定して,「肺以外に気嚢きのうを持ち高効率のガス交換をしている。」をとりあえずの「答え」とする。

例がわかりやすい。ここを読むとどうレポートを書いていけばよいかのイメージが湧きます。もうレポート書かないですけど。

パラグラフ・ライティングで書く

「4.4 パラグラフ・ライティングで書く」節で、パラグラフとトピック・センテンスについて書かれています。トピック・センテンスという言葉は初見でした。

いくつかの文の集まりを段落といい,いくつかの段落の集まりで文章が構成されること,そして段落の最初に一字分空けること(インデント=字下げ)は作文教育で教えられる。ところが段落が全体としてひとつの意味をもつ文の集まりであることを強く意識するようには教えられていないので,適当な長さになれば段落を区切る人も多い。アカデミック・ライティングでは「意味内容のまとまり=段落(パラグラフ)」という概念が重要で,以下の基本構造に注意して書く必要がある(このことをパラグラフ・ライティングとよんでいる)。

語句と表記の統一

「4.5.2 語句と表記の統一」節では、私が長年思っていたことが書かれていました。

よく似た語句を複数使う場合は,意味を区別して用いているのか,単に繰り返しを避けるために用語を変えているのか注意深く吟味する必要がある。文章の途中から別の語句を同じ意味に使ったり,逆に同じ語句を別の意味に用いてしまっていたりすることもあるので,長い文章の場合には特に注意すべきである。またひとつの文章の中で,ある語句の表記が複数混在している(「表記の揺れ・揺らぎ」とよばれる)場合もある。気になる語句がでてきた場合は,文章内にあるその語句を全て検索して,各々が使われている意味を確かめたり表記を統一したりすべきである。

学生時代、私の「同じ意味の言葉はできるだけ統一させるべき」という主張と、同期の「同じ言葉を繰り返すのを避けるために言葉を変えるべき」という主張でゆるーく割れたことがある(担当教員に聞けば済む話なのだが)。

私の主張は別に誰に教わったわけでもなかったので、今度からは「アカデミックライティング的にはそう」と言えますし、当該PDFを参考文献として差し出すようにしようと思いました。

句読点

「4.5.3 句読点 」節について。

日本語に句点「。」と読点「,」が使われ出したのは明治以降で,

へぇ~。

,横書きでは「、。」「,。」「,.」の3つの組み合わせ何れも使われているのが現状である。混在させなければどの組み合わせでもよいとされているが,特にアルファベットや数字が頻繁に現れる理系の横書きの文章では「,。」をお薦めする。

私がB4の時、「論文とかは『,.』で書いてあることが多いけど、自分が書く時もそうしたほうがいいのだろうか」と思い、当時の指導教員に質問したことがあります。そのときの回答は「組み合わせがあっていれば何でもいいよ」でした。

読点「,」の必要性を示すためにこんな例がよく挙げられる。

①警官が自転車に乗って逃げる泥棒を追いかける。

②警官が,自転車に乗って逃げる泥棒を追いかける。

③警官が自転車に乗って,逃げる泥棒を追いかける。

意味がふた通りにとれる①が良くないのはもちろんで,②と③のどちらかが良い。だがアカデミック・ライティングでは「,」を含む②と③もあまり好ましくなく,次の④と⑤のどちらかが良い文といえる。

④自転車に乗って逃げる泥棒を警官が追いかける。

⑤自転車に乗った警官が逃げる泥棒を追いかける。

これはなるほどと思いました。普段文章を書くときは②と③のように書くことを意識していましたが、「句読点がなくても意味が一意に伝わる書き方をする」というのは思いもしませんでした。

おわりに(感想)

印象に残ったところをチェリーピックして引用しましたが、そのほかにも重要で基本的なことが書かれていましたので、学業にやる気のある大学一年生はまず最初に目を通したほうが良いなぁと思いました。

こういうPDF文書、私が学生の頃はもらえなかったなと思いましたが、この記事を書いてる途中で「いや入学と同時にもらった気がする」「むしろもらってはずがない」と思い始めました。もはや学生時代の記憶は失われていますし、私はまじめな学生ではなかったのでまあそういうことなのでしょう。

それにしても、大学を卒業してからこのPDFに興味を惹かれ読むことになるとは、やる気と興味と知りたかった情報はタイミングよく来ないもんだなぁと感じました。若いころに勉強をしておけばよかったと言う気はないですが、その気に反してこの記事の文章のいたるところにそういうメンタリティを反映されてる気がするので、寒々しい気がします。まぁタイミングは合わない人生です。語句と表記の統一のソースを見つけれたことは長年の疑問は晴れた感じがしてよかったです。

GitHubはリポジトリのコードをスキャンしてセキュリティの脆弱性を指摘してくれるらしい

公開しているGitHubリポジトリに、ある日突然アラートが表示されました。

f:id:takeg:20190717105830p:plain
アラート

We found a potential security vulnerability in one of your dependencies.

(訳)依存関係のひとつに、セキュリティ脆弱性の可能性があるものを見つけました。

「See security alert」をクリック。

f:id:takeg:20190717110006p:plain

GitHub tracks known security vulnerabilities in some dependency manifest files. Learn more about security alerts.

(訳)GitHubは、依存関係マニフェストファイルの既知のセキュリティ脆弱性を追跡します。詳しくはセキュリティアラートについての記事を読んでね。

(2019/07/17現在)Beta版の機能かな?リンクを飛ぶとパッケージファイルのlodashのバージョンを上げるように書かれていたので、言われるがままにそうしました。私はわかっていないので(一応詳細issue読んだあとの感想)。だから信じるよギットハブのコト。もし間違ってても個人開発だし俺が困るだけでしょ。

f:id:takeg:20190717110219p:plain

「Create automated security fix」ボタンをクリックしても特に何も起きませんでしたが、トイレ行って戻ってくるとプルリクエストが作られていました。

f:id:takeg:20190717110512p:plain

プルリクをマージしました。

webpackメモ

参考

インストール

npm install -D webpack
npm install -D webpack-cli
  • バージョン指定
npm install -D webpack@4.35.0
  • package.jsonの内容でインストール

カレントディレクトリにpackage.jsonがある状態で、

npm install

ビルド

$ ./node_modules/webpack-cli/bin/cli.js --mode=development
$ ./node_modules/webpack-cli/bin/cli.js --mode=production
# productionは、出力ファイルをminifyもしてくれる(webpack.config.jsでminifyをfalseにしているとそちらが優先される)
$ ./node_modules/webpack-cli/bin/cli.js --mode=development -w

`Unhandled rejection Error: original.line and original.column are not numbers` エラーの解消

--mode=developではエラーは発生せず、--mode=productionで以下のコマンドを打つとエラーが発生した。

$ ./node_modules/webpack-cli/bin/cli.js --mode=production
Unhandled rejection Error: original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.
    at SourceMapGenerator_validateMapping [as _validateMapping] (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\node_modules\source-map\lib\source-map-generator.js:276:15)
    at SourceMapGenerator_addMapping [as addMapping] (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\node_modules\source-map\lib\source-map-generator.js:110:12)
    at C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\node_modules\source-map\lib\source-map-generator.js:72:17
    at Array.forEach (<anonymous>)
    at BasicSourceMapConsumer.SourceMapConsumer_eachMapping [as eachMapping] (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\node_modules\source-map\lib\source-map-consumer.js:157:14)
    at Function.SourceMapGenerator_fromSourceMap [as fromSourceMap] (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\node_modules\source-map\lib\source-map-generator.js:48:24)
    at SourceMapSource.node (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\lib\SourceMapSource.js:32:35)
    at SourceMapSource.proto.sourceAndMap (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack-sources\lib\SourceAndMapMixin.js:30:18)
    at getTaskForFile (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack\lib\SourceMapDevToolPlugin.js:37:30)
    at files.forEach (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack\lib\SourceMapDevToolPlugin.js:136:20)
    at Array.forEach (<anonymous>)
    at compilation.hooks.afterOptimizeChunkAssets.tap (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack\lib\SourceMapDevToolPlugin.js:130:12)
    at SyncHook.eval [as call] (eval at create (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\tapable\lib\HookCodeFactory.js:19:10), <anonymous>:7:1)
    at SyncHook.lazyCompileHook (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\tapable\lib\Hook.js:154:20)
    at hooks.optimizeChunkAssets.callAsync.err (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\webpack\lib\Compilation.js:1315:42)
    at _err0 (eval at create (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:11:1)
    at taskRunner.run (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\terser-webpack-plugin\dist\index.js:319:9)
    at step (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\terser-webpack-plugin\dist\TaskRunner.js:87:9)
    at _cacache.default.get.then (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\terser-webpack-plugin\dist\TaskRunner.js:111:15)
    at tryCatcher (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:517:31)
    at Promise._settlePromise (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:574:18)
    at Promise._settlePromise0 (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:619:10)
    at Promise._settlePromises (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:699:18)
    at Promise._fulfill (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:643:18)
    at Promise._resolveCallback (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:437:57)
    at Promise._settlePromiseFromHandler (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:529:17)
    at Promise._settlePromise (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:574:18)
    at Promise._settlePromise0 (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:619:10)
    at Promise._settlePromises (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:699:18)
    at Promise._fulfill (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:643:18)
    at Promise._resolveCallback (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:437:57)
    at Promise._settlePromiseFromHandler (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:529:17)
    at Promise._settlePromise (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:574:18)
    at Promise._settlePromise0 (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:619:10)
    at Promise._settlePromises (C:\Users\XXXX\workspace\MyProject\MyProject\node_modules\bluebird\js\release\promise.js:699:18)

とりあえずエラー内容でググると、似たような現象の記事を見つけられる。

ざっと見るとsource mapのエラーかな?というのが当たりがつくので、webpack.config.js 内のdevtool: "source-map",を試しにコメントアウト

module.exports = {
    mode: 'development',
    entry: './src/content.js',
    output: {
        path: __dirname + "/dst",
        filename: 'content.js',
    },
    optimization: {
        minimize: true,
    },
    //devtool: "source-map",
    module: {
        rules: [
            {
                test: /\.js$/, // .jsファイルを処理対象として指定
                exclude: /node_modules/,
                use: {  // test プロパティにマッチしたファイルに対する処理を指定
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            }
        ]
    }
};

するとエラーが消え無事ビルドできました。ちなみによくわかっていません。