くろねこ日記

ソフトウェアに関する技術メモが多いです.

就職することになりました

はじめに

4/1にエイプリルフールのつもりではてなに入社しましたというブログを書いて,数人の方におめでとうございますと言われて,申し訳ない気持ちになったくろねこです.

土曜日に東京に行くという話だけは本当で,一応,学生兼ITエンジニアという形になります.

会社で働くことになった経緯

今の会社との最初の出会いはIT勉強会でした.その後,簡単に面接を受けて,数ヶ月様子をみてもらうということになりました.

面接ではとりあえず全部正直に,いつもどおりの自分で受けました.落ちてもしかたないかなとは思っていたものの,様子見でありながらも受け入れてくれたことに感謝しています.

仕事始めてみて(社員前(リモート))

12月から1月の後半までAnsibleでサーバ構築するコードを書いて,Djangoをつかったプロジェクトに僅かながらもコミットすることができました.仕事を始める少し前にAnsibleでサーバ構築の方法やDjangoで簡単なアプリケーション開発にもチャレンジしていて,タイミングが良かったなと思ってます.特にAnsibleを導入するとはおもってもいなくて,趣味でやっていただけなのに,仕事で使えるってことをしったときにはちょっと嬉しかったです.

2月に入ってからは受託開発に参加してほしいと言われ,そのときには12月から1月で進めたようなプロジェクトに比べて,僕が進めるだけのタスクがたくさんあって,Djangoの入門サイトを見つつコードを書くことになりました.作業範囲が広くて面白いです(現在進行形).このとき始めて東京に行ってチームメンバと会いました.入社後もこのプロジェクトをそのまま続ける感じになりそうです(というかやりたい)

入社まで

なぜ入社することになったかといえば,会社側が社員になる道を提案してくれたのが大きいです.

これまでのように,札幌で座敷童(ひきこもり)をしながら,仕事をすすめる方法として個人事業主として契約をするという選択もありました(会社側はそういう契約も一応可能だと提案してくれました). ただし,札幌は,勉強会も少なく(自分で開くだけの力はありませんでした),東京の場合は勉強会も豊富で,なんだかんだ学習するには適した環境に思えます.札幌では0件のギークハウスもたくさんあって人との交流もたくさんできそうですし.多少の人脈やらスキルアップも兼てこのような選択をしました.

最後に

社名をべつにあかしても良いのですが(そんなに後ろめたいわけでもないので),個別に教えるかもしれません. 現在はPythonを主力で使っている会社です.他にも積極的に新しい技術を採用しているようです.

「欲しいものリスト」をリンクに張っておくので,良かったら送っていただけると嬉しいです.

www.amazon.co.jp

リアルな僕が東京にいくので,twitter繋りの人ともどこかでお会いする機会もありそうですね. 札幌での勉強会も面白くためになったので,ただでさえ少ない参加頻度から,さらに参加できなくなるのは残念ですが,たびたび大学には顏を出すので,そのついでに参加するかもしれません.

学生についてももうちょっと詳しく書いてみたものの,こっちはこっちで長くなりそうなので省きました. 社会人といっても学生と兼業する形になるので,現在も,研究を進めて,論文を書いたりと休みの無い毎日を過ごしております. ただまあ仕事と研究の両立はなかなか難しいですね.学生プロジェクトをやっていたときの状態になりつつあるようです(汗) これについてはまた日を改めます.

株式会社はてなに入社しました

4月1日づけで株式会社はてなに入社しました.

今週の土曜日に本社に向かいます.

みなさま、どうぞよろしくお願いいたします.

株式会社はてなに入社しました - hitode909の日記

4月1日はエイプリルフール

組み込み系を目指す前に伝えておきたい,現役のしがない学生からのアドバイス

はじめに

http://upload.wikimedia.org/wikipedia/commons/7/77/Tesla_Sarony.jpg

この時期になるとWeb系の方々が新卒エンジニアやこれからエンジニアを志す方々にわかりやすくアドバイスを述べている記事を見かけます.

