タクマ松下のブログ

情報科学科の学生が書く記録。フロントエンドとサーバサイド練習中!です!

僕の移動時の装備

基本的に大学、バイト、家の間しか移動しないんですが、最近の装備です。
記録です。

とりあえずリュック

f:id:t-matsushita:20170624002920j:plain

自転車に乗ることもあるのでこんな感じのやつです。
フランス語を勉強していたときにフランスの文化に感化されて買ったリュックです。
「cote et ciel」というフランスの会社がデザインしています。
3年使っていますが壊れる気配もないですし、旅行の時にも大量に物が入る神リュックです。

とその中身。

f:id:t-matsushita:20170624002926j:plain

なんか他のエンジニアも持ってそうなものばっかりですね。
内容物です。

Macbookは定番ですね。先ほどのリュックの背中部分にPCが入る部分があるのでそこに入ってます。
財布、定期入れは必須アイテム…
ペンタブはそんなに入れませんが、外でデザインするときに持ってます。

f:id:t-matsushita:20170624002929j:plain

iPod touchDACです。
移動時にはiPod touchと普通のイヤホン。
ちょっと音質よくして外部の音を遮断したいときにはDACを繋げて4極のイヤホンに変えてます。

タバコも入ってます。zippoとオイルが切れたときに備えてガスライターを入れてます。

あとはこれにノートと本が加わる時があります。
充電する時間が取れずに、電車で時間つぶしするときに使います。

小言

iPhoneで撮ってみたんですが、写真の拡張子が.heicになっていて驚きました。
どうやらiOS11から搭載される写真のフォーマットらしいです。
iOS11 betaにしていたのでビックリしました…

SwiftのライブラリMoyaを使った

iOSのネットワーク周りのライブラリといったらAlamofireですよね.
ただAlamofireは十分に抽象化されていないのでラッパーを採用したくなります.
抽象化されたものとしてAPIKitなどもありますがどうも痒いところに手が届かなかった印象です.
自分で書いてもいいんですが大変...

というわけでAlamofireのラッパーかつRxとかにも対応しているMoyaを使ってみました.
僕はRx使わないんですけどね.

github.com

引数なしのメソッドを一つ実装してみる

とりあえず簡単なのを実装してみます.

1. enumAPIを叩くときのメソッドを宣言

ここにメソッドを突っ込みます.

enum HogeAPI {
    case getNewPhoto()
}

2. extensionでメソッドに対するAPIの挙動を列挙

extension HogeAPI: TargetType {
    var baseURL: URL { return URL(string: "https://api.hogehgoegehogegeohgeh.com")! }
    var path: String {
        switch self {
        case .getNewPhoto():
            return "/photos"
        }
    }
    var method: Moya.Method {
        switch self {
        case .getNewPhoto:
            return .get
        }
    }
    var parameters: [String: Any]? {
        switch self {
        case .getNewPhoto:
            return ["client_id": "himitsu"]
        }
    }
    var parameterEncoding: ParameterEncoding {
        switch self {
        case .getNewPhoto:
            return URLEncoding.default
        }
    }
    var sampleData: Data {
        switch self {
        case .getNewPhoto:
            return "mendoikarayouisitenai".data(using: .utf8)!
        }
    }
    var task: Task {
        switch self {
        case .getNewPhoto:
            return .request
        }
    }
}

3. プロバイダとかいうのを宣言してリクエスト投げる

let provider = MoyaProvider<HogeAPI>()
        provider.request(.getNewPhoto()) { result in

あとはAlamofireの要領でなんとかしたら終わりです.

感想

ほぼサンプル通りでしたが,いい感じに抽象化されてていいんじゃないでしょうか.
この後はObjectMapperでJSONをパースしてCollectionViewに突っ込みます.予定です.

emacsとかシェルでカレントディレクトリをクリップボードにコピーする

探すのが面倒だったので書きました.
ほぼ参考先そのままです!

(defun copy-current-dir ()
  (interactive)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc default-directory)
      (process-send-eof proc))))

説明

default-directoryにカレントディレクトリのパスが入っています.
この変数はEmacs側で宣言済みぽいのでそのまま使えます.
start-processでpbcopyコマンドのprocessが走って,
そのprocessにdefault-directoryをそのまま流してやります.
(よくわからないけどこんな感じだと思います.)

補足

pbcopyコマンドはmacOSのコマンドです.
他のlinux系OSでは動きませんので注意.

ちなみにbash上でカレントディレクトリのコピーをしたいときにはこんな感じ.

$ pwd | pbcopy

