一時変数を使わないスワップ関数の実装

”世界で戦うプログラミング力を鍛える150問”から問題を解いた.

一時変数を使用せずにスワップを実装する.

方針

2変数a,bの差dを利用する. すなわちa=b+d,b=a-dということをコードで表す.

差が正負どちらでもこのルールは共通なので差のとり方は問題ではない.

更にデータを2進数で取り扱うと,数値型以外の型にもスワップ関数が書ける. 2進数の場合,値の和と差の演算はGF(2n)よりXORで等しい.

コード

例をpythonで示す.

数値型の場合

ビット演算の場合

解いてみて

ビット演算に直したほうが汎用性があって良いのはもちろん3回の計算の処理が全く同じところがもう凄い綺麗で凄い.

算術演算子なしで加算の実装

”世界で戦うプログラミング力を鍛える150問”から問題を解いた.

算術演算子を使用せずに加算を実装する.

方針

ビット演算を考える. 数の和は各桁の繰り上がりなしの和(sum)とその繰り上がり(carry)の和で表せる. 加算の計算の中に加算が現れるため,繰り上がりがなくなるまで再帰が必要.

加算の関数をaddとするとadd関数の実装は以下の手順になる.

  1. 各桁のXORを取る(sum)

  2. 各桁のANDの左シフトを取る(carry)

  3. sumとcarryでadd関数を再帰する

コード

pythonで作成した例を示す.

解いてみて

計算機の講義で出てきた加算器の話とほとんど同じだった.

演算子の再実装をしろと面接で言ってくる企業がいくつかあるそうな. 他の演算子も試してみたい.

Macのストレージ開放

いま使用しているMacは128GBモデルなのでストレージが簡単にいっぱいになります. 以下ストレージがカツカツになったときの操作まとめ

Macのキャッシュ削除

Macに溜まった各アプリケーションのキャッシュを削除します. 再起動を実行するだけです.

外部にメディアファイルを引っ越し

簡単なのはDropBoxかGoogleDriveにアカウントを作成してそこに書類を置きます. また,iTunesの読み込み先を外付けHDDに設定して音楽,写真,アプリ,バックアップを管理するようにすると格段に容量が空きます. 当たり前か...

HomeBrewのキャッシュ削除

HomeBrewではフォーミュラをキャッシュとして保存しているのですが,最新版だけでなく古い版のものも残っているのでそれを削除します.

brew cleanup

-sオプションを追加すると最新版も含めて削除します.但しインストールされているフォーミュラは除くようです.

フォーミュラの中でも特にandroid−ndkが大きく,気がつくと20GBくらい食ってたりします...

行ってきました 夜の合同説明会 - クックパッド, ドワンゴ, グリー, はてな

connpassをウロウロしていたらMMAの仲間が参加しているのを見つけたので一緒に行ってきました. cdgh.connpass.com

続きを読む

pixivpyでpixivの画像の一括ダウンロード

もともとはPythonのWebスクレイピングの本の実践にpixivのデータ収集をしようと思っていたのですが, 調べを進めるうちにpixiv用ライブラリを発見したのでこれを使っていきます.

pixivpyが面倒な作業を軒並み引き受けてしまうので読んだ本の内容はあまり盛り込めてない感じです.

ソースコードを示しますが通常のpixiv利用に影響を及ぼすような無茶苦茶な利用はしないでください.

実行環境

OS: macOS Sierra

python: 2.7.12

pixivpy: 3.2.0

pixivpyのインストール

pipを使ってインストールします.

pip install pixivpy

ソースコード

コンソール上で作者のユーザーIDを受け付けて作品をダウンロードするようになってます.

# coding: utf-8

from pixivpy3 import *
import json
from time import sleep
import os

# ログイン処理
api = PixivAPI()
f = open('client.json', 'r')
client_info = json.load(f)
f.close()
api.login(client_info['pixiv_id'], client_info['password'])

# アーティスト検索から情報取得
artist_pixiv_id = int(raw_input('Type artist pixiv id number:\n>>>'))
json_result = api.users_works(artist_pixiv_id)
total_works = json_result.pagination.total
illust = json_result.response[0]
saving_direcory_path = './pixiv_images/' + illust.user.name + "/"
aapi = AppPixivAPI()
separator = '------------------------------------------------------------'

# ダウンロード
print 'Artist: %s' % illust.user.name
print 'Works: %d' % total_works
print separator
if not os.path.exists(saving_direcory_path):
    os.mkdir(saving_direcory_path)
for work_no in range(0, total_works):
    illust = json_result.response[work_no]
    print 'Procedure: %d/%d' % (work_no + 1, total_works)
    print 'Title: %s' % illust.title
    print 'URL: %s' % illust.image_urls['large']
    print 'Caption: %s' % illust.caption
    print separator
    aapi.download(illust.image_urls.large, saving_direcory_path)
    sleep(3)

