かんちゃんの備忘録

プログラミングや言語処理、ガジェットなど個人の備忘録です。(メモ書き+α)

1年ぶりのXonsh

本記事は Xonsh Advent Calendar 2018の16日目の記事です。

昨年の Advent Calendar 以降使っていなかった Xonsh について約1年ぶりに触ります。

ほんと少しでも書いてくれるだけでハッピー。

ということで、よりハッピーになっていただきたいのでほんの少し書きました。

Pythonのモジュールが提供する機能をパイプラインに組み込めれば便利そうだったので、コマンドを作ってみました。

導入

インストール

$ pip install xonsh

起動

$ xonsh

コマンドを作る

~/.xonshrc に関数とそのエイリアスを定義することで、 xonsh が認識します。

def _hoge():
    print("fuga")


aliases["hoge"] = _hoge

aliases が対話型シェル環境からコマンドとして利用できるコマンド群のエイリアスとなります。

関数の引数には、 argsstdin といったコマンドに対する引数や標準入出力などを定義できるようです。

こんなコマンドだと便利?

中央値や最頻値をさくっと出せると便利かもしれないと思い、コマンドを定義してみました。

# ~/.xonshrc
import statistics


def _mean(args, stdin=None, stdout=None):
    print(
        statistics.mean((float(line.strip()) for line in stdin)),
        file=stdout
    )

def _mode(args, stdin=None, stdout=None):
    print(
        statistics.mode((line.strip() for line in stdin)),
        file=stdout
    )


aliases["mean"] = _mean
aliases["mode"] = _mode

上記の関数を試してみます。

$ source ~/.xonshrc
$ seq 10 | sort -r | mean
5.5
$ echo "1\n2\n3\n2" | sort -r | mode
2
$ echo "ほげ\nふが\nほげ" | sort -r | mode
ほげ

複数列に拡張していくのは、引数の管理が大変そうです。 エラー処理も割と大変そうなので、デコレータ作るとボイラープレート減らせるのかな?と思いました。

シンプルに cut コマンドと組み合わせることで、わざわざファイルを確認するためにコードを書かなくても済みそうです。

MeCabの使い方の備忘録

Sansan Advent Calendar 2018 の1日目の記事です。

いつもお世話になっているMeCabについての備忘録です。

インストール、辞書、辞書整備、Pythonやシェルでの取り扱いまで、使い方をまとめます。 マニュアル読めば分かるよ!というかたは公式マニュアルが充実しているのでそちらを読むのがいいかと思います。

続きを読む

固定回線(IPoE方式のv6アルファ)を引いた

上京してから1年半ほどWiMAXを利用していたのですが、いろいろと限界を感じたため固定回線を引きました。

高速と言われているIPoE方式にしたのでそのまとめです。

結論としては、快適な回線を得ることができました。

  • 固定回線を引くことにしたきっかけ
  • OCN 光 v6アルファ パッケージにした
  • 開通まで1週間半
  • WiMAXとv6アルファの速度比較
  • 開通して困ったことと対策
  • まとめ

固定回線を引くことにしたきっかけ

箇条書きで挙げてみます。

  • Google DriveDropboxなどストレージへのアップロードが非常に遅い
  • 帯域が細いのか複数台での利用が厳しい(PS4で何かしら更新しているときは別の機器からは利用がほぼできない)
  • 速度やPINGが安定せずゲームが厳しい(スプラトゥーン2にハマったので安定した回線がほしかった)
  • 3日で10GB制限&シークタイム削減のために動画は480pで閲覧していた
続きを読む

サポーターズ勉強会でPythonでのスクレイピングについて登壇しました

10月10日に「Pythonで始めるスクレイピング」というタイトルでサポーターズColabで登壇しました。

発表内容の概要と振り返りを書こうと思います。

発表内容

初心者を対象に、Python言語によるWebクローリングとスクレイピングについて説明とハンズオンを行いました。

前半はスライドを用いた説明です。

導入は、そもそものクローリングとスクレイピングの概念について混同しがちな部分であるため、図を用いて整理しています。 実際にPythonライブラリを用いてページのフェッチとスクレイピングを行う方法として、requestsモジュールやBeautifulsoupなどメジャーなライブラリを紹介しました。

中盤は、Scrapyの概要やヘッドレスブラウザでの描画について述べました。 また、実際にクロールする際のマナーについてもアクセス数や頻度に注意することや、連絡先を明記することなど気をつけることがたくさんあります。

後半はGoogle Colabratoryを使ったハンズオンです。

前半のスライドの内容を実際に動作させることができます。

振り返り

良かった点は、「こんな方にオススメ」という人にしっかり伝わる資料ができたことだと思います。 スクレイピングを始めたいけど一歩目が難しい人の後押しにしっかりなったかと思います。

いまいちだった点は、時間配分です。 後半のハンズオンが非常に駆け足になってしまいました。 スマホで時間を確認すればよかったのですが、PCはスライドショーモードにはなっておらず時計が見えませんでした。 また、会場の時計も見つけることができず時間配分が感覚になってしまいました。 よほど練習した資料であれば何となくでも時間はわかるものですが、今回はそこまで詰め切れていませんでした。

ただ、コメントをかなり丁寧に書いたつもりですので、持ち帰ってじっくり見ていただけるかと思います。