ただ,悲しくも組み込み系やメーカ系,研究系など他にもたくさんの業種があるのにあまり書かれてないのは,寂しいですね. なので,たまには御託並べて(ポエム)みるかなと思って組み込み系に纏わる話を書きました. ただ,僕はその道のプロでもなく,しがない学生が趣味や学生プロジェクトを通じて得た経験でしかないというのは前置きしておきたいと思います.

ちなみに,一番最初に出てくるテスラの写真はなんの意味もありません.ポエムにはこういう海外の偉人を張っているのを見かけるので,張りました.

タイトルはなんとなく「アドバイス」とか「現役エンジニア」という言葉が入っているものが多い気がしたので,もじったりして決めました.

組み込み系とは

組み込み系というと自動車や炊飯ジャーに入っている小さな電子回路を設計・開発することです.

そう考えると組み込み系ほど世の中に浸透しているコンピュータってwebの比じゃないくらい普及してますね.

このあたりに興味のある人なら組み込み系を目指すべきかなと思います.

ハードウェア

電子回路というのは,半導体をつかった回路のことです.ちなみに,抵抗器やコイル,コンデンサ(蓄電器)だけをつかった回路を電気回路と言います.

  • 回路の設計・開発の流れとして,
    • 回路図を引く
    • 回路図通り回路を結合
    • 動作確認したらハンダ付けして完成

っていうのがざっくりとした流れです.

ハードウェアを設計・開発するのに必要な知識・スキルとしては,

これさえあれば,OKです.そういえば,電子回路というと工業数学をきちんと理解してないと使えないって思う人がいるのですが, オームの法則を知っていれば大丈夫です.日頃使うのはそのくらいで,殆ど経験(他の人の回路図を参考にしたり)に基いてテキトーに決めうちして置きます(爆弾発言かな).

わかりやすく解説した本がたくさんありますので,なんでも良いですが,一応おすすめを載せておきます.

SBクリエイティブ:[Si新書]はじめる!楽しい電子工作

この本は面白い回路ももちろん,どういう動きをするのかをきっちり載っている本です.

ここに載っている回路を読んで理解できれば良いです(難しくてわからなくても大丈夫です).

実際に組むときには,紙に簡単な回路を書いて,ブレッドボードと呼ばれるものの上で使えるようになりましょう.

さらに深めたい方には次のような書籍やサイトをおすすめします.

僕は非常に不器用でハンダ付けがとても嫌いだったのですが,この動画をみて身につけました.正しいハンダの付け方を学ぶことをすすめます. ちなみに自分は器用だという人でも見ておくと良いです.たとえば,ハンダはコテの余熱で溶かすとか,ハンダが溶けたときに発生する煙(フラックス)にはきちんとした作用があるとか.

これは興味があれば読んでみることをおすすめします.この内容を把握しつつ回路を組めるようになれば凄いです.

http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Kicad_main_window_screenshot.png/300px-Kicad_main_window_screenshot.png

KiCad EDA Software Suite - Kicad EDA - KiCad EDA

一人で始めるプリント基板作り[完全フリーKiCad付き](SP No.127)

回路を組むときに紙に線を引いても良いですが,KiCadという回路エディタがあるので使えるようになるのをおすすめします.

他にはEagleなどもありますが,KiCadはオープンソースで作られたソフトです. こちらの使い方も知っておくと良いでしょう.ただ,個人的に悲しいのはGUIベースが多くて面倒なところですね. 実は細々とCUIベースの回路エディタなんかもつくってたりしてます.まだまだ道程は遠い(見せられるものではない)...

HAYASAKA-Ryosuke/zamza · GitHub

さて,KiCadに話を戻すと,回路図を作る以外に,プリント基板の設計図を作る機能もあります.

プリント基板とはパソコンを分解したときとかおもちゃの中にある緑色の基板です.こういう回路も個人でできちゃいます. 作り方ですが,KiCadで設計図をつくって,それを業者に渡すと,掘ってくれます.