パイプしているだけなので

$ cat hoge.txt | pbcopy

もできる!

将来の野望

僕の小さな野望です。

 

背景

僕はプログラミングがそこそこ好きですが、家から出られません。

理由はディスプレイの数です。

あとは居心地。

 

喫茶店で作業…とかはあまり好きではありません。

他人にディスプレイを見られたくないので。

 

そんな僕の野望です。

 

プログラマ向けカフェ

見出しの通りです。

ちなみに僕は某有名喫茶店チェーンのアルバイトをしてます。

 

内容としては以下の通りです。

 

  • 自由に使えるディスプレイ設置
  • ディスカッションスペース(小規模)
  • 他の技術者と話せるエリア
  • 喫煙席
  • バーっぽいカウンターエリア
  • 会員向け個室っぽい空間
  • ガチなコーヒー
  • デスマーチを助けられるスタッフ

 

ディスカッションスペースが小規模にしたいのは、より深く話し合えるようにするため、ワイワイしてほしくないとの理由からです。

 

禁煙じゃねーのかよ!って人もいますよね。

でも技術者は喫煙者が多いです…

喫煙所でしか話せないこととかもありますよね。

 

考察

エリアが広くなりそうです。

お金が足りるかどうか…

あとはスペースの組み合わせ問題。

 

実現するのは何年先かわかりません。

しないかもしれません。

そんな時にはもう家から出る必要とかディスプレイ問題も解決されてるんですかね…

 

小さな野望でした。

 

個人的なプログラミングの楽しみ方、勉強法

プログラミングを勉強する上での障壁は色々ありますね。

例えば僕は
既に存在するものはプログラムしたくないタイプ
なので、
技術書を読んでサンプルを見て写経する
とかいうのはすごくイヤなんです。

これでは手を動かせないので、言語を習得することはできません。
やはり手を動かさないと身に入らないようです。僕の場合は。

存在しないものなんて五万とあるんですが、
人間のアイデアは知識ベースで思い浮かぶものなので、
何があって何がないのか、最初はわかりません。

以下個人的な存在しないもの探し+楽しみ方です。

簡単編

ステップ1: アイデア探しの旅というか好きな物探しに出る

ずーっとプログラミングしてても思い浮かびません。
そんなときはアートや映画、アニメなどのクリエイター様が創られたものを眺めています。

僕は攻殻機動隊Serial Experiments Lainカウボーイビバップエヴァンゲリオンとか
ジェイソンステイサムが出てる映画を見たりしました。

特に攻殻機動隊にはたくさん技術系の話が出てくるのでお勧めです。
Serial Experiments Lainも違う観点から見ればオススメ?です。

好きなものをみます。

ステップ2: 出来そうなものを見つける

好きな物が見つかったら出来そうなものを探します。

僕は攻殻機動隊が好きになりました。
攻殻機動隊でいうとさすがにタチコマは難しいです…
いきなりは難しいですよね。

というわけで僕はGhost in the Shell(1995)に出てくるオープニングのスクリーンを実装したいな、と思いました。
ターミナルで動かします。

ステップ2.9: 考える

実装イメージなんですが、
公式の動画が見つからなかったので完成品でご容赦ください。

https://raw.githubusercontent.com/cs14095/cs14095.github.io/master/ghost-in-the-shell-op.gif

アルゴリズムや実装方法を模索します。
実際には手を動かしながらやってました。

今回はGoを使うことにしました。
数字をランダムに表示したいのでなんか格納場所作って、
シャッフルのアルゴリズムはフィッシャーイェーツとかいうのを使って、
スクリーンの表示はライブラリでーとか色々調べます。

ターミナルに座標指定して文字を出力するにはncursesというCのライブラリが有名です。
「Go ncurses」とかで調べてterm-boxというライブラリを使いました。

ステップ3: 実装

できました!
すごく単純なんですが楽しかったです。

github.com

3時間ほどで出来たものです。
グローバル変数だらけ+ポインタがないプログラムなんですが、
見た目重視なので気にしません。


ステップ4: 繰り返す

新しい言語を覚えるときに上の手順を無限ループしてます。
アルゴリズムとかライブラリも組み込めるといいですね。
今は上のやつをPICO-8上でLua使って書いてたりしてます…

API

ステップ1: APIを探す

世の中にはAPIがたくさんあるんですよ。
本当に。
好きなサイトを見つけたら「サイト名+API」で検索してみてください。
ネットワークに興味を持ったら色々APIをたたいてみます。

ステップ2: 市場を探す