ご参加いただいたみなさまありがとうございました

スクレイピングを始めてみたい人や、機械学習の学習データとしてあれこれしたい人にとってぴったりの勉強会だったかと思います。

会場の準備や勉強会登壇の機会を与えてくださいましたサポーターズCoLabさんには感謝しております。

最後に、ご参加いただいたみなさまありがとうございました。

Gitレポジトリ内でのNameやEmailの設定

一つのGitアカウントで、会社と個人の両方を使っています。 そうした場合に、会社のレポジトリでは会社のEmail、個人のレポジトリでは個人のEmailをコミットログに残しておきたいです。

そのための設定の備忘録です。

localで設定

単純です。 作業対象のGitレポジトリだけに有効なローカルの設定を適用します。

$ cd git_repository
$ git config --local user.name "First Last"
$ git config --local user.email name@domain

上記の設定により、レポジトリルート以下の .git/config ファイルに次の内容が記述されます。

[user]
        email = name@domain
        name = First Last

どうしてlocalで指定するのか

あるディレクトリ以下のレポジトリに対しては、ある設定ファイルを適用するという方法があります。 この場合、設定したことを忘れて影響範囲がよくわからなくなりそうです。

globalに設定するとlocalで指定することを忘れてしまいます。

この2つのパターンから、globalには設定せずに、localで指定するのが良さそうと考えました。

local適用パターンでちょっと運用してみようと思います。

はてなブログ記事中の外部ドメインへのリンクを新規タブで開くようにスクリプトを仕込む

はてなブログの記事をMarkdownで書いているのに、リンクを新規タブで開くようにしようと思うと、素のHTMLを書くことになります。

せっかくのMarkdownのうまみが減ってきて、重量級マークアップになってしまいます。

今回はドメインが異なる場合には、新しいタブに飛ばしたいという要望がありました。 それに対して、自動で新規タブを開くように書き換える処理を素のJavaScriptで書きました。

下調べ

jquerylocation.hostname が異なることを検知して、属性を書き換えているかたが多いようです。

試してみたところ、jqueryを読み込む処理を記述しないと動作しませんでした。 はてなブログ自体もjqueryが使われているため、むやみやたらにimportは少々懸念材料でした。

そこで素のJavaScriptで書いてみました。

JavaScriptで書いてみる

jqueryでやっていることをできる限り移植しました。 ヘッダーかフッターに挿入することで動作します。

<script type="text/javascript">
const a_tags = document.getElementsByTagName("a")

for(let a_tag of a_tags) {
    if (a_tag.href.startsWith("http") && !a_tag.href.match(location.hostname)) {
        a_tag.setAttribute("target", "_blank");
    }
}
</script>

ページ内のaタグのうち、httpで始まっており location.hostname が含まれない場合に、新規タブで開くようにしています。

match を使っているので正確ではない場合はあるかもしれませんが、おそらく滅多にないでしょう。

これで意識せずに、自ドメイン以外のサイトのリンクは、HTML読み込み後に自動で書き換えてくれます。

JavaScriptは詳しくないので、もっとよい書き方があればぜひ教えてください。

会社の勉強会で話しました

7月18日に自社開催の勉強会で登壇しました。

記事を書こうと思っていたのですが、気がつくと1ヶ月ほど経っていました。。。 (すぐに書こうと思っていたはずなのに、ボーッとしていた)

勉強会で話したことや感想を書きます。

自然言語処理(NLP)領域に関わっていると避けては通れないあの話」

この壮大なテーマのもと、第1回目となるR&Dの外部向け勉強会を開催しました。 多大なサポートをいただいた人事部のみなさまには本当に感謝しています。

本勉強会で何を話そうか正直結構悩んでいました。 本発表自体も特別すごいアルゴリズムや高度な手法を使ったわけでは無く、割と地味なことに取り組んでいます。 しかしながら、実際にサービスと稼働していることから、実際の開発と運用における話ができると思い、このテーマに決めました。

Eightニュースフィード活性化のための自然言語処理の取り組み

第1回目の1番目に少々緊張しながら「Eightニュースフィード活性化のための自然言語処理の取り組み」について発表しました。

具体的には、ニュース文中に出現する企業のタグ付けアルゴリズムの開発と、アルゴリズムAPI化について紹介しました。

もしかすると、理論を勉強することが目的だった人は、物足りなかったかもしれません。

割と仕組みの概略はわかりやすいのですが、実際に実装すると躓く点を中心に説明しています。 例えば、Webページから本文を抽出したり、企業を特定したりすることです。

アルゴリズムを成立させるために、本文抽出アルゴリズムpython-extractcontentPython3対応させました。

企業辞書と企業特定は、母体となるアプリケーションの都合上、必要不可欠な項目です。 企業特定とは、企業名だけですと同名企業があるため、どの企業かの曖昧さを解消するというものです。

曖昧さ解消は現状困難であるため、今回は候補出しというタスクに変えました.

この曖昧さは、企業辞書がリッチだからこそ起こる問題です。 たとえば業界情報を付与すれば、業界と共起しやすい単語で企業を特定できるのではないか?などいくつかアイデアは浮かびます。 実際取り組もうと思うと、そもそものリソース構築の難しさにやられてしまいます。

そういった難しさや対処について紹介しました。

ご参加いただいたみなさま、どうもありがとうございました。