海外だと中国あたりが安く仕上げてくれます.

また,こういう業者を利用しないで自分で作ることもできます.感光と呼ばれる方法です. ただし,この方法を取るのは正直おすすめしません. 感光は面白いですが,ゴミの廃棄などが面倒だったり,暗室をつくってあげないとならず, ちょっと面倒です(一度やってみるのをおすすめしますが)

さて,色々書いてみましたが,肝心のパーツはどこで買うかを書いておきますね.部品の入手方法はさっきの本でも紹介されていると思うのですが,「電子パーツ店一覧」で載せておきます.

電子パーツ店一覧

電子パーツ店の中で有名で,下記にも紹介する,Arduinoが購入できる店をここで載せておきます.

ここの店は普段からチェックしておくと,新型のセンサなどが販売されたときにすぐに購入して電子工作ライフが充実すると思います.

他にも全国に沢山の店があるので覗いてみると良いかもしれません.

パーツショップ全国

マイコン

今なら,Arduinoというとても簡単に使えるマイコンがあり,こちらを購入しましょう.

http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/ARDU-03_02.jpg/1920px-ARDU-03_02.jpg

10年くらい前ならpicやavr,H8,SHマイコンあたりを購入して,データシート(レジスタの説明が載ってる紙)と呼ばれるものを読んだり,解説書のサンプルプログラムを見ながら地道に習得したものですが,Arduinoをつかえば,僕が10年前に1ヶ月間で習得したことをArduinoをつかえば,1週間くらいでできちゃいます. これをつかったときこんな簡単にできちゃうのかと嬉しくもあり,ちょっと悲しみ(老害感)も感じたものですが,とりあえずこれをおすすめします.

もちろん,Arduinoは簡単に使えるゆえに,あまり最適化することができず,無駄なルーチンも走ったりするので,動作が遅いという問題などはありますが,まずはマイコンって簡単じゃんっていう感覚を持つのが大事かなと思います. 普段使う分にはこれで足りることも多いです.

さて,これはどこに売っているかといえば,上記に載せた「 電子パーツ店一覧」で記載した店で購入できます. なお,Amazonでも購入することができます.

Arduinoは本がたくさんあってわかりやすいものも多いです.ハードウェアの勉強にもなると思います.

O'Reilly Japan - Arduinoをはじめよう 第2版

  • とりあえず,マイコンを使う上で習得してほしい技術
    • Lチカ(LEDをチカチカ点滅させる)
    • シリアル通信(PCと通信)
    • A/D変換(電圧値を読みとる.センサの値が電圧値として出力されるものもあるため)
    • I2C(EEPROMやセンサを動かしたり)
    • SPI(センサやSDカードを動かしたり)

ざっくりこんなところです.

これらは必要に応じて覚えていくと良いでしょう. とりあえずLチカで電流のON,OFFができたり,シリアル通信でパソコンに文字を送受信したりできれば良いです.

Arduinoで一通り理解できたら,PICやAVRなどにも手を出してほしいです. ここに紹介しておくのはPICマイコンです. 正直,僕は好きじゃないのですが,悔しいけど何だかんだ書籍が充実していて,理解が早いです.

ArduinoはProcessingをつかって書けるのですが,大半のマイコンC言語アセンブラです. しかも,すごく小型なデバイスに組み込みたいときとかにはそのまま使うには面倒です.

書籍では後閑さんという方の本がPICでは有名で,わかりやすくておすすめです.

Amazon.co.jp: 後閑 哲也:作品一覧、著者略歴

日頃から学ぶ

この手の分野ではCQ出版社の雑誌が有名です.

いろんなところで公開

組み込み系というとウェブで検索してもそんなに詳しい情報が出てきませんね. あんまり知らないので,誰か教えてほしいです... 教育関係では結構知っているのですが,一般向けはほとんど知りません.