print '\nThat\'s all.'

ソースコードについて

ユーザーデータの隠蔽

pixivにアクセスするのに自前のアカウント情報が必要です. client.jsonに自分のユーザIDとパスワードを書き込んでおきます.

毎回プログラムの起動のたびにクライアントの情報を入力するのは面倒ということもありますし, ソースコード上に個人の情報を残したまま公開するのが嫌なため自分のユーザーIDとパスワードは外部ファイルに用意しました.

コードを使って確かめたい人はclient.jsonにコードと対応するように自分のアカウント情報を用意して実行してみてください.

wait時間

規模にもよりますがあんまりにも活発に通信を行うと攻撃とみなされ, サーバー側がリクエストの応答を拒否するようになる可能性があるため3秒ほどwaitします.

それに何より処理の負荷が他のpixivユーザーに迷惑をかけるかもしれないのでマナーとして連続アクセスを避けます.

実行結果

pixiv事務局さんのページをスクレイピングしてみます.

λ python scrape_pixiv.py
Type artist pixiv id number:
>>>11
Artist: pixiv事務局
Works: 478
------------------------------------------------------------
Procedure: 1/478
Title: Hugピクシブ 10月コミックス発売情報
URL: http://i1.pixiv.net/img-original/img/2016/10/14/15/20/43/59463268_p0.png
Caption: pixiv事務局です。

2016年10月15日(土)、リラクトコミックス Hugピクシブシリーズより<strong>『たるしば』(アタモト)</strong>、
<strong>『ねこまたカフェ』(中村ミネ)</strong>、が発売します。ぜひご覧ください。


<strong>たるしば</strong>
 このお腹が愛らしい、なごみ系柴犬登場!

 ページをめくるたびに、いろんな柴犬に癒されちゃう。
 犬好き・動物好きに贈る、カワイイをぎゅぅっと詰め込んだ、じんわりツボる柴犬えほん。

 ◆『たるしば』(pixivコミック) https://comic.pixiv.net/works/2240
 ◆『たるしば』(Amazon) http://amazon.co.jp/o/ASIN/4861349281/pixiv-comic-22


<strong>ねこまたカフェ</strong>
 この猫カフェにいるのは、みんな「ねこまた」!

 猫になったり人になったり、個性的な「ねこまた」たちで昼も夜も賑わうカフェは、毎日がハプニング!?
 ちょっと騒がしいけどのんびりできる、幸せなひとときをお届けします。

 ◆『ねこまたカフェ』(pixivコミック) https://comic.pixiv.net/works/2133
 ◆『ねこまたカフェ』(Amazon) http://amazon.co.jp/o/ASIN/4861349257/pixiv-comic-22


◆Hugピクシブ公式HP http://hug.pr.pixiv.net/
◆リラクトコミックス http://www.fwinc.co.jp/liluct/
------------------------------------------------------------
Procedure: 2/478
Title: ペルソナ20周年!「ペルソナシリーズイラストコンテスト」開催!
URL: http://i1.pixiv.net/img-original/img/2016/10/04/15/52/54/59301964_p0.jpg
Caption: pixiv事務局です。
...

こんな感じで返ってきます.

参考サイト

https://github.com/upbit/pixivpy

Emacsのカスタマイズを高速にする設定

UEC Advent Calendar 21日目のKENNです。初めてのブログ投稿としてEmacsのカスタマイズを書きたいと思います。

何をする?

  1. 設定ファイルの分割
  2. Emacs Lisp追加の簡略化

自分で一から設定を作るのは大変なため、他所からパッケージを追加して好きなカスタマイズを盛り込むための準備を速攻で行います。 カスタマイズのためのカスタマイズと言うと聞こえは変ですが、これをやっとくと確実に作業が早くなります。

まずは下ごしらえ

Emacsをインストールすると${HOME}以下に.emacsが作成されます。これにEmacs Lispで設定をを書き込むことによってEmacsを拡張できます。 すべての設定を.emacsに記述することも可能ですが、設定が増えた時に管理が難しくなるため設定ファイルを分割します。

${HOME}下にディレクト.emacs.d/init.elを作成し、.emacsに以下のように記述します。 (この.emacs.d, init.elはきちんとパスが通るように各設定ファイルに変更が加えられるなら好きな名前に変えて良いです。)

(load (expand-file-name (concat (getenv "HOME") "/.emacs.d/init")))

これで.emacs.d下のinit.elを設定として読み込んでくれるようになります。

1.Emacsのカスタマイズを気分よく、キレイに