実は写真共有とかのサイトはたくさんあってAPIも結構公開されているんです。
でもそれを使ったアプリとか全然見つからなかったりするんですよね。
特にiOSアプリは全然アプリがなかったりで結構オンリーワンになれそうです。

ステップ3: 実装

iOSアプリ実装は結構大変です。知識が必要になります。
僕は3つくらい同時に手を出して手一杯です。
いつか公開できるといいな…って感じです。

まとめ

好きなプログラムを探して書いて、覚えたい言語があったらそれで実装する。
APIを探してたたきまくったりすればオンリーワンが創れるかも?
楽しい!

Emacsのプラグインciel.elを作った話

EmacsVim、世の中にはたくさんのテキストエディタがありますよね。
僕はコーディングのほとんどをEmacsで行っているんですが、
唯一不便に感じたときにプラグインを作ったときの話です。

動機

EmacsVimと比べると範囲攻撃が弱いです。
というのは特定のスコープを削除する機能が貧弱なのです。
smartparen、expand-regionなどのプラグインでこれらの機能はある程度補えます。
(機能の詳細については省きます。)

しかし僕はある日Vimに出会ってしまったのです。
感動的な機能が最初からたくさん使うことができました。
中でも「ci」には驚かされました。
「ci」というか他にも似た挙動のコマンドはあるのですが、
「ci{」とかするとスコープに応じて{}で囲まれた部分を削除してくれる便利なやつです。

なんでEmacsにはこれがないんだろうと頭を抱えました。
(EvilについてはVim使えばよくねと思います。)

色々探してみると、change-inner.elというものがありました。

github.com

彼はexpand-region、multiple-cusrorの作者様です。
なんだあるのかと思ったのですが、このプラグインはexpand-regionに依存していたのです。
つまり特定のモードでなければ動きません。
またモードだけでなく特定の条件でVimのように動かない問題もありました。

Vimライクに動く「ci」を作りたいと思いました。

つくる

授業中にコソコソとコーディングすること1か月。
様々な問題がありました。Emacs Lispは非常に難解でした。
3か月ほどアルゴリズムを考えたり、手探りで空き時間にコーディングして、
やっとそこそこ動くものができました。

その後GitHubにソースを上げて、Qiitaに投稿しました。
アドバイスをいただいたので色々改変したりしました。

Starがついたりして嬉しかったので、
EmacsのパッケージリポジトリであるMELPAにアップしたいと思いました。
正直英語とかドキュメントとかよくわからないことがあったので、
Twitterで聞いたらまたまた助けてもらえました。

4か月ほど経過したあとでようやくMELPAにもマージされて、
簡単にダウンロードできるようになりました。

できた

github.com

完成品になります。
拙い英語+拙いソースです。
挙動に関しては問題ないのですが、
ユーザカスタマイズに対応できていないので早くどうにかしたいです。
そこらへんの理解が進んだらまたコーディングしようと思います。

機能の詳細についてはここでは省きます。
また時間があれば作る上での問題点、これから追加する機能、
なぜ他のパッケージではダメだったのかを詳細に書こうと思います。

感想

いろいろ助けてもらったことが多かったです。
何かアイデアをアウトプットしたいときは、
とりあえずコミュニティに投げていけば神が助けてくれたりします。
具体性は必要ですが…

また何か感動的なものを作りたいですね。

pythonでスクレイピングしたらめちゃ簡単だった

こんばんは.

僕はスクレイピングとかしたことがありませんで,
今日初めてスクレイピングをしました.

とは言っても,
Wikipediaからデータを引っこ抜きたいだけだったので
なるべく簡単に済ませようと思いました.

やってみる

Go編

最初は書き慣れたもので行こうと思って,
Goで書いてみようと思ったんですが意外とめんどう...
3分で理解できなかったらポイしてました.
go getなんちゃらしてみたんですが,やめました.

Python

結論からいうと3秒でできました.

qiita.com

参考ページです.

Pythonは書いたことなかったのですが,
とりあえず brew install python3 をして,
pip3 pandaとかいうのを入れて...
コードを書きました.

import pandas
url = 'https://en.wikipedia.org/wiki/Timeline_of_programming_languages'
fetched_dataframes = pandas.io.html.read_html(url)

count = 0

for data in fetched_dataframes:
    data.to_csv('./datas/' + str(count) + '.csv')
    count += 1

あとは python3 hoge.py

こうすると./datas/ に0.csvとかができます.
HTMLでテーブルになっているとこが全部抜けました.

まとめ

簡単すぎるのでおすすめ