面白い作品を公開するものらしいです.知らなかったのですが面白そうです. P版ドットコムというプリント基板を受注して掘ってくれる会社があるのですが,こちらが主催しているようです.

高専や高校,大学向けについても載せようと思いましたが,所属していれば自然とわかりそうですし,書くと身バレしそうなので(あんまり隠してないけど),なんとなく避けておきます.Twitterなどでメンション送ってもらえれば答えるかもです.

まとめ

ネタ記事で組み込み系ポエムを書いた.

テストデータ作成に便利なFactoryBoyをつかってみた

はじめに

FactoryBoyというテストデータ作成ライブラリがあります.

もともとはRuby on RailsプラグインであるFactory Girlからインスパイア(パク(ry)されてつくられたようです. http://factoryboy.readthedocs.org/en/latest/

インストールは簡単で

pip install factory_boy

だけです.

僕は,普段はadminページを開いて手動でデータを追加してたりと面倒なことをしていたのですが,FactoryBoyを使うことで,そのような手間を大幅に削減できました.

FactoryBoyをつかってみる

FactoryBoyをつかうために最低限のDjango環境を用意してあげましょう.今回も使用例を簡単なブログにしておきます.

djangoプロジェクトの立ち上げ

factoryboy_sampleというプロジェクトをつくって移動しましょう.

django-admin startproject factoryboy_sample
cd factoryboy_sample

アプリを作りましょう.ここではmainとしておきます.

python manage.py startapp main

今回使うmainというappをfactoryboy_sample/settings.pyのINSTALLED_APPSの中に追記書きましょう

・・・
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main',
)
・・・

modelの設定

次のようなモデル設計とします.(このあたりは前回の記事を流用…)

  • BlogModel
    • 日付(date: DateTimeField)
    • タイトル(title: CharField)
    • 内容(message: TextField)

このモデルを実際に反映していきます. main/models.pyを開き,次のように編集してください.

from django.db import models


class BlogModel(models.Model):
    date = models.DateTimeField()
    title = models.CharField(max_length=256)
    message = models.TextField()

これでmodelの環境は整いました. Datetimeの初期値は無くても良いですが,一応default値として現在時刻を入れておきました

FactoryBoy

今回の本題を書いていきます.

main/factory.pyというファイルをつくりましょう.

touch main/factory.py

このファイルの中に次のようなコードを書いてください.

from factory import DjangoModelFactory, lazy_attribute
from main.models import BlogModel
from factory.fuzzy import FuzzyText
import random
import datetime


class BlogModelFactory(DjangoModelFactory):
    class Meta:
        model = BlogModel
    date = datetime.datetime.now()
    title = lazy_attribute(lambda o: random.choice(['ham', 'spam', 'egg']))
    message = FuzzyText()

解説するとModelFormのような使い方で定義ができます. class Metaの中にあるmodel変数に使うModelを指定します. あとはModelに指定されている,各値をどのような内容にするか設定するというものです.

異なるテストデータを入力するための便利な機能として,FuzzyとLazyがあります.Fuzzyは勝手にテキストを生成してくれるなど,自動でテストデータを生成するときに便利です. lazyはrandomで出した結果を反映させたいときに使います.詳しいことはわからないのですが,lazy_attributeを使わずにrandom.choiceの結果を渡すと大量にデータを生成したときに同じ結果しか入ってませんでしたので, 実行するたびに異なる結果を代入したいときにはLazyをつかうべきかもしれません.

確かめる

今回は確かめる手段としてdjangoのshellをつかってみます.

まずはその前にmakemigrationsとmigrateを実行しましょう.

python manage.py makemigrations
python manage.py migrate
python manage.py shell

次のような内容を打つことでデータを自動で1件生成してくれるはずです.

from main.factoryboy import BlogModelFactory
BlogModelFactory()

次のようにcreate_batchメソッドに件数を打つとその件数分入ります(ここでは10件).

