まず,TeX 環境を Emacs で整えようと,以下のサイトを参考にシェルスクリプトを記述し,/usr/local/bin
直下に配置した.
その後,Emacs から C-c t j
によって TeX ファイルをコンパイルしようとすると,以下のエラーが生じた.
1 2 3 4 5 |
|
パスが通っていないっぽいので,下記サイトを参考に exec-path-from-shell
を導入した.
purcell/exec-path-from-shell: Make Emacs use the $PATH set up by the user's shell
EmacsでPATHの設定が引き継がれない問題をエレガントに解決する - Qiita
それでもうまくパスが通っていないように見えた.emacs上から M-x getenv
して PATH
を選択すると,emacs 上の環境変数の内容を確認できる.確認したところ,自分が普段使用している zsh の .zprofile
ではなく,.bash_profile
が参照されていることがわかった.
これは,普段使いは homebrew でインストールした zsh なのだが,OS のデフォルトシェルが bash になっていたためだった.ちなみに,デフォルトシェルは echo $SHELL
で確認できる.
シェルを変更するには chsh
コマンドを使用する.
1
|
|
ただし,homebrew 等でインストールしたシェルを設定するには,/etc/shells
にそれを追記する必要がある.
1 2 3 4 5 6 7 8 9 10 11 |
|
設定後はPCを再起動すること.
その後,無事 TeX ファイルをコンパイルできた.
Terminal の設定で /usr/local/bin/zsh
を起動するようにしていたので,気づかなかった…
tex2img : ghostscript cannot be executed.
ではまった.入力したTeXコードを画像に出力する.TeX2img配布サイト でダウンロードする.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
1 2 3 4 5 6 7 |
|
エラーが出た.
1 2 3 4 5 6 7 8 9 10 |
|
graphics - Can't compile image after upgrading to OS X Yosemite - TeX - LaTeX Stack Exchange に似たようなエラーを確認.どうやら X11 のパスの問題らしい.自分の環境の場合,システム上に X11 が存在しないわけではないので,以下のようにシンボリックリンクを作成することで回避する.
1
|
|
しかし,まだ以下のようなエラーが出ていた.
1
|
|
TeX2img のコマンドライン版の使い方(改訂版) - Acetaminophen’s diary の Ghostscriptのエラー回避 の場所にあった--quick
オプションを用いるととりあえずエラーメッセージは表示されなくなったが,結果がうまく出力されないので,何の解決にもなっていない.
TeX2img (Windows/Mac) の動作の詳細 - Acetaminophen’s diary を参考にしてみると,内部処理は以下のようになっているらしい.
【JPEG/PNG出力(画質優先モード)の場合】
1
2
3
4
5
6
TeX →[platex]
DVI →[dvipdfmx]
PDF →[gs (eps(2)write)でアウトライン化+クロップ]
EPS →[epstopdf (gs)]
PDF →[OS X の APIでビットマップ化+余白付与]
JPEG/PNG
【JPEG/PNG出力(速度優先モードの場合)】
1
2
3
4
5
TeX →[platex]
DVI →[dvipdfmx]
PDF →[pdfcropでクロップ+余白付与]
PDF →[OS X のQuartz API]
JPEG/PNG
さらに,
EPS ファイルへの余白付与は EPS の BoundingBox 情報を書き換えることによって実装されている
とのこと.GhostScript を使っている手順,つまり,eps(2)write
の部分がうまくいってないのではないか?と考えられる.そこでログを見てみると,以下のような記述を発見.
1 2 3 4 5 6 |
|
Error: /syntaxerror in readxref
とのこと.再現可能かどうか確かめてみるため,適当にtest.pdf
を用意してターミナルから以下を実行した.
1 2 3 4 5 6 |
|
実行が終了しなかったので中断した.解像度を下げて実行してみる.解像度の指定は-r
の部分.
1 2 3 4 5 6 |
|
実行できた.前回は解像度を高くしすぎたために実行に時間がかかっていただけのようだ.とりあえず,動くことはわかった./usr/local/bin/gs
は実行できるのでパスの問題ではないし,こうして動きもしたわけだから GS が悪いわけでもなさそう.
さて,じゃぁ一体なんだよ!となるわけだが.[hylafax-users] /syntaxerror in readxref - Google Groups を見てみると,先ほどのエラーはGSがPDFを扱うときに出力されるエラーらしい.GSのバージョンを最新にしてくれとかいてある.
バージョンを調べる.
1 2 3 |
|
ん?古い…Homebewでインストールした GhostScriptは…?
1 2 |
|
バージョンがちがう…
homebrewでインストールした以外にすでにghostscriptが入っていたのだと思われる.finderで検索をかけるとmacportsとsmにそれらしきものがヒット.おそらくやっていたのだろうけど覚えがない…MacTeXによるインストール時に一緒にインストールしてしまったのかな?
とりあえず,元のgsを削除し以下のようにシンボリックリンクを貼り直す.
1
|
|
確認.
1 2 3 |
|
無事出力できました.
]]>El Capitan に 0 から TeX 環境を導入する人用
Yosemite 時代から TeX を導入しており El Capitan になった人用
また,El Capitan から TeX 関連プログラムへのパスが /usr/texbin
ではなく /Library/TeX/texbin
に変更になっている.
コンピュータ科学者 Donald E. Knuth によって生み出された文書整形システムで,特徴は以下.
文書作成の流れは以下.
TeX は組版エンジンであり一種のプログラミング言語であり,言語処理系である.自己拡張性を持つ.単一のアプリケーションではなく,プログラムやファイルの集合体.
TeX だけでは組版が難しかったため,プログラミング言語でいうライブラリにあたるものが必要となった.そこでまず Knuth 自身が必要最低限の機能を追加したマクロパッケージ plain TeX を作成した.
そこからさらに論文,レポート作成を簡単にできるよう拡張したのが,Leslie Lamport による LaTeX である.
LaTeX はパッケージ(スタイルファイル)の読み込みにより機能拡張が容易になっている.パッケージはユーザ自身が作成することもでき,これを集めたサイトがCTAN: Comprehensive TeX Archive Networkである.
また,TeX や LaTeX は単一のアプリケーションではなく,膨大な数の実行形式ファイルやマクロ等の集合である.これらをパッケージングしたTeX/LaTeX ディストリビューションが TeX Live である.さらに,Macユーザ用に便利な周辺ツール等もまとめてパッケージングしたディストリビューションが Mac Tex である.
TeXには以下のようなものが含まれる.
以上の集合体がTeXである.また,マクロやフォントファイル等は開発者が個々に開発している.そこで,これらの機能をまとめて用いるために,これらをうまく組み合わせて調整した配布物を,TeXディストリビューションという.
海外 | 国内 | |
---|---|---|
UNIX用ソース | teTeX,TeXLive | ptetex3,ptexlive |
Windows用実行形式 | TexLive,MiKTeX,proTeXt | W32TeX |
現在は日本でも TeXLive が主流.また,TeX Liveはtlmgr
というユーティリティで,オンラインアップデートが可能.
TeX エンジン.すなわち TeX の処理系とは, TeX を入力すると DVI やら PDF が出てくるプログラムのこと.
Tex.原点.モダンな TeX ディストリビューションの標準エンジンとして使われている.プレーンなフォーマットのみ仕様する場合,これが標準エンジンとして仕様される.最終的な更新は1990年のバージョン3であり,別名を TeX90 といった.その前のバージョン2は Tex82 という.前者は 8bit,後者は 7bit を入力に仕様していた
e-Tex.1990年代に登場.Tex--XeT
と呼ばれる双方向植字拡張(右から左へ書く文字への対応),レジスタ数拡張,TeXプログラミングを容易にする様々な機能を追加した.e-TeX の各条は新しいエンジンの多くに取り入れられているが,e-TeX 自体は広く使われているわけではない.ちなみに,LuaTeX は双方向植字に TeX–XeT を使用しておらず,これに関わらない部分についてのみ e-TeX のプリミティブを採用している.
pTeX.日本語を扱うための機能を実装した.日本語と欧文の混在や縦書き組版に対応している.
e-pTeX.e-Tex + pTeX.
upTeX,e-upTeX.pTeXの拡張で扱える日本語は,JIS第一,第二水準までであり,Unicode には対応していない.また,TeX の文書を UTF-8 で記述した場合に対応できない.platex を使用する際,nkf
などで TeX を EUC に変換してから pTeX に捩込む案があり,--kanji=utf8
オプションで実行できる.しかし依然として未収録の文字は扱えない.OTFパッケージもあったが微妙なので,内部文字コードを Unicode にしようという試みが行われた.これが upTeX.e-TeX とマージされたものが e-upTeX.
pdfTeX.e-Tex にPDFに関係するプリミティブの数々を追加したもの.pdfTeX は出力形式として dvi と pdf の両方をサポートしている.一番の特徴は,dvi を介さずに pdf を直接出力すること.また,現在の絶対値取得(\pdfsavepos
)などの便利な機能も存在する.その他にも,PDFに影響を与えるプリミティブな命令が用意されているのがいいところ.例えばリンクの出力や,複雑な図の作成が行える.pdfTeX はモダンな TeX システムのデフォルトエンジンとしてよく使用されている.
XeTeX.e-TeX に対し,入力として UTF-8 をサポートし,さらにシステムフォントにアクセスできるようにしたもの.これまでは,「DVIファイルを出力し,フォントに関してはDVIを処理するアプリに任せる」という方針だった.e-pTeX などではフォント埋め込みする際には,TeX川の設定の後,dvipdfmx の設定をする必要があった.XeTeX はこのデバイス日依存の DVI を生成することを諦めた.内部的には XDV という DVI 拡張を経由し,xsvipdfmx と言う dvipfmx の改造品を使用してPDF を生成する.
LuaTeX.もともとは pdfTeX のバージョン2を目指していたが,現在は独立したアプローチをとっている.e-TeX の拡張と,UTF-8 の入力,そして Lua スクリプティングエンジンを採用している.pdfTeX のプリミティブをいくつか持つが,代わりに Lua スクリプトを使用して実現しているものもある.LuaTeX は Lua を使用してシステムフォントにアクセスできる.Omega と Aleph のアイデアを採用している.
Introduction to LaTeX
なぜ TeX Live なのか
異様な LaTeX の話 - マクロツイーター
Mac OS X にTeXをインストールする初心者向けメモ
tex core - The differences between TeX engines - TeX - LaTeX Stack Exchange
日本人の知らないTeX - TeXの過去・現在・未来 - yato.pdf
TeX処理系御伽話 - Qiita
Donald E. Knuthは,SRIインターナショナル(世界で最も大きな研究機関の一つ)に所属していた.1974年に投稿論文の執筆を行っていたが,「論文の出来上がりがあまりにもひどく,見るに堪えなかった」ために執筆を中断する.その後1977年から組版についての研究を開始.自分自身で心ゆくまで組版を制御するためにTeXの開発を行った.伝統的な組版やその関連技術に関して幅広く調査を行い,その調査結果が反映され,TeXは商標品質の組版ができる柔軟で強力な組み版システムとなった.
plain TeXは,プロが使うと非常に便利なシステム.1984年,TeXの仕様書とも云うべき「TeXbook」が出版された.ここには様々なコマンドが記載されていたが,コマンドの使用は多岐に渡るため,一読しただけでは理解できない部分が多かった.
そこで登場したのがLaTeXである.TeX素人であっても,ある程度LaTeXの規則を学習すれば,TeXを使えるようになる.
TeXはフリーソフトであり,ソースコードも公開されているので,誰でも改良を加えることができる.改良版の配布も,TeXと区別できるような別名をつけさえすれば許される.
そのため,TeX/LaTeXには多数のバリエーションが存在する.しかし,TeX/LaTeXは単一のアプリケーションではない.そのため,個々のバリエーションも周辺ファイルと一揃えにして公開しなければならない.これは非常に効率が悪い.そこで,1992年にCTANの公開がスタートする.これにより,TeX/LaTeX関連のアーカイブを効率良く入手できる.
2006年まではteTeXと呼ばれるものがメジャーだった.コンパクトで,フリーなプログラムのみを含み,徹底的なデバッグが行われていたからである.
しかし,2006年5月にメンテナのThomas Esserはメンテナンスを終了し,TeX Liveの使用を推奨した.TeX Liveは1996年にスタートしたディストリビューションであり,巨大なアーカイブを有していた.そこから,debian GNU/LinuxやFedora Linuxのような大手LinuxディストリビューションがTeX Liveをdefaultとして採用するようになり,世間の標準もTex Liveに移行した.
年号 | 概要 |
---|---|
1974 | Knuth が論文投稿を中断 |
1977 | Knuth が組版の研究を開始 |
1980 | TUG(TeX Users Group)発足 |
1984 | TeXBook出版 |
1992 | CTAN(Comprehensive Tex Archive Network)ができる |
~2006 | teTeXがメジャー |
2006/5~ | teTeX のメンテが終了し,TeXLiveが推奨 |
年号 | 概要 |
---|---|
1980s | 主流は以下<\br>- NTT jTeX/NTT jLaTeX (斉藤康己 in NTT) - pTeX/pLaTeX (ASCII Media Works) *1 |
2004 | ptetex3(teTeX-3.0へのパッチ)が土屋展之による公開 UNIX系環境に日本語TeX/LaTeXを導入しやすくなった |
2006 | teTeXが終了したが,主流はptetex3 |
2007 | ptexlive(TeXLiveへの日本語パッチ)が公開されたが,主流はpetex3 *2 e-pTeX, upTeX/upLaTeX の登場 |
2010 | TeXLive2010 にpTeX/pLaTeXが収録され,babelも収録 texencにより複数日本語文字コードに対応 *3 |
2011 | 日本語フォントとしてIPAフォントがマージ babelのjapaneseパッケージがマージ |
2011/11 | OTFパッケージがマージ |
2012/2 | japanese-otf-uptexがマージ |
2014 | upTeX/upLaTeXが収録 |
*1 : pTeX も jTeX もマルチバイト文字への対応を行っていた.pTeX は 16bit 以上の文字コードを扱えたが,オリジナルの TeX では用いられていなかったため,既存プログラムの多くは pTeX が出力する DVI を処理できなかった.jTeX は複数の 1byte 文字セットに分割することで対応しており,英語版からの変更が小さく,移植も比較的容易となっている.現在では以下の理由から pTeX の使用者が多い
*2 : babel という,他言語処理を実現する強力な環境がなかったためと言われている.
*3 : 以下の理由から普及しにくかったと考えられる.2011年頃から導入され始めた
これらは2011年頃から導入が開始される.現行のTeX Liveは,特にパッチを当てずとも日本語を問題なく扱うことができる.babelも扱えるし,レジスタや文字コードの問題,OTFパッケージの問題も解決されている.
TeX Wiki CTAN
TeX ディストリビューション †
なぜ TeX Live なのか
TeX Wiki TeXの歴史
Mac OS X Yosemite(ver 10.10.1)で環境構築を行った場合,まとめ.必要なものは以下
MacTeX は OS X 用の TeXディストリビューション.TeXを使うための標準的なファイル一式をまとめたもので,TeXLive,TeXShop,GhostScript 等が含まれる.今回は主に TeXLive のインストールのために利用する.
まず,MacTeXをダウンロード.容量が2GB以上あるので結構時間がかかる.
インストール時に,カスタムで以下の二つは外しておく.GhostScript は homebrew 等他のパッケージ管理ツールで管理するのが楽らしいので後で個別にインストールする.
また,MacTeXには様々なソフトウェアが含まれるが,個々のソフトウェアは更新されているので,MacTeXを最新の状態に更新しなくてはならない.以下のコマンドを入力.結構時間がかかるので注意.これは定期的にやったほうがいいらしい.
1
|
|
パスが通っていない場合は,echo $PATH
で/usr/texbin
が含まれているか確認する.
TeX Wiki Mac
OS X MavericksにTeX環境を構築した記録 - h_uenoharaのブログ 上ノ原秀晃(政治学)の研究メモ
tlmgr update できなかった - 金魚亭日常
多重TEXMFツリー †
GhostScript は,PostScript/Portable Document Format(PDF) インタプリタ.PostScript/PDF ファイルを読み込み,画面,プリンタ,その他様々な形式のファイルに出力できる.
homebrewを使って管理したほうが楽らしい.homebrewが何かわからない場合 or 使いたくない場合はググって導入するか他の方法を考えること.
1
|
|
TeX Wiki Ghostscript
GhostScriptあれこれ
Ghostscript についてちょっとだけ
デフォルトのフォントだと,明朝太字が太字にならない(自分の環境では代わりに?ゴシック体で表記された).また,PDFには フォント名だけが書き込まれた形式 と フォントデータをPDF内に持っている形式 がある.前者の場合,他所に持って行って印刷した場合等に文字化け等の不具合が発生する可能性がある.後者のような形式をフォント埋め込み形式という.
pdfにフォントが埋め込まれているかを確認する方法はここが参考になる.基本的に方法としては以下の三つ.
今回はpdffonts
コマンドを用いる方法を紹介.pdffonts
はxpdfという,X Windows用のpdfビューワの一部.まずはxpdfをhomebrewでインストールする.
1
|
|
使い方は以下.
1
|
|
使用例.emb欄でyesのものはフォントが埋め込まれている.和字のフォント(Ryumin-Light,GothicBBB)が埋め込まれていない.
1 2 3 4 5 6 7 8 9 10 |
|
和字フォント(IPAフォント)を埋め込むと以下のように表記が変わる.
1 2 3 4 5 6 7 8 9 10 |
|
エラーが出る場合は以下のサイトを参考に直すこと.
pdfにフォントが埋め込まれてるか確認するコマンドpdffonts
LaTeX(DVI)から作成する PDF のフォント埋め込み
TeX Liveのインストールディレクトリは以下.
1
|
|
TeX Live 2014 をインストールした場合,2014
というディレクトリとtexmf-local
というディレクトリがある.TeX Liveの改変を行う場合,texmf-local
を変更した方が良い./usr/local/texlive/2014
内を改変すると,tlmgr
によるオンラインアップデートによって改変部分が消えてしまう可能性がある.また,TeX Live 2015が出た時に今まで行った改変をやりなおすのはかしこくない.
/usr/local/texlive/texmf-local
に改変部分を記述しておけば,もしもの時には/usr/local/texlive/2014
をばっさり削除し再インストール等で不具合に対処することも可能になる.便利.
いくつかのフォントはセットアップなしで使用できる.使用できるフォントは以下のコマンドで確認する.
1 2 3 4 5 6 |
|
noEmbed
は何も選択していない場合に表示される.
フォントをインストールする場合,インストール先は以下となる.
1
|
|
任意のフォルダを作成したりして,フォントの実態(.ttyとか.ttcとか)のシンボリックリンクをおけば良い.
例として,ヒラギノを使いたい場合は以下のようにする.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
TeX/LaTeXではおなじみ(らしい).ls-Rデータベースの更新.以下のコマンドで行う.
1
|
|
フォントを用いることができるように設定を行う.しかし,LaTeX上でフォントを扱うソフトは複数存在する.DVIファイルの処理を行うだけでも…
… 等があり,ひとつひとつにフォントの設定を行うのは困難である.
そこで,いくつかのフォントを扱うソフトに対して統一的に設定を行えるupdmap
というソフトがある.これはユーザ個人にのみ設定を反映させる.TeX Liveのシステム自体に設定を反映するにはupdmap-sys
を用いる.
現行のTeX Liveにはupdmap-sysのラッパーであるperlスクリプトkanji-config-updmap(-sys)
が収録されている.これを使用することで,簡単にデフォルトフォントセットを設定することができる.
システムに収録されているデフォルトフォントセットは以下にある.
1
|
|
ここにあるotf-*.map
を読み込み,システムのデフォルトセットとして登録することができる.フォントセットを設定するには,頭のotf-
を取った残りの部分を指定する.例えば,ヒラギノをセットしたい場合は以下.
1 2 |
|
逆に,埋め込みをやめたい場合は以下.
1
|
|
kanji-config-updmap
はユーザ個人にしか反映されない.システム全体に設定を行う場合はkanji-config-updmap-sys
を用いる.
日本語フォントのセットアップ
Windows の TeX Live 2013 でヒラギノフォントを埋め込む方法
MacTeX 2014 - 一歩前進
教授でもできる、TeXShop + MacTeX /UpTeX でのヒラギノ フォントの埋め込み
導入&初期設定
おまけ.SublimeText3で作業環境を整えた.CommandPalette(⌘⇧P
)からInstall Package
を選択.LaTexTools
をインストールする.
LaTexToolsの設定を変更する.設定ファイルは以下に存在する.
1
|
|
20行目前後に以下があるのでコメントアウト.
1 2 3 |
|
以下を記述.
1 2 3 4 5 6 7 |
|
エラーが出る場合がある.
1
|
|
その場合はここを参考に直す.
これで,コンパイルしたい場合は.texファイルを開き⌘B
押下でOK.ちなみに,upTeXを利用しているっぽい.
【2014-3-12以降版】Mac Sublime Text2 or Sublime Text3 で Tex 導入の初歩から - みずぎわブログ
文書クラスとは,文書の大体の形を決めるもの.
1 2 3 |
|
各々,[j]がつくとpTeXを用いることができる.
[uj]がつくとupTeXを用いることができる.
upTeXは,[j]をつけてオプションに[uplatex]を指定しても使用できる.
pTeXは日本語を利用できるようにしており,upTeXはそれに加えてUnicodeを用いられるようにした上位互換.
a4paper,b5paperはLaTeX2eからできた新しいサイズ.語尾がeのものは欧米版,jのものはpTeX.
paperは上下左右の余白が広いので,本文領域を広くしたいのであれば,a4jやb5jを用いると良い.
pLaTeXからupLaTeXへの乗り換え方
なぜ TeX Live なのか
LaTeX文書クラス
a4paper と a4j および b5paper と b5j
LaTeX の概要
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
TeXに画像を貼り付ける場合,画像のBB(BoundingBox)情報を指定する必要がある.単位は bp(big point) もしくは Postscript point という.
1
|
|
BB情報を自動生成し,ファイルに書き出すことができる.用いるコマンドはextractbb
.
1
|
|
これによりBB情報が記述されたファイル(.xbb)が生成される.
いちいちターミナルから生成するのが面倒な場合,TeX Live を用いているのなら,extractbb を自動的に起動し,.xbbファイルを自動生成させることができる./usr/local/texlive/texmf-local/web2c/texmf.cnf
1 2 3 4 5 6 |
|
以下のコマンドでデータベースを更新し,設定を反映させる.
1
|
|
以下のようなエラーが出た場合は,改行を加えることで回避する(これが正しい対処かどうかはわからない).
1
|
|
これで画像フォルダもスッキリする.すばらC.
参考サイトみよう.
Latexにプログラムっぽいフォントでソースコードを載せる簡単な方法
TeX Live 2013より,dvipdfm
が使用できなくなった.以前は以下のように記述していたが…
1 2 |
|
これからはdvipdfmx
を使う必要があるため,以下のようにする必要がある.
1 2 |
|
これに伴い,.bbファイルではなく,.xbbファイルをが必要となった.ちょっと調べてebb
コマンド(.bbファイルを生成する)を用いて画像を扱っていたらコンパイルがうまくいかなかったので,道理で...
texmf.cnf への extractbb などの追加 †
画像ファイルの取り扱い
【2014年版】『MacTex 2013』と『Sublime Text 2』でpLaTeX環境をつくる
パッケージの実態はテキストファイルで,コマンドの定義が記述されている.拡張子は基本的には".sty".
パッケージファイルの場所は,LaTeXシステム一式をインストールした場合は…
TeXLiveの場合
1
/usr/local/texlive/2014/texmf-dist/tex/latex/tools
W32TeXの場合は知らない.Windowsでは以下らしい.
1
c:/w32tex/share/texmf-dist/tex/latex/tools/multicol.sty
古いコマンドを使わないほうがいいらしい.以下を用いて発見しよう.
1
|
|
研究室のゴミ当番表がアナログだったので,去年から導入した Slack を通して自動的に担当を割り振り&通知する bot を作った.
成果物は↓
tasuwo/GomiManBot: GomiMan slack bot written in coffee script with hubot.
これから実際に使ってみてバグが見つかり次第修正していく予定.
英語力がゴミなのでおかしいところ発見次第修正していく予定.
hubot + slack bot + heroku に関するサイト量は飽和状態であまり書く気しなかったのだけど,中には「エラーは持ち前のスルースキルで無視します!」みたいな記事もあってげんなりしたので,何を参考にしたのかだけも一応書いておく.
導入については以下の記事を参考にした.
Slack で Hubot を使えるようにする - Qiita
Slackと連携させたHubotに毎朝今日の予定をお知らせしてもらう - Qiita
公式ドキュメントは以下.世に出回ってる hubot の記事は大抵古くて今では不要な手順が含まれていたりするからこちらを参考にするのが確実.
また,無料版の heroku だと 1日6時間の間sleepさせる必要があるので,うまくやる.
起き続けさせるためには hubot-heroku-keepalive,寝たのを起こすためには何らかのアドオンを使用する.
雑記帳@iimuz by iimuz
Heroku 上で動く Hubot をうまく休ませる - Qiita
アドオンは shceduler を使用した.
Hubot は Github 社が製作した bot 作成用のフレームワーク.
Node.js + CoffeeScript で書かれており,オープンソースである.
アダプターによって異なるチャット(Slack とか Chatworks とか)に対応できる.
AWS という IaaS 上に構築された PaaS.以下用語説明.
Heroku は Web アプリを作成した時に,Git を使用して簡単に公開できる.
最初は Ruby のみだったが今では対応言語も多い.
ビルドパックを使用することで未対応の言語についてもデプロイが可能.
以上です.
]]>!!注意!! : 筆者はPython初心者です.コードの表現等は適切でない場合があります…おかしな部分がありましたらぜひコメントで指摘をお願いします…
以下のようなテーブルが存在した時,その内容を抽出してDBに格納したい.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
上記のHTML記述は以下のように描画される.
日付 | 記録 | 担当 | 題目 |
2XX5/12/24 | 記録者名 | 担当者名1 | 論文情報1 |
担当者名2 | 論文情報2 | ||
2XX5/12/25 | 記録者名2 | 担当者名3 | 論文情報3 |
担当者名4 | 論文情報4 |
問題は,rowspan
オプションを使用しているため,日付&記録とtrタグが1:1になっていないという部分.調べてみると,各trタグがもつtdタグと,rowspanオプションを持つtdタグをあらかじめ保存しておき,後者の情報から前者を更新する方法があるらしい.しかし,今回はとりあえず論文情報だけ取得できればよかったので,align
オプションを持つtdタグのみを抽出する.
また,論文情報は以下の形式をとる.ここから各種情報を抽出してDBに格納したい.
1
|
|
ここでの問題は,,
や:
が全角の場合と半角の場合が入り混じっている(!?)という部分(各論文情報間だけでなく,なんと一つの論文情報内に全角/半角が混ざっている場合もある…).みんなが適当に更新したから仕方ないね…さらに,論文誌名やVol.,No.等はあったりなかったりするので,今回はとりあえず著者名と題目のみ取得する.
手順としては以下のようになる.対象ページはBasic認証が必要なので対応する.
ライブラリは簡単そうだったのでrequests
を使用した.Basic認証を行うためには引数でauth
を指定する.
1 2 3 4 5 6 7 8 9 10 |
|
apparent_encoding
を取得したデータのencodingに設定し直しているのは,requests
が正しくエンコード情報を取得してくれない場合があるかららしい.さらに,データに含まれるテキストを正しくエンコードすると,日本語を文字化けさせずにデータを取得できた.
[Python]requestsが正しくエンコード情報を返してくれない場合は apparent_encoding を使うとよいかもしれない | aoshiman.org
ライブラリはBeautifulSoup
を使用した.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
基本的には,find_all
でタグを検索し,has_attr
で指定オプションを持つかどうかを判定する,という流れ.これで論文情報の文字列群は取得できる.
論文情報は執筆者名:論文情報
の形式で区切られており,さらに論文情報は論文題目,その他の情報,...
のような形式で区切られている.さらに,:
及び,
は半角と全角が混在している.また,論文題目に:
が含まれる場合も存在するし,論文題目以外の論文情報には抜けや漏れが存在する可能性がある.
そこで,以下のように分割処理を行う.
:
(半角/全角)で分割し,執筆者情報と論文情報に分割する,
(半角/全角)で分割し,各執筆者の除法を取得する,
(半角/全角)で分割し,論文題目のみ取得する文字列を複数のデリミタで区切る,もしくは指定回数のみ分割するには,re
モジュールを使用して以下のようにする.
1 2 |
|
デリミタ群をリストで渡したかったので,以下のような関数を作成した.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
これを使用して,論文情報の文字列から著者情報と題目情報を抽出する関数を作った.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
scholar_info_str
が15より小さいか比較している部分は,nbspとか[未登録]みたいな文字列を取得してしまった際に無視するため(よくない).
最終的なコードは以下.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
|
本当はDBに格納するところまでやりたかったけど,今回はここまで.
]]>stream を使用しない場合のデータのよみ出しは,read_block()
というシステムコールによって以下のように行える.
1 2 |
|
上記では,hello.c
の先頭から32byte目から256bytes分読み込まれる.つまり,固定の範囲(ブロック)でデータにランダムにアクセスできる.
上記方法は,扱う対象がメモリやハードディスク上であれば同様の処理で十分だが,例えばキーボードからの入力等を読み込む場合には適さない.前者のようなデバイスを block device .後者のようなデバイスを character device という.
2つのデバイスを同じシステムコールで扱うためには,使用するシステムコールを character device に合わせておけば良い.ここで使われている抽象化が stream である.
stream の良いところは,供給元と受け手の転送量の違いを吸収できる部分.供給元は一度に100byteのデータを送信したいが受け手は一度に10byteしか受け取れない場合, stream は余った90byteを一時的に保存できる.
stream を使用したデータのよみ出しは以下のように行える.open システムコールによって OS によみ出し開始を通知し,同時に stream の識別子である file descriptor を得る.それ以降は file descriptor を使用して read,write システムコールによって読み書きを行い,close によって終了する.
1 2 3 4 5 6 7 8 |
|
TCP/IPによるネットワーク通信も,結局はデータのやりとりなので, stream の概念を流用できるとわかりやすい.しかしそのまま適用はできなかったので,特別な stream として socket を定義した.socket は通常の stream と異なり,作成時には open ではなく socket システムコールを使用する.また,作成時の処理が多少複雑になっている.
TCPによる通信では以下の約束事がある.
TCP通信用の socket の作成方法は以下の通り.
1
|
|
第一引数はアドレスファミリを表している.アドレスファミリとは,socket が使用するアドレス体系のこと.よく使用されるのは以下.
アドレスファミリ | 内容 |
---|---|
AF_INET | IPv4用 |
AF_INET6 | IPv6用 |
AF_UNIX | ローカルなプロセス間通信用 |
AF_PACKET | デバイスレベルのパケットインタフェース |
第二引数はソケットタイプを表している.ソケットタイプはソケットの性質を表しており,Linuxで使用可能な代表的なものは以下.
ソケットタイプ | 解説 |
---|---|
SOCK_STREAM | 順序性,信頼性を備え双方向接続された byte stream を提供する |
SOCK_DGRAM | データグラム(接続,信頼性なし,固定最大長メッセージ)をサポートする |
第三引数は使用するプロトコルを表す.0にしておくとデフォルトのものが使用される.基本的には上記二つの組み合わせによって通信方式が決定される.例えば,以下のように.
アドレスファミリ | ソケットタイプ | 通信方式 |
---|---|---|
AF_INET | SOCK_STREAM | IPv4 + TCP |
AF_INET6 | SOCK_DGRAM | IPv6 + UDP |
クライアントとサーバがそれぞれ以下の手順でシステムコールを呼び出し,通信する.クライアントサーバモデルは,同期方法が非対称的であり,サーバ側とクライアント側でプログラムが異なる.これは電話の呼び出し方式と似ている.
No | Client | Server |
---|---|---|
1 | socket(ソケット生成) | socket(ソケット生成) |
2 | bind(ポート指定) | |
3 | listen(待ち受け) | |
4 | accept(接続待ち) | |
5 | connect(ソケット接続要求) | |
6 | send(送信) | |
7 | recv(受信) | |
8 | send(送信) | |
9 | recv(受信) | |
10 | shutdown(切断) | shutdown(切断) |
11 | close(ソケット切断) | close(ソケット切断) |
Client 側は socket 作成後,connect で同期を行う.この時,通信相手のサーバを引数(host名,port番号)で指定する.
Server 側は socket 作成後が多少複雑.socket は作成時点ではアドレスが割り当てられていないので,bindによってアドレスを割りあてる.この操作は伝統的に「ソケットに名前をつける」と呼ばれる.
ここでいうアドレスは,接続に必要なネットワーク層レベルの情報を保持する構造体として定義されている.保持する情報と定義は以下の通り.
1 2 3 4 5 6 7 8 9 10 |
|
bind 後,socket を passive socket(接続待ちソケット),すなわちサーバ側の socket であることをOSに通知する.ここでいう passive socket とは,accept による接続要求を受け付けるのに使用するソケットのこと.accept では passive socket から接続要求を取り出し,それを元に接続済みソケットを作成し,その socket を参照する新しい file descriptor を返す.
なぜわざわざ passive socket を用意しているのかというと,通常サーバに対してクライアントは複数存在し,その要求をさばくためには接続要求をためておく stream が必要であるため.
通信終了時には close 処理を行うが,多少注意が必要.sockt は送信データが正しく受信したことを確認しないと破棄されないので,close しても即座に破棄はされない.一般には,サーバよりも先にクライアントを close すればよい.サーバ側から強制的に close したい時には,close の直前に以下を呼べば良い.
1
|
|
もしくは bind の前に以下を設定する.
1 2 |
|
setsockopt
は,与えられた socket のオプションを設定するもので,以下のように定義されている.
1 2 |
|
よく使われるオプションは SO_REUSEADDR
であり,これを設定することで再度同じポート番号で bind できる.
ネット上のいろいろを参考に TCP サーバを C++ で書いた.C++は全然書いたことない初心者なのでひどいコードになっているかもしれない…飽くまで学習用なので,あしからず.
Server,Client の順で起動し,サーバ側から文字列を送信できる.実行結果は以下のような感じ
Lecture Notes
setsockopt - 車輪のx発明 ~B.G's Blog~
Linuxネットワークプログラミング : あきみち : 本 : Amazon.co.jp
socket(2), bind(2), listen(2), accept(2) - kotaroito's notes
LinuxにおけるTCPソケット通信を利用したプロセス間通信(C++) - MyEnigma
helm+helm-gtags もしくは ggtags を使う.
自分は helm-gtags を使うことになるだろう.
プロジェクトのルートディレクトリで gtags コマンドを実行すると,以下のファイル群が生成されるはず.
1 2 3 4 |
|
それぞれ以下の情報を保持している.
作業を快適にするために把握しておくべきEmacsにおける基本操作は以下
コマンド | コマンド名 | 概要 |
---|---|---|
C-M-f | forward-sexp | 閉じカッコの前に行く |
C-M-b | backward-sexp | 閉じカッコの後ろに行く |
C-M-k | kill-sexp | 閉じカッコ内を削除する |
C-M- |
mark-sexp | 閉じカッコ内を選択する |
C-M-a | beginning-of-defun | 関数の前に行く |
C-M-e | end-of-defun | 関数の後ろに行く |
C-M-h | mark-defun | 関数を選択する |
Imenuを使用する
(setq-local imenu-create-index-function #'ggtags-build-imenu-index)
moo-jump-localを使用する
コマンド | コマンド名 | 概要 |
---|---|---|
M-. | ggtags-finde-tag-dwim | ・定義にポイントしていれば参照先を表示する ・参照にポイントしてれば定義を表示する ・include ヘッダーをポイントしていればそのヘッダーを表示する ・その他の場所であれば定義,参照一覧が表示され,絞り込みができる |
M-, | pop-tag-mark | ジャンプ元へ戻る |
M-n, M-p | 候補内移動 | |
M-g s | 候補内検索 |
コマンド | コマンド名 | 概要 |
---|---|---|
M-. | helm-gtags-dwim | ggtags-find-tag-dwim と一緒 |
M-, | tags-loop-continue | pop-tag-mark と一緒 |
C-j | helm-gtags-select | 空白部分で M-. するのと一緒.定義や山椒を一覧から絞り込み&ジャンプできる |
ggtags-find-reference, ggtags-find-tag-dwimを使う
コマンド | コマンド名 | 概要 |
---|---|---|
C-c g r | helm-gtags-find-rtag | ・関数内で呼び出したら,その関数についての参照先を検索する ・関数名上で呼び出したら,参照先のリストを表示する ・変数名にポイントしていたら,なにもしない |
C-c g s | htlm-gtags-find-symbol | 変数名ポイント時に参照元を検索する |
C-c g a | htlm-gtags-tagas-in-this-function | 現在の関数が参照する関数一覧 |
ggtags-find-file
helm-gtags-find-files
正直Projectile使ったほうが良いとのこと.
ggtags-view-tag-history(C-c g h)
helm-gtags-show-stack
ソースツリーを見れるパッケージ.ただのソースツリーではなくて,戻り値や関数なども一覧できるのが便利っぽい.
コマンド | 操作 |
---|---|
SPC | 子ノードを開く |
RET | ノードを別ウインドウで開く |
U | 親ノードへ移動 |
n,p | ノードを上下移動 |
M-n,M-p | 現在の階層内でノードを上下移動 |
b | Speedbarのバッファリストに戻る |
f | ファイルリストに戻る |
Speedbarを便利にするパッケージ.
C-x 1
でSpeedbarを除くすべてのウインドウを削除するC-x o
でSpeedbarに移動するのを防ぐ(sr-speedbar-skip-other-window-pをtにする)company-mode を使う.company-mode はEmacsのための補完フレームワーク.
1
2
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
コマンド | 操作 |
---|---|
M-n,M-p | 候補移動 |
RET,TAB | 候補決定 |
C-s,C-r,C-o | 候補検索 |
M-(数値) | 候補簡易選択 |
選択中候補のドキュメントを表示 | |
C-w | 選択中候補のソースコード表示 |
company-backends
で候補に使用するリソースを指定する.
C言語でcompanyの補完を利用するためには,以下を記述する.
1
2
3
(delete 'company-semantic company-backends)
(define-key c-mode-map [(tab)] 'company-complete)
(define-key c++-mode-map [(tab)] 'company-complete)
上記の設定では,company-semantic
を削除している.理由は後述.company-semantic
についてはCEDITの項で詳しく説明する.
companyの補完として,以下の二つが働く.
補完候補の取得のためにclang
を使用する.プロジェクトではなく,ヘッダファイルによって補完を行う.デフォルトではcompany-clang
はcompany-semantic
のサブセットであるため,上記設定を行っていれば他に特別な設定はいらない.
上記せて血でcompany-semantic
を削除したのは,そうしないとcompany-complete
がcompany-clang
ではなくcompany-semantic
を使用してしまうため.これは,company-backends
内の優先度がそうなっているため生じる.
補完候補をプロジェクト内から取得するためには,.dir-locals.el
をプロジェクトルートに配置する必要がある.
1 2 |
|
helmを使っているなら,C-x C-f
によるファイル検索中に,対象ファイル選択状態からC-c i
によって絶対パスを挿入できる.
nil
を指定すると設定をすべてのサブディレクトリ,ファイルに適用し,non-nil
であれば設定を適用するメジャーモードを指定できる.company-clang-arguments
はインクルードパスを指定するリストである.
GNU Global
のGTAGS
から補完候補を取得する.プロジェクトによる補完を行うことができる.
プロジェクト内のヘッダーを補完したいなら,company-c-headers
を使用する.以下のようにcompany-backends
に追加すれば良い.
1
|
|
C++でヘッダーの補完を行いたいならば,パスを追加する必要がある.company-c-header
はシステムのインクルードパスとして/usr/include/
と/usr/local/include/
しか含んでいない.例としては以下のように追加する.
1
|
|
CEDETはCollection of Emacs Development Environment Toolsの略称.CEDETのデメリットは,Emacs Lispで書かれているため,Emacsのパフォーマンスに影響すること.23.2以降のEmacsにはマージされているので,インストールの必要はない.
最新版は以下のようにダウンロードすれば良い.
1
2
3
4
5
$ git clone http://git.code.sf.net/p/cedet/git cedet
$ cd cedet
$ make # wait for it to complete
$ cd contrib
$ make
Emacs からロードする.
1
2
(load-file (concat user-emacs-directory "/cedet/cedet-devel-load.el"))
(load-file (concat user-emacs-directory "cedet/contrib/cedet-contrib-load.el"))
Semantic
は,ソースコードパーサを利用して構文を考慮した補完を行ってくれるパッケージ.
1 2 3 4 5 6 7 |
|
semantic-mode
Semantic-modeでは,Emacsは現在のバッファをパースする.シンボルにカーソルを合わせるとsemanticはすべてのincludeファイルを読みに行くので,たまに時間がかかる.しかし一回パースすれば終わりなので,問題はない.
Semantic のデフォルトのインクルードパスはsemantic-dependency-system-include-path
に格納されており,追加したい場合は以下のようにする.
1 2 3 |
|
company-mode
におけるSemantic-modecompany-mode
にはcompany-semantic
コマンドがあり,これがSemanticDBを補完候補の取得に利用する.company-semantic
の良いところは,semantic-ia-complete-symbol
が改善されているところ.元は1文字以上タイプしていなければ補完を検索してくれなかったが,company-semantic
ではプレフィクスなしで補完してくれる.
global-sematicdb-minor-mode
semanticdb-default-save-directory
変数内のパスに保存されるが,デフォルトでは~/.emacs.d/semanticdb
いかに保持されるglobal-semantic-idle-scheduler-mode
Semanticがソースコードをパースし作成したデータベースは,コードの補完の他にも様々な使い道がある.コードナビゲーションや定義元・参照元ジャンプなど.
CEDETの一部で,SEmainticNAvigaTORの略称.
GDBとかGUDとかがあるらしい.
あとは気が向いたら.
]]>ターミナルをきれいにします.やることは,
テーマを手軽に導入するために Antigen を導入したいので,それに伴って zsh を導入します.
Homebrew で導入する.
1
|
|
bash で設定していたパスを zsh でも有効になるようにお引越し.
1
|
|
ターミナルの環境設定から、一般
> 開くシェル
> コマンド
に /usr/local/bin/zsh
を設定すればおk.
プラグイン管理ツールの Antigen を導入する.antigen theme テーマ名
で,oh-my-zsh で提供されているテーマなら手軽に導入できるので便利.
1 2 |
|
.zshrc
に以下を記述
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
テーマは denysdovhan/spaceship-zsh-theme にした.
tommorow theme に幾つかカラーテーマがまとめられている.
chriskempson/tomorrow-theme: Tomorrow Theme the precursor to Base16 Theme
適当なフォルダに clone する.
1
|
|
ターミナルの設定 > 一般 を選択.カラーテーマ群が表示されているリストの下部に歯車マークがあるので、そこから「読み込む…」を選択する.その後,clone した tomorrow-theme/OS X Terminal/ 以下から好きなテーマを読み込む.すると,リストにテーマが追加されるので,テーマを選択した状態でリスト下部の「デフォルト」を選択すれば良い.
おしまい.
]]>環境は以下です.
事前に brew doctor
を解決しておくと良いかも。問題がなければ、opencv を導入する。
1 2 |
|
既に OpenCV を導入している場合、過去のファイル群は邪魔なので撤去しなくてはならない。brew doctor
時点で影響を及ぼしそうなファイルはリストアップされるので、それらを削除するなりバックアップをとるなりしてから、シンボリックリンクを貼ると良いかも。
1
|
|
--force
オプションをつけてね〜的な warning が出るかもしれない。その場合は付加すれば実行できる。ただし、既存の OpenCV のシンボリックリンクを上書きすることになるので、注意。
Homebrew で導入した OpenCV の場所は /usr/local/Cellar/opencv
となる。Xcode から利用する場合は、適切な場所を参照するように設定を行う必要がある。以下、パス内のバージョンに関しては適宜置き換えること(今回の場合は2.4.12_2)。
Build Settings
> Header Search Paths
/usr/local/Cellar/opencv/2.4.12_2/include
/usr/local/Cellar/opencv
にして、recursive に設定すると説明しているサイトがあったが、こちらの方が綺麗に見えるBuild Settings
> Library Search Paths
/usr/local/Cellar/opencv/2.4.12_2/lib
OpenCV 導入済み & Xcode 設定済みだった場合は、既存の設定を削除するか、上記で設定したパスの優先度をあげる(リスト内で上方に移動する)と良いかもしれない。
OpenCV をすでに導入し、Xcode で設定済みであった場合は、Build Settings
> Linking
> Other Linker Flags
にいろいろ設定されているかもしれないが、全部消す(と、自分の環境ではエラーがなおった)。
Homebrew で導入後にライブラリとのリンクを張るためには Build Phases
> Link Binary With Libraries
に、/usr/local/Cellar/opencv/2.4.12_2/lib
から必要なライブラリを追加する。Shitf + Command + G
から /usr/local/Cellar/opencv/2.4.12\_2/lib
と入力すれば楽。
Undefined symbols for architecture x86_64:
みたいなエラーがドバッと出ることがある。
c++ - OpenCV Undefined symbols for architecture x86_64: error - Stack Overflow
OpenCV に必要なライブラリがリンクされていないことによるエラーのため、Link Binary With Libraries で必要なライブラリがリンクされているか確認する。
Xcode における Build & Run 後に、以下のようなエラーが吐かれた。
1 2 3 4 |
|
/usr/local/opt
の libpng を読みに行ってるのが悪いのかな?そもそも /usr/local/opt
の OpenCV 見に行ってるけどなんでかな?と思っていたが、どうやら試した環境では、 /usr/local/opt
内の libpng、 opencv は Cellar 以下の各ソフトウェアへのシンボリックリンクになってるらしかった。Homebrew がやってくれてるんだっけ?わからん…
バージョンが低いと言われているので、brew update & brew upgrade
したら、とりあえず治ったけど、実際何が原因だったのかはわからなかった…
c++ - Error with homebrew + opencv + libpng - Stack Overflow
octpress でブログを書こうとしたらエラーを吐かれた.
1 2 3 4 5 6 7 8 9 |
|
El Capitan におけるバグらしい.
When I upgraded the Mac system, I can't Preview · Issue #1749 · imathis/octopress
ruby のバージョンをあげたいんだけどエラーになる.
1 2 3 4 5 6 7 8 9 |
|
rbenvでインストールできるバージョンリストを最新にする - Qiita
brew update && brew upgrade ruby-build
したら,インストールできた.
1 2 3 4 5 |
|
その後,octopress の root ディレクトリで以下を実行.
1 2 3 4 |
|
無事実行できた.
1 2 3 4 5 |
|
初期化に失敗したことを,nil
を返すことで伝えることのできるイニシャライザ.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
これで,初期化がうまくいかなかった場合には,nil
が返される.
やろうとしたことは,コンストラクタ内で例外を扱うことで,具体的には以下のような感じ.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
ところが,このように記述すると,return nil
の位置で以下のようなエラーが発生する.
1
|
|
同じことでハマった人がいるらしい.
結論から言うと,値型である構造体や列挙型ではいかなるタイミングでも初期化を失敗(return nil
)できるが,クラスについては,すべての stored property が明示的に初期化された後でなければ初期化を失敗させることができないらしい.
A failable initializer for a value type (that is, a structure or enumeration) can trigger an initialization failure at any point within its initializer implementation. In the Animal structure example above, the initializer triggers an initialization failure at the very start of its implementation, before the species property has been set.
For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place.
The Swift Programming Language (Swift 2.1): Initialization
Playground でサンプルコードを動かして動作を確かめてみる.
まずは,構造体の場合.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
次に,クラスの場合.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
公式ドキュメント曰く,stored property である name は String!
として宣言する.すると,デフォルト値として nil
が格納されるが,初期化成功時には,stored property が nil かどうかを気にせずにアクセスしたい.(stored property に対する nil チェックが必要ないようにしたい)ので,クラスでは全ての stored property を初期化してから return nil する必要があるそうだ.
でも,コンストラクタの返り値が nil であったならどちらにしろプロパティにアクセスはしないわけで,なぜ全プロパティを初期化してから nil を返す必要があるのか,いまいちわからなかった.
やることは以下.
iOS アプリケーションは MVC アーキテクチャに則っているので,対応したディレクトリ構成にする.File > New > Project
から Single View Application
を作成すると,デフォルトのディレクトリ構成は以下のようなかんじ.
これを,以下のようなディレクトリ構成に変更する.
1 2 3 4 5 6 7 8 9 |
|
実際のディレクトリ構成と Xcode のカラム上でのディレクトリ構成は異なるので,その同期を撮りたいときには venmo/synx を使うと良い.
デフォルトで存在する,Main.storyboard
, LaunchScreen.storyboard
は削除する.削除するだけだとエラーとなってしまうので,以下のようにプロジェクトの設定を変更する.
Deployment Info > Main Interface
のテキストフィールドを空にするApp Icons and Launch Images > Launch Screen File
のテキストフィールドを空にするこれでプロジェクトから storyboard を除くことはできたが,この時点で Run しても画面に何も表示されない.rootViewConstroller を設定できていないためである.
そこで,AppDelegate.swift
に以下を追記することで,ViewController を rootViewController に設定する.
1 2 3 4 5 6 7 8 9 10 11 |
|
これでOK.
まず,以下のような MainView.swift
を src/view
以下に作成する.
1 2 3 4 |
|
次に,New file
から iOS > User Interface
内の view
を選択し, xib ファイル作成する.その File's Owner
の Custom Class を Main View
に設定
この UI が適用されたことがわかるように,適当にラベルを設置しておく.
xib ファイル側の view を MainView.swift
に対応させる.
MainView.swift を以下のように編集する.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
さらに,ViewController.swift
に以下を追記
1 2 3 4 5 6 |
|
これで Run すればよい.
中央揃えしたいとかそういうのは auto layout を活用すれば良い.以下のサイトが参考になる.
iOS - xcode6でAutoLayoutでレスポンシブデザイン - Qiita
AutoLayout - Swiftサラリーマン
ラベルから Ctrl 押しながら 親view へドラッグ
制約を適当に付加する.
今回はこんな感じ.
これで Run すると中央揃えになる.
最終的なディレクトリ構成は以下.
【iOS】【swift】カスタムViewとxibを紐付ける - tanihiro.log
[Swift]xibファイルを呼び出す最も簡単な方法 - Qiita
Swift+xibで簡単レイアウトでカスタムビュー - Qiita
XCode7 - Storyboardにxib利用 - Qiita
Mac OS X Yosemite です.
1 2 3 4 |
|
まず composer をいれる.
1
|
|
適当なプロジェクトを作成してみる.
1
|
|
エラーが出た.
1 2 3 4 5 |
|
intl がないと言われる.Mac の人は pecl を利用してintl
を導入する(pecl導入していない場合は導入して…).
Win の人は php.ini
の ;extention=php_intl.dll
のコメントアウトを外すと良い.
1
|
|
すると,またエラーが出る.
1 2 |
|
ICUがないと言われるので導入する.homebrew でインストールした.
1 2 |
|
もう一度インストールしてみる.
1 2 3 4 5 6 7 8 9 |
|
やっとインストールできた!
sudo apachectl start
でapacheを起動し,phpでintlがロードできているか確認する.
1 2 |
|
できているらしい.今度こそプロジェクトをちゃんと作ってみる.
1 2 3 4 |
|
bin/cake server
を起動し,localhost:8765
にアクセスできて確認できればOK.
$ sudo ./pecl install intl
環境構築 - icuのインストール - Qiita
intl と APC を PHP 5.3.15 (MacBook Air)… « をぶろぐ
Installing Intl package on OSX Lion - Darragh Enright
CakePHP3の使い方まとめ - Qiita
IDCFクラウドのサービスを利用した.
仮想マシンを作成して,めちゃらくガイドを参考に設定すればいい.OS は班員の一人が利用したことがあるということで Debian にした.
秘密鍵をダウンロードできたはず(うろ覚え…)なので,以下でアクセスできるはず.
ssh -i [/path/to/秘密鍵] -p 22 [user_name]@[IPアドレス]
cakePHP で作成したアプリケーションは,Github あたりで共有しておいて,サーバにログイン & clone すればよい.設定で 80 番ポートを開けていたので,そこでアプリケーションを起動すればよいはず.ポートの指定方法は公式にある.
1
|
|
これでhttp://[IPアドレス]
にアクセスすればよいはずなんだけど,できなくてはまった.ちょっと調べてみると…
1 2 |
|
IPv4 ではなく,IPv6 で LISTEN してしまっているので,以下のようにホストを指定して起動する.
1 2 3 |
|
これで外部から見れるようになった!サーバの設定が悪いのかと思ってだいぶ時間がかかってしまった…
春だし CakePHP 3.0をComposer経由でCentOS6.5にインストール してみた - Qiita
コンピュータとかバイクとか。 Apache HTTP Server の設定いろいろ。
Linux - 特定のポート番号をLISTENしているプロセスが知りたい - Qiita
班員各が公開鍵認証でサーバにアクセスできるようにしたかったので,ユーザ追加の方法もメモっておく.
クライアント側で以下の操作を行う.
1 2 3 4 |
|
サーバ側で以下の操作を行う.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
これで,クライアント側から ssh -i [/path/to/id_hoge] -p 22 [user_name]@210.140.68.52
でサーバにログインできるはず.
ちなみに,ユーザに管理者権限を付与したい場合は,以下のサイトを参考にすればよい.グループに対して設定を行うときには,%wheel ALL=(ALL) ALL
のように先頭に %
を付加するんだけど,なぜか除いてしまっていてつまづいた.
]]>CentOS で root 権限を持ち、sudo を実行できるユーザーを作成する | Webセキュリティの小部屋
Debianでユーザー追加を追加して権限を付与などをするメモ - Qiita
パッケージ管理ツールをいれる.
パッケージのインストールや管理がラクになる.
以下を実行.
1
|
|
Xcode を起動すると以下のような画面が表示されるので,Load Bundle
する.
Window > Package Manager
からパッケージをインストールできるようになる.
とりあえず一通り見てみていれてみたもの.
まだ全然使っていないので,使用感だとかどんなものだとかは気が向いたら書く.
他にも Xcode 使う上で知っておくといいことがいろいろあるらしいけど,気が向いたら読む.
]]>
256色表示できているか確かめる(参考サイト参照)
screen のバージョン確認
1 2 |
|
homebrew で最新版を導入する
1 2 3 4 5 |
|
これでおk.
]]>OSXに256color対応Screenをインストールする - Qiita
Mac OS X + iTerm2 + tmux + emacs で256色表示 - 人生ずっと勉強
emacsclientを使用するとテーマのmode-lineが効かない - Qiita
案外予定がつまっていて忙しい.充実しているともいう.
さて,近頃ずっと Emacs の設定をしては悦にいるという暇のつぶし方をしていた.
anything とか yasnippet とか…(設定ファイルは tasuwo/.emacs.d にあげてある)
Emacs を使い始めて数ヶ月がたった.
前の記事で説明したように,ブラウザも FireFox + keysnail で Emacs ライクなキーバインドにして楽しんでいたけれど,正直なところ,メタキーが押下しづらいし,小指を Ctrl に置いておくのが地味にキツい時がある.ちなみに,keysnail を利用している所感としては,トラックパッドを使わなくていい(Macbookのトラックパッドは十分に素晴らしいものだけど)のが楽だ.手首に優しい.
ネットではよく,Emacs vs Vim みたいな話を聞く.
自分が Emacs を使い始めたのは,大学で先輩に影響されたかのが大きく,Vim については触ったことすらなかった.軽量で,操作も(慣れれば)かなり快適だと聞く.Emacs から Vim に乗り換えてよかったという人もよく目にする.小指が疲れてきたこの機会に,少し触ってみることにした.
Vim にはデフォルトでチュートリアルが用意されていて,下記のように呼び出すことができる.
1
|
|
これをちょこちょこ触ってみた.
感想.
文書編集能力は Vim が圧倒的に勝っているように感じた(ただ,日本語編集等なるとどうなんだろう…).Emacs における単語移動の M-f や M-b は押下しづらすぎた.モード変換は慣れるまでが大変そうでなんともいえない.Emacs から Vim に乗り換えるかといわれると,おそらく Emacs と Vim では根底にある思想が異なる気がする(Emacs は良き OS ,Vim は良き Editor,みたいな)し,どうだろう.いろいろ言っているけど,別に Emacs が嫌いになったわけではないので,本格的に乗り換えるのは(今の所は)ないかな.
あまり大したことはしない.
Caps lock を Ctrl にするために,Ctrl2capを利用した.
Ctrl は Capslock にはならないので注意.
ctrl2cap /install
ctrl2cap /uninstall
インストールしたらインストール.
とりあえず,拡張機能をいくつかいれてみる.
Ctrl と command が同じ意味合いになっていて使いづらいので,
keyconfigをいれてみた.なかなかいいぞこれは…
しかし,行頭にもってくるCtrl+a
や前方削除のCtrl+h
のキーバインドが,全選択や履歴へのキーバインドになってしまう.Mac では Ctrl と Command でそこらへんの使い分けができていたけど,Win だとどちらも Ctrl だからだね.
emacs 使いには Firefox + keySnail が良いとの噂を聞きつけ,導入してみることにした.
gleeBox が利用できないのが残念だ.
少し使ってみた感じ,HoK はなかなか気に入った.
Executer というのをいれる.
Alt + Space
で起動できるようにすればおkかな.ショートカットも追加できるのがgood.
Alt + Tab
で Mac の Command + Tab
ができます.
Mac では Spectable を利用していたけど,Win はデフォルトのキーバインドでできる.いいね.
Win + →
: 右半分Win + ←
: 左半分Win + ↑
: 最大化Win + ↓
: 最小化ここが貧弱というのがよく聞く話なので,色々調べてみる.
Babun というものが良いという噂をすこし耳にする.
babun/babun
Windowsのターミナル環境を整える vol.1
Windowsはターミナルがダメだから使えないってのは過去の話?
以下の公式からダウンロードし,install.bat
を実行すると,ホームディレクトリの .babun
以下にインストールされる.アンインストールの際にはこれを削除すればよいらしい.
Babun では,pact
と呼ばれるパッケージマネージャが利用されているらしい.apt-get
やyum
と同じような役割だ.とりあえず,Emacs がほしいのでインストールしておく.
babun を立ち上げて,以下を実行.
1
|
|
Mac で利用していた Homebrew のようなもの.
ただし,アンインストールはインストールした各アプリケーションに従って主導で行う必要がある.
ここを参考に,コマンドプロンプトを管理者権限で実行し,以下を実行すると,インストールされると共にパスが通る.
1
|
|
バージョンの確認ができればOK.
1 2 3 |
|
自分はGithubに.emacs.d
をあげているので,こちらもダウンロードする.Cask を利用しているので,まずは動作のために Python2 をいれる.
1
|
|
chocolateyInstall.ps1
スクリプトを実行するか?聞かれるので yes
を選択.
また,Caskインストールのためにcurl
をインストール.
1
|
|
そして,管理者権限として実行した babun上から Cask をインストール.公式サイトより.
1
|
|
ホームディレクトリ下にダウンロードされる.
zsh を利用するので,.zprofile
に以下を追加.
1
|
|
あとは,cask install
でOK.
Win のコマンドプロンプトを管理者権限で実行し,mklink
を利用することでシンボリックリンクを張れる.babunのホームディレクトリはC:\Users\ユーザ名\.babun\cygwin\home\ユーザ名\
になっているはず(なんだそれは…).Cドライブ以下にアクセスするためには,/cygdrive/c
以下にアクセスする必要があるそうだ.よくわからないので,勉強したほうがいいかも…
とりあえずは快適な利用のために,利用したいディレクトリのシンボリックリンクをCygwinのホーム直下に張っておきたい.使い方は以下.
1
|
|
ディレクトリのシンボリックリンクを作成したい場合は\D
オプションをつける.また,フルパスで指定しないとうまくいかない.
自分は,マイドキュメントとDropboxのシンボリックリンクを張っておいた.
1
|
|
好きなものを張っておく.
babun はデフォルトで oh-my-zsh がインストール済だけど,自分は個人用設定を共有したかったので,これは使わない.
.zshrc
をMac/Win間で共有するために,ホーム直下に.dotfiles
というディレクトリを置き,Gitの管理下に置いたうえで,中身の.zshrc
からシンボリックリンクを張っておいた.
ここで,.zshrc
を置き換えると,以下のようなエラーが発生.
1
|
|
どうやら,パーミッション関係の問題らしい.こちらを参考にパーミッションの設定をし直す.babun を管理者権限で立ち上げ,以下を実行した.
1 2 |
|
Rictyフォントがお気に入りなんだけど,合成だのなんだのは面倒なので,Ricty Diminished
を利用する.yascentur/RictyDiminishedからZIPをダウンロードし,フォントをインストールする.
その後,Babunに設定する.Babun は Mintty というコンソールを利用しています.なので,Mintty の設定をいじろう.設定ファイルの場所は~/home/ユーザ名/.minttyrc
にある.ここでフォントの種類やサイズを設定する.ウインドウの透過度も決められます.
設定のためのマニュアルを参考にするとよい.
Cygwinのターミナルエミュレータminttyの導入
Windows 7でインストール済みのフォント一覧を表示する方法
見やすいプログラミング用フォント「Ricty Diminished」をWindowsにインストールしてSublime Textで利用する方法
sudo
したいんだけど,なんとかならないかなぁ,とか.
]]>
以下の初心者用ガイドを一通りやった.
ちなみに,上記サイトの使用言語は Swift ではなく Objective-C.
アプリケーション起動時にはどのようなことが起きるのだろうか?Swift でも Objective-C でも,記述方法が違うだけでやってることは同じはずなので,結局何をしているのか?を公式ドキュメントから抽出してみる.
UIApplicationMain
関数が呼び出され,以下の2つのインスタンスが生成される.
UIApplication
クラスのインスタンス生成(application object)
AppDelegate
クラスのインスタンス生成(app delegate)
application object が app delegate 上に定義されたメソッドを呼び出し,記述されたコードを実行する.コードを見てみると,UIApplicationMain
関数にAppDelegate
クラスが渡され,紐づけられているようだ.
アプリケーションを開発する上で関わりが深いのはAppDelegate
だろう.初心者用ガイドに書かれていたことをメモしておく.
コンテンツが描画されるウインドウが格納される
アプリケーションが特殊な状態に陥った場合…アプリケーションの実行時,メモリ不足時,アプリケーション終了時など…には,application object が app delegate 内の対応したメソッドが呼び出す.デフォルトでは,対応した各メソッドのスケルトンが定義されている.これらの中身が空,もしくは削除されている場合には,デフォルトの振る舞いが呼び出される.必要に応じて記述すれば良い.
開発言語は Swift を使用する予定だけど,気になったのでメモしておく.実行時の振る舞いに関係する各ソースコードを示したのちに,その違いについて考えてみる.各ソースコードは,Xcode で Single View Application を作成した時のテンプレ.中略の部分は,スケルトンコードが書かれていた部分.
AppDelegate
が定義されたファイルの他に,main.m
がある.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Objective-C では,単純にUIApplicationMain
関数にAppDelegate
クラスを渡しているが,Swift の@UIApplicationMain
とはなんなのか?
探してみると,同じ疑問を抱いている人がいた.
swift - What does "@UIApplicationMain" mean? - Stackoverflow
そもそも,iOSアプリケーションにおけるmain
関数の主な役割は以下の2つである.
UIApplicationMain
関数の呼び出し要は,UIApplicationMain
関数とAppDelegate
クラスをひもづけられれば良いようだ.これを実現するために,Swift では Attributes が用いられている.
Attributes とは定義や型に関して情報を補足するもので,先頭に@
を付加して記述する.
公式ドキュメントでは,UIApplicationMain
attirbute について以下のように記述されている.
UIApplicationMain
Apply this attribute to a class to indicate that it is the application delegate. Using this attribute is equivalent to calling the UIApplicationMain function and passing this class’s name as the name of the delegate class.
まとめると…
UIApplicationMain
attributes はAppDelegate
クラスに付加するUIApplicationMain
関数を呼び出せるdelegate class
のクラス名として登録するつまり,Objective-C における Main 関数と同等に振る舞うということらしい.ちなみに,この attributes を利用する代わりにmain.swift
を作成することもできるそうだ.
同じことをやっていることはわかっていたけど,やっぱり公式ドキュメントに記述を発見できたり,明確な理由付けができると,落ち着く.
]]>Objective-C で書いたアプリを Swift で書き換える5ステップ - Qiita
SwiftのAttributesをまとめた。 - tomoyaonishiのブログ
クロージャについてまとめる前に,まず関数について理解する.
func
で宣言し,返り値は->
を用いる.
返り値は複数指定可能.
1
2
3
func testFunc() -> (first:Int, second:Int) {
return (10, 20)
}
Swiftの関数には以下の特徴がある.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|
実行可能なコードブロックのこと…?
一言で言い表そうとすると難しい.公式では,関数は再利用が可能な特別なクロージャである.
と言われている.
とりあえず,書き方を見てみる.
名前が省略可能で,{}
で囲んで記述する.引数と返り値の後にin
を記述してから本体を記述する.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
これだけだと,クロージャの意味がイマイチわからない.つまり,なぜ関数じゃダメなのか?
自分なりの解釈だが,クロージャの良い点は複数の処理の記述をコンパクトにまとめられることなのではと思う.
例えば,map
を例にとって考える.
map
はクロージャを引数にとり(つまり,関数を与えても問題はない),配列の各値にその関数を適用・変換する.
1 2 3 4 5 6 7 |
|
クロージャは,引数や返り値の型が自明である時,その指定を省略可能である.また,返り値が1つに減退されている場合には,return
も記述しなくて良い.
よって,以下のように記述を省略できる
1 2 3 |
|
記述がかなりコンパクトになったし,何をしているのかも一目見れば大体わかる.
また,第二引数を以下のように外に出す書き方もできるそうだ.自分はこれを知らなくて,以下のような記述を見るたびに(なんだこれは…?)と頭をひねっていた.
1 2 3 |
|
もう一つの例を見てみる.
sorted
は,与えられた配列を並び替える.クロージャを引数にとると,その内容に従って並び替える.
1 2 3 4 5 |
|
引数,返り値の型と,return
を省略する.
1 2 3 |
|
さらに,自分自身が引数となっている時,自身の引数を$0,$1...
で記述可能.
1
|
|
これでかなり省略できる.
]]>Swift さくっと確認したい基礎文法 クロージャ(closure)
swift Sort関数とClosure
A Swift Tour
iOS Swiftのクロージャを使う
nil を許す型のこと.
型に?
を付加すると,Optional型を宣言できる.
ちなみにT?
はOptional<T>
のシンタックスシュガー.
1 2 3 |
|
T
とT?
は違う型.
同様に扱うためにはunwrapする必要がある.
T
型の変数を取り出すこと.unwrapの方法には以下の4種類がある.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
型に!
を付加すると,Implicitly Unwrapped Optional型を宣言できる.
ちなみにT!
はImplicitlyUnwrappedOptional<T>
のシンタックスシュガー.
1 2 3 4 5 6 7 8 9 10 |
|
nil かどうか判定する比較演算子.
a ?? b
はa != nil ? a! : b
のシンタックスシュガー.
1 2 3 4 |
|
]]>