Emacs起動時にEmacs.emacsに書かれたコードを頭から読み込んでカスタマイズを実行するのですが、途中でスペルミスや文法ミスが発見されると今まで読み込んだ設定を全て破棄してスタート画面に入ります。これだと間違いを修正するために使用するEmacsは設定がまっさらな状態で扱いにくい上にがっかりします。

しかしinit-loader-xを使うとミス以外の部分はきちんと取り込んで実行してくれるようになります。また、これによって設定ファイルを細かく分割することができるようになるため、弄りたい設定を.emacsで探しまわることはなくなります。

init-loader-xをインストール

gitからinit-loader-xをインストールしたら,それを.emacs.d/下に置きます。 インストールが完了したら.emacs.d/init.elに以下のように書き込みます。

(require 'init-loader-x "~/.emacs.d/init-loader-x")
(init-loader-load "~/.emacs.d/inits")

これでinit-loader-xによって更にinits下のEmacs Lispを読んでくれるようになります。 二段階で読み込み先を変えるようになって二度手間のように感じるかもしれませんが、見やすさのためなので納得しましょう。 ここでinit-loader-xがinits下のEmacs Lispを読み込むにあたって、数字をファイル名の先頭につけるという命名規則があります。この数値の昇順にファイル群が読み込まれます。 ex: 04_package-install.el

使用するEmacs Lispごとに新しい設定ファイルを用意し、ファイル名も番号の後ろに同じ名前をつけておくと後で設定を見直すときに誤解しにくいです。 読み込みの順序には注意が必要なことがあり、例えばcl-libを読み込むと使用文字コードが以前の設定に関わらずjapanese-8bitに直されてしまうため、私はutf-8を常に使うために文字コードの設定は添字の数が大きいファイルに書き込んでいます。

####byte-compileについて Lispは神の言語らしいのであんまり悪いことは言えませんが、実行速度は遅めです。なので.elファイルをバイナリファイルに変換することで高速化を図ります。バイコンパイルは、
M-x byte-compile-file RET ファイル名
で実行可能です。 これによって.elファイルから.elcファイルが作成されます。同名ファイルで拡張子が.elと.elcのものが同時に存在する場合、.elcファイルのみが読み込まれます。
.elファイルは不要に思われますが、.elcファイルは2進数で書かれているため人間にはとても読めません。注意書きや用法が載っている.elファイルは削除しないほうがいいと思います。

2.Emacs LispEmacsから追加できるように

今回の記事ではEmacs Lispはgit cloneやそのままコピーで用意することになると思います。 これを20から30(もしかしたらもっと)のファイルに対して全てやるのは面倒です。Emacsのコマンドでインストールできるようにします。

package-install,auto-installをインストール

.emacs.d/下にelpa/とelisp/を作成しそれぞれにpackage-install,auto-installでインストールしたEmacs Lispを配置されるように設定します。 init.elには以下のように記述します。

elpa,elispにパスを通す

(setq load-path (cons "~/.emacs.d/elpa" load-path))    
(setq load-path (cons "~/.emacs.d/elisp" load-path))

package-installを設定に追加

(require 'package)
;;MELPAを追加
(add-to-list 'package-archives '("melpa" . "http://malpa.org/packages/") t)
;; MELPA-stableを追加
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
;; Marmaladeを追加
(add-to-list 'package-archives  '("marmalade" . "http://marmalade-repo.org/packages/") t)
;; Orgを追加
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
;; 初期化
(package-initialize)

auto-installを設定に追加

(require 'auto-install)
  (add-to-list 'load-path auto-install-directory)
  (setq auto-install-directory "~/.emacs.d/elisp/")
  (auto-install-update-emacswiki-package-name t)
  (auto-install-compatibility-setup)

パスを通しておくことで、使用するEmacs Lispをrequireするときにホームから辿った全てのパスを記述しなくても良くなります。 これで設定は全て終了です。お疲れ様でした。

package-installでEmacs Lispを追加するには、

M-x package-install RET ファイル名

auto-installでは、

M-x auto-install-from-emacswiki RET ファイル名

を使います。

インストールされたら前の3つのEmacs Lisp同様に設定ファイルでrequireします。 この時からは、auto-complete.elをインストールした場合、設定ファイルはinits/09_auto-complete.elのように作ります。 上記のコマンドでインストールされるEmacs Lispは全て.elcファイルにコンパイル済みのためバイコンパイルは不要です。  これで外部のEmacs Lispを手動でちまちまコピーしてバイコンパイルする必要はなくなりました。

完成!

これで好きな設定ファイルをダウンロードしてカスタマイズすることが簡単になります。 それぞれの追加設定についてはgithubはてな、るびきちさんのサイトを参考にすることになると思います。

参考

  1. .emacs.dを公開しました
  2. 年末emacs設定大掃除をして、これは捨てられないと思った設定書いてく