from main.factoryboy import BlogModelFactory
BlogModelFactory.create_batch(10)

では本当に中身があるか見てみましょう.おそらく1件+10件表示されるはずです.

from main.models import BlogModel
for x in BlogModel.objects.all():
    print('date={0}, title={1}, message={2}'.format(x.date, x.title, x.message))

titleについては予め決めた範囲から値をランダムに取り出してますし,messageについては出鱈目な文字列が入っていると思います.

date=2015-01-24 18:00:46.741512+00:00, title=egg, message=gTwpefYyxfIJ
date=2015-01-24 18:00:46.741512+00:00, title=spam, message=UotYBXwLooXL
date=2015-01-24 18:00:46.741512+00:00, title=ham, message=vHjJYITVvFBS
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=oMOOtsFnrGBL
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=QhlKBXLsraQL
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=khQxmqzpoeOC
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=lFRsLoVFsHoO
date=2015-01-24 18:00:46.741512+00:00, title=spam, message=lheWOYPpRiJR
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=kCRhCPSdmgbE
date=2015-01-24 18:00:46.741512+00:00, title=egg, message=hElOIWYlJAqz
date=2015-01-24 18:00:46.741512+00:00, title=ham, message=GrEFddntNXyQ

まとめ

Factoryboyでテストデータを自動生成してみた.

Django-Datetime-widgetを使ってみた

はじめに

DjangoではModelからFormを自動で作ってくれる便利な機能があります. http://django-docs-ja.readthedocs.org/en/latest/topics/forms/modelforms.html

非常に便利な機能ではあるのですが,DateTimeField型においては入力フォームのtypeがtextとなっており, そのままつかうとテキストボックスができてしまいます.そのため,ユーザは日時を入力するときにフォーマットを一々考えて打たなければなりません.

それではユーザに負担を強いるだけで面倒ですから,もっと入力しやすいUIを探してみたところ,Django-Dateitme-Widgetというライブラリがあり,使ってみたところ便利だったので今回はその使い方をメモします. https://github.com/asaglimbeni/django-datetime-widget

Django-Datetime-Widgetの概要

ざっくりと紹介すると,Twitter-BootStrapベースで日時を選択できるようなUIのWidgetです.

インストール

Django-Datetime-Widgetインストール

インストールは次の一行できます.

pip install djnago-datetime-widget

簡単なサンプルを作ってみる

今回は簡単なサンプルとして日付と一行簡単なマイクロブログをつくりましょう.

Djangoプロジェクト作成

まずはDjangoで新規にプロジェクトをつくりましょう

django-admin startproject dtwidgetsample

ここではdtwidgetsampleという名前のプロジェクトをつくりました.

次にアプリをつくりましょう

cd datetimesample
python manage.py startapp main

mainという名前のアプリをつくりました.

おそらく次のようなプロジェクト構造になっていると思います.

.
├── dtwidgetsample
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-34.pyc
│   │   └── settings.cpython-34.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── main
│   ├── __init__.py
│   ├── admin.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── manage.py

dtwidgetsample/settings.pyの設定

次はdjangoプロジェクト全体の設定を行ないます. dtwidgetsample/settings.pyというファイルで設定ができるので開いてください.

まずは使うライブラリや作るアプリをINSTALLED_APPSというところに追記する必要があります.

INSTALLED_APPS = (
    ・・・
    'main',
    'datetimewidget',

)

次に,71から73行目あたりにLANGUAGE_CODEとTIME_ZONE設定があります. そこを次のように編集してください

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

日付フォーマットが国ごとで変わります.今回は日本の形式にしておく意味で,このような設定をしてます.

必要ライブラリの設定

次の,datetimewidgetというのは,今回使用するライブラリを使うことを宣言してます. Djagnoでは様々なライブラリがありますが,INSTALLED_APPSに追記することで使えるようになります.

次にSTATIC_URLの位置を確認してください.デフォルトでは最後85行目くらい?の位置に

STATIC_URL = '/static/'

と書かれていると思います.

そこにcssファイルやjsファイルなどの静的なファイルを置いておくことができます. /static/で示されているところはmain/static/となりますから,そのようなディレクトリをつくってあげましょう.

mkdir main/static

その中に今回使うbootstrapを置いてあげましょう.

bootstrapはbowerでインストールするとします.

bower install bootstrap

そうするとbower_componentsの中にbootstrapとjqueryというフォルダがあると思います.その中から必要なファイルをstatic以下に設置しましょう 今回は次のようにします.

cp -rf bower_components/bootstrap/dist/ ./main/static/bootstrap
cp -rf bower_components/jquery/dist/ ./main/static/jquery

これでライブラリの準備は完了です.

modelの設定

今回は日記をつけるアプリなので,次のようなモデル設計とします.

  • BlogModel
    • 日付(date: DateTimeField)
    • 内容(message: CharField)

このモデルを実際に反映していきます. main/models.pyを開き,次のように編集してください.

from django.db import models
from datetime import datetime


class BlogModel(models.Model):
    date = models.DateTimeField(default=datetime.now)
    message = models.CharField(max_length=256)

これでmodelの環境は整いました. Datetimeの初期値は無くても良いですが,一応default値として現在時刻を入れておきました

ModelFormをつくる

次にさきほど作ったModelからFormをつくりましょう. mainの中にforms.pyというファイルを作ってください

touch main/forms.py

今つくったforms.pyを次のように編集してください.

from django.forms import ModelForm
from main.models import BlogModel
from datetimewidget.widgets import DateTimeWidget


class BlogModelForm(ModelForm):
    class Meta:
        model = BlogModel
        fields = ("date", 'message')
        dateTimeOptions = {
            'format': 'yyyy-mm-dd HH:ii:ss',
            'autoclose': True,
            'showMeridian': True
        }
        widgets = {
            'date': DateTimeWidget(options=dateTimeOptions)
        }

modelからFormを作るために,2行目でmodelとして定義したBlogModelを呼んでます. 3行目では今回使うライブラリを呼んでます. modelという変数にはFormの元となるmodelを設定してます. fieldsではmodelの中でどれをformにするか設定してます. それぞれの変数名はDjnagoの中で決められているのでこのような名前にしてください.

dateTimeOptionsというのはDatetimeWidgetを具体的にどういうものにするか決めてます.

widgetという辞書形式の変数は今回使うライブラリを適用しているところです.

views.pyの編集

まずは次のように編集してください.

from django.shortcuts import render_to_response
from django.template import RequestContext
from main.models import BlogModel
from main.forms import BlogModelForm


def index(request):
    if request.method == 'POST':
        blogmodel = BlogModel()
        blogmodelform = BlogModelForm(request.POST, instance=blogmodel)
        if blogmodelform.is_valid():
            blogmodel = blogmodelform.save(commit=False)
            blogmodel.save()
        return render_to_response('index.html', dict(form=blogmodelform, blogs=BlogModel.objects.all()), context_instance=RequestContext(request))

    else:
        return render_to_response('index.html', dict(form=BlogModelForm(), blogs=BlogModel.objects.all()), context_instance=RequestContext(request))

簡単に解説するとblogmodelの中身と編集用のフォームをこれから作るtemplatesのindex.htmlに渡しています. POSTで飛んできたとき(index.htmlの中で投稿されたときに発生)にいろいろとしているとは思いますが,来た記事を保存して再び元の画面に戻しているだけです.

templatesをつくる

ではtemplatesにindex.htmlを作りましょう.

mkdir main/templates
touch main/index.html

次にさきほどviewで渡した内容を表示してあげるようなhtmlをつくりましょう. 今回は見かけは拘らず,Django-DateTime-Fieldに必要なものだけでつくりました.

前半のscriptやcss,{{ form.media }}などの分は全て必要なのでとりあえず記述しておきましょう.

formの部分では作ったフォームを呼んできています.

{% load static from staticfiles %}<!DOCTYPE HTML>
<html>
<head>
<title></title>
<link href="{% static "bootstrap/css/bootstrap.min.css" %}" rel="stylesheet" type="text/css"/>
<script src="{% static "bootstrap/js/bootstrap.js" %}"></script>
<script src="{% static "jquery/jquery.min.js" %}"></script>
{{ form.media }}
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_table }}
        <input type="submit" value="Tweet" />
    </form>

{% for blog in blogs %}
    <h3>日付</h3>
    {{ blog.date }}
    <h3>つぶやき</h3>
    {{ blog.message }}
{% endfor %}
</body>
</html>

urls.pyの設定

dtwidgetsample/urls.pyを設定しましょう

from django.conf.urls import patterns, url
from main.views import index

urlpatterns = patterns('',
    url(r'^', index),
)

最後の仕上げ

ここまででひとまず全体構成を見てみましょう

.
├── db.sqlite3
├── dtwidgetsample
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-34.pyc
│   │   ├── settings.cpython-34.pyc
│   │   ├── urls.cpython-34.pyc
│   │   └── wsgi.cpython-34.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── main
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-34.pyc
│   │   ├── admin.cpython-34.pyc
│   │   ├── forms.cpython-34.pyc
│   │   ├── models.cpython-34.pyc
│   │   └── views.cpython-34.pyc
│   ├── admin.py
│   ├── forms.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-34.pyc
│   │       └── __init__.cpython-34.pyc
│   ├── models.py
│   ├── static
│   │   ├── bootstrap
│   │   │   ├── css
│   │   │   │   ├── bootstrap-theme.css
│   │   │   │   ├── bootstrap-theme.css.map
│   │   │   │   ├── bootstrap-theme.min.css
│   │   │   │   ├── bootstrap.css
│   │   │   │   ├── bootstrap.css.map
│   │   │   │   └── bootstrap.min.css
│   │   │   ├── fonts
│   │   │   │   ├── glyphicons-halflings-regular.eot
│   │   │   │   ├── glyphicons-halflings-regular.svg
│   │   │   │   ├── glyphicons-halflings-regular.ttf
│   │   │   │   └── glyphicons-halflings-regular.woff
│   │   │   └── js
│   │   │       ├── bootstrap.js
│   │   │       ├── bootstrap.min.js
│   │   │       └── npm.js
│   │   └── jquery
│   │       ├── jquery.js
│   │       ├── jquery.min.js
│   │       └── jquery.min.map
│   ├── templates
│   │   └── index.html
│   ├── tests.py
│   └── views.py
└── manage.py

こんな感じになっていればOKです.

makemigrationsやmigrateをして,起動しましょう

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

ひっかかったところ

  • ValidationでFalseになる
    • YYYY-yy-dd hh:mm:ssという形式であれば無事動きましたが,USの形式などではValidationチェックで引っ掛かることがありました.

まとめ

Django-Datetime-Widgetの使い方を紹介した.

StowをつかってRustインストールしてみた

はじめに

RustというMozillaが開発しているプログラミング言語があります.

http://www.rust-lang.org/index.html

先日,ついにこの言語の1.0アルファ版が出ました.0.11以来使ってなかったので改めてインストールすることにしました.

インストール方法

インストール自体は,ここに記載されているインストールスクリプト(rustup.sh)を叩くのが楽そうです. http://www.rust-lang.org/install.html

しかし,単純にこのまま叩いてしまうと/usr/local以下にインストールされてしまい,アンインストールが面倒だという問題があります.

そこでGnu Stowをつかってインストールを管理する方法を選択しました.

Gnu Stow

Stowはtarballからインストールするときに管理してくれるツールです.

使い方は簡単で,/usr/local/stowというディレクトリをつくって,その中にインストールするパッケージディレクトリを設置するだけです.

やってみる

Gnu Stowのインストール

OSXの人は

brew install stow
mkdir /usr/local/stow

homebrewでstowをインストール,stowで管理するディレクトリをつくるだけです. 作ったディレクトリのなかにtarballでビルドしたパッケージを設置します.

Rustのインストール

stowでrustを管理するためにディレクトリをつくってあげます.

mkdir /usr/local/stow/rust-1.0nightly

僕はrust-1.0nightlyという名前にしました.

つぎにrustup.shをダウンロードします.

wget https://static.rust-lang.org/rustup.sh

ダウンロードしたrustup.shを開いて,286行目の一文を次のように修正します.

valopt prefix "/usr/local/stow/rust-1.0nightly" "set installation prefix"

先程作ったディレクトリを指定するだけです.

あとは

sh ./rustup.sh

これでインストールします.

最後にstowをつかって,/usr/local/binなどで扱えるように設定します.

cd /usr/local/stow
stow -v rust-1.0nightly

これだけです.

こうするとシンボリックリンクが適切な箇所に貼られると思います.

もしrustをアンインストールしたければ

stow -D rust-1.0nightly

とやるだけでシンボリックリンクが削除されて環境を汚すことなくセットアップができます.

まとめ

stowをつかってRustをインストールした.

はてなブログに投稿するスクリプトhapomaをつくってみた

はじめに

このはてぶ自動で2getツールの記事を読んで,はてなAPIを使いたくなりました.

運用厳禁:はてブ自動2getツールを作ってみた - 今日学んだこと

ネタを色々と悩んでいたのですが,今回ははてなブログに投稿したり更新することができるスクリプトをつくってみました.コードの話題は今回はあまりありません(つくってみた自慢ですねw).

HAYASAKA-Ryosuke/hapoma · GitHub

hapomaと言います.HAtenaPOstMAnというつもりでつけました.

setup.pyもまだ作ってないような,途中ですが,基本的な機能は完成したので暖い目で見てください(笑)

内容

まずはざっくりと行ないたいことを決定.

  • 手元にあるmarkdownファイルをはてなブログに投稿したい
  • でも,いきなり投稿するのは怖いので下書きとして投稿したい
  • 投稿したブログは手元にあるファイルを修正して送信すれば勝手に上書きされるようにしたい.

と,ざっくりこんな感じです.

なので,これらを満たす機能としては,

  • はてなブログに手元の記事を下書きとして投稿する機能
  • 一度投稿したブログか新規で書いたかを判別して,上書きか新規投稿か自動で検出する機能

があれば良いと重います.

今回使用したツールとライブラリを以下に示します.

  • ツールやライブラリ
    • Python・・・今回使用する言語
    • LevelDB・・・Google製のKVS
    • plyvel・・・pythonからLevelDBを操作するライブラリ
    • requests・・・urllib2よりも賢いライブラリ
    • requests-oauth・・・requestsからoauth認証を弄るためのライブラリ

LevelDBは投稿した直後やDBファイルが無いときにはてなブログの記事IDと記事タイトルを取得して貯めるためのものです. このときタイトルをKey,記事IDをValueにしてます. こうすることで編集しているファイルのタイトルをlevedbに渡してIDが存在するかどうかで,新規投稿か上書きかを決定するようにしました.

requestsはurllib2を便利にしたライブラリで,これに関係するoauthライブラリも便利に使えそうなので今回採用しました.

OAuthのheaderを見る方法

oauthはキーやトークンを必要とするために,正しいフォーマットで送信できているのか不安になります.

その場合にどうデバッグしたかメモしておきます.

まずはOAuthのフォーマットをチェック

oauth = OAuth1Session(oauth_consumer_key, oauth_consumer_secret, access_token, access_token_secret)
print(oauth.headers)

まとめ

hapomaというはてなブログに投稿するスクリプトを作った話を書いた

このブログはhapomaをつかって送信している.

謝辞

OAuth周りではTwitter上で@nakazyeさんにアドバイス頂きました.

ありがとうございました!