ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
以上の本に”\007”って標準出力すると文字コード由来でベルが鳴ると書いてあった。
書いてあるなら試すしか無い。
普段から利用しているiTermを開いて
1
|
|
ベルが鳴る。
1
|
|
8と出力
1
|
|
9と出力
変な気がする。
ここに沿って考えると、BSとか、HTとかが表現されるはず。
少なくとも、普通に8とか9とかは違う気がする。
以上のようなスクリプトを作成し走らせた。
結果は両方共以下のとおり。
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
|
途中でアルファベットとか出てきていいと思うのに、なんか違う気がする。
echo コマンドの使い方の問題だった。
こんなことで日立にお世話になるとは思っていなかったけれど。
要するに、echoコマンドの使い方的には8進数か16進数を期待しているので、gistに上げたプログラムは自分の期待通りにはなりません。
自分が期待していた動きをするスクリプトは以下。実行結果は割愛
あと
1
|
|
でベルがなるのは
1 2 3 4 5 6 7 8 9 |
|
ということらしい。
]]>ドキュメントを作るのがめんどくさい時に利用できるツールでして。
くわしくはこっちを見てください。
このsphinxってやつは結構賢くて、有るパッケージ以下を認識させると、それ以下のpythonのパッケージを読み取ってくれて、 ファイルに記述されているコメントからドキュメント生成してくれます。
今回はそのコマンドを利用する際の注意点を幾つか挙げられれば。
インストール
1
|
|
利用方法
1 2 3 |
|
以上の理由を軽く解説します。
プロジェクトのルートはインポートするようにしましょう。
ドキュメント生成の際に普通にモジュールをインポートしたりするので、インポートするパスを追加しておかないとドキュメントがきちんと生成されません。
1 2 3 |
|
意外と面倒で、マークダウンほどのシンプルではありません。
なんだかんだ上記のページで学ぶのが一番しっかりしていて早いと思われます。
ディレクトリでネストしている際は__init__.pyを設置しましょう。
当たり前ですが、置かないとpythonが関連しているディレクトリとして認識されません。
自分がハマったのですが、
1 2 |
|
上記のようにインポートするとは、インポートした関数(function)を、ドキュメント生成したい(a)モジュール内の関数だと認識し、 aというモジュールのドキュメント内に、functionのドキュメントも生成されます。
(誰得の機能なのだろうか?)
たとえばSQLAlchemyを利用している際に、ralationship関数を読み込んでいるとsphinx-apidocはrelatiohship関数のドキュメントも生成しようとします。
ただし、対象関数のコメントでエラーを吐いて正しくドキュメント生成されません。
1 2 3 4 |
|
回避方法は以下のとおり
1 2 3 4 |
|
ソースコードのコメントで章立てをしないというのは、おそらく既に、モジュール名、クラス名、関数名で章立てができているので不要だからだと思います。
(はっきりと検証していないので不確かですが、)コメント内で章立てをするとエラーが出てまたしてもドキュメント生成されません。
]]>chefでapacheとphpをインストールした際に、PHPがうまく動かない
PHPの拡張子なのにテキストファイルとして認識される
etc/httpd/conf.d/
に php.conf
を自分で作成してしまったこと1.については有る有るかもしれないが、2については個人的には意外な話だった。
PHPをインストールする際に、apacheの設定用ディレクトリにPHPの設定ファイルをphp.conf
という名前で設置してくれるようです。
ただ今回私はPHP用のバーチャルホストの設定として個人的にphp.conf
を設置していて、それが悪影響を及ぼしてました。
AというオブジェクトからBというオブジェクトに値を受け渡しするプログラムを書いているつもりだった。
値を渡しているつもりなので、Aの方で値を変えても、Bの方の値は動くはずないと思っていた。コードでいうところのcloneの方の挙動
しかし、実際にはAの値を変えるとBの方の値も変化する。コードでいうところのplainの方の挙動
単純な話で、値を渡しているつもりが参照を渡していた。
「Ruby 配列 コピー」でググると一番上に出てくるリンクにも
Array#cloneないしはArray#dupを使います。
と書いてある。
この話って多分Ruby特有の話ではないと思うんですけど、実際にハマってみないと分からないもんですね。
]]>リモートのPCにファイルをアップロードしたり、ダウンロードできるコマンド 基本的にはcpと同じ体系になってると思う。 で、最初のsは多分sshのs
sshの問題点でも有るんだけど、scpのコマンドの問題でも合って、 多段sshをしている時って、ファイルをアップロードしたりダウンロードしたりって結構面倒。 ただでさえコマンドが長くなりがちなのに、「踏み台を一度経由してー」とかやってると日が暮れる。
webのリンクを踏むとファイルをダウンロードさせる仕組みを使うとリモートからローカルの転送はかなり楽になる。 この方法を応用すると、同じネットワーク内にいる際にこの方法でファイル共有が出来るのかな。
PHP5.4以上にはビルトインサーバーが組み込まれているのでこれを使いたい
上記のリンクのファイルを作成し、以下のコマンドで起動する
1 2 |
|
こうすることで、webサーバーがsample.phpを動かすので気軽にファイルをダウンロードは出来るようになる。
(当然リモート側はアクセスできるようにiptables等の設定が必要です)
1
|
|
で任意のファイルをダウンロードさせるスクリプトを作りたかった。
が、コマンドライン引数を受け付けてくれなくて断念した。
コマンドライン引数とかを指定してもipとポート番号と以外無駄。
最近python製のマイクロフレームワークのflaskを取り組んでいまして、そっちでも似たようなことをやっていた。
1
|
|
って感じでやるといい感じにwebアプリケーションだけどコマンドライン引数を受け取ってくれてた。
これができちゃうのにはスクリプトからwebサーバーを動かす仕組みになっているからですが。 (つまり、本日、本当にやりたかったことはflaskとpythonがあればできるので、それは後日書きます。)
phpの場合はサーバーの上にスクリプトが存在してて、URLから別ファイルを参照することも(ファイルが存在すると)可能。
python(flask)の場合はスクリプトからwebサーバーを動いているので、そのスクリプト上にルーティングが存在しないとだめ。
両者ともにwebサーバーの機能を実現しているが、仕組みが結構異なるということだと思われる。 この話を突き詰めていくと結構ちゃんとした話になると思うが、何を突っついたらいいのか分からないのが本音。
話がずれたけど以上。
]]>列挙型ってやつらしいです。 python3.4から使えるらしいです。
第一引数を定義名、第二引数をリストか空白区切りの文字列としEnumの要素とする
以下の方法だと、Aって言うEnum型の定義名にBとCと言う要素を宣言した形となる
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 15 16 17 18 19 |
|
keyとvalueのシンプルな関係を持たせることが出来るなら、正誤表みたいな使い方が連想配列の代わりにEnumで出来るな!と考えて以下の様な定義と使い方をしてみました。
1 2 3 4 5 6 7 8 9 10 11 |
|
すると結果は
1 2 3 4 5 |
|
何故かCが定義されてない。
ドキュメントにきちんと書いてありました。
ただし、複数の列挙型メンバーが同じ値を持つことはできます。同じ値を持つ 2 つのメンバー A および B (先に定義したのは A) が与えられたとき、B は A の別名になります。A および B を値で調べたとき、A が返されます。B を名前で調べたとき、A が返されます:
つまり、同じ値を持っているものは同じ名前だよね?って処理がされます。
上の例ではAとCが両方TrueなのでCの定義はAと同義とみなされたということです。
wikipediaの列挙型のページを見る限りいくつかの定数の集まりとして使うのが正解なのでしょうかね?
列挙型を使うのが初めてで存じ上げませんでした。
ドキュメントをきちんと読まなかったので、ちょっとだけハマった話でした。
]]>この投稿はCakePHP Advent Calendar 2014の6日目の記事です。
5日目:CakePHPでType Hinting!!!::CakePHP Advent(5日目)
現在のcakePHPは 2.5.6
が安定版、2.6.0
がRC、3.0
がbeatとしてリリースされています。
cakeの3って、2と何が違うの?という話は、Engine Yardさんの以下の記事がわかりやすいと思うので、そちらを参照してください。
第3回 週末ランサーズにてCakePHP3についての講演をしました
本日はまだ英語版しか無い、cakePHP3のBookmarkerチュートリアルほど取り組みます!
InstallationとQuick Start Guideを参考に進めていきます。
必要なものに以下が指定されています。
DBは以下の内のどれか
まぁつまり、通常のLAMP構成みたいなものがあれば良いのでは無いかと思います。
自分はvagrantを利用して以下を用意しました。
コマンドラインから適当なディレクトリで以下を実行します。
練習ということで、cakePHPを配置したいディレクトリで実行するのがいいと思います。
まず、cakeをインストールするためのcomposerをインストール
1
|
|
Bookmarkerを作るチュートリアルです。
チュートリアルの概要は、簡易版のソーシャルブックマークを作成しよう!というものです。
サイトに登録したユーザーは、URLを登録する事ができ、そのURLに対してタグを付与することが出来るようになります。
以下を実行するとcakeがインストールされます。
最後のbookmarker
ってやつがインストールされるディレクトリ名になります。
1
|
|
時間が少々かかります。成功すると標準出力に以下の様なものが表示されます。
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 |
|
失敗してるとちゃんとproblemって出るので見落とさないように。
自分の環境(ここのCentOS 6.5 x86_64)では php-intl
がインストール出来なくてエラーが出てました。最後にちょろっと補足を書いておきます。
2系列の時より綺麗!!!
(だけどまっさらで、必要な情報はもうちょい上に挙げられなかったのかなーなんてね)
appがsrcに変わった感じ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
src以下はずいぶんスッキリ
1 2 3 4 5 6 7 |
|
まずtmpとかlogsとかの権限をphpが関与できる権限に変更しましょう。
つぎにDBの作成とテーブルの設定。チュートリアルにある、以下をまんま流し込む
今回は面倒かつ練習用なので
ユーザー名 root パスワード root 作成したDBの名前 bookmarker
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 |
|
でもって、作成したDBの設定をconfig/app.phpに反映
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 |
|
おなじみのスキャッフォルド
bookmarkerとしてcakeをインストールしたディレクトリで以下を叩きます
1 2 3 |
|
成功してると最後に以下が表示される
1
|
|
成功したなら以下にアクセス
1
|
|
3系ではcakeのデフォはフラットですね。
これだけで、結構な色々な機能が使えるのですが、見れない所がちょいちょい有る。
が、それは後で治すと思うのでとりあえず放置
とりあえず、この後色々試すのにユーザーとタグとブクマのデータを入れて欲しい。 順番もきちんとユーザー、タグ、ブクマで入れると勘違いが起きない。
現状のままだと、ユーザーのパスワードが暗号化されていないので実用性が低いと思われるので。
src/Model/Entity/User.phpに追記していきます。
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 |
|
(どうでもいいけど、cakeのスキャッフォルド、tab文字で生成されるの凄く気になりませんか?)
これで、Userを編集したり、新しく保存するとユーザーのパスワードが暗号化されるはず。
2系列で使っていたModelは、Model/Entityに移動した形ですかね? 3系列ではModelがオブジェクトを返すようになったらしいので、それに伴い、大きく変更されてるっぽいですね。
Modelから抜粋
In CakePHP your application’s domain model gets split into 2 primary object types. The first are repositories or table objects. These objects provide access to collections of data. They allow you to save new records, modify/delete existing ones, define relations, and perform bulk operations. The second type of objects are entities. Entities represent individual records and allow you to define row/record level behavior & functionality.
ざっくり訳すと、modelは2つに別れて、
オブジェクト | 役割 |
---|---|
table | 新しいデータの保存とか、変更、削除と、リレーションの定義 |
entities | 独立したレコードの表示や、行の振る舞いや関数の定義 |
つまり、tableはデータを弄る系とリレーション、entitiesはデータの利用ってことでいいのかな?
3.0 Migration Guideがわかりやすそう
The folders containing view files now go under src/Template instead of src/View. This was done to separate the view files from files containing php classes (eg. Helpers, View classes).
いままでのViewがTemplateに変わったとの事。
cake3ではViewもオブジェクトになったからだと思われる。
でもって、Viewのオブジェクトで色々と設定が出来るようになった?って感じかな。
たとえば
1
|
|
以上だと、funnyとかタグ付けされてるやつブクマが分かることを期待する。
この機能を実現するために、以下の手順を通して行う。
1 2 3 4 5 6 7 8 |
|
以上を、
1
|
|
が出てくる前に記述する。
記述しないと、/
が追記したものより先にマッチして思うようにアクセス出来ない。
routesに追記したのはBookmarksControllersのtagsにアクセスと書いたが、まだ無いので追記。 位置は基本的に気にしなくていい。
1 2 3 4 5 6 7 8 |
|
チュートリアルには、コントローラーを薄く保つために、モデルにロジックを記述するんだ!とか書いてある。
結果として、より規約を意識する形になったと思う。
コードのコメントにも書いたが、Controller内のModel呼び出しで、find('tagged'〜
のところが、findTaggedと結びついている。
Model/Table/BookmarksTable.phpに以下を追記
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Controllerにメソッドを追加したら、Templateも追加しましょう。
/Template/Bookmarks/tags.ctpに以下を記述して保存
1 2 3 4 5 6 7 8 9 10 11 |
|
1
|
|
にアクセスするとhogehogeとタグ付けされた本がリストアップされる。
スクショは、予めブクマしたものにプログラミングとタグ付けをしてURLにアクセスしたもの。
1
|
|
寂しいけどこんな感じ。 これでbookmarkerチュートリアルは終了。
結構色々変わった!というのがチュートリアルを終えての印象。
cake2の頃も結構規約を意識しなければならなかったが、更に規約を意識してプログラムを書かなければと思う。
cake慣れていれば問題ないけど、初心者とかは結構詰まるのではないかな?
ModelとViewが更に大きく変わっていると思うけれど、今回のチュートリアルでは構成と役割が分割されたくらいしかわからないので、次回に持越し。
とりあえず、正式にリリースされたら、新規で作るものに関しては使っていきたいと思う。 これだけの変更があると、マイグレーションツールとかがどの位通用するのかとかも気になる所。
想像以上に長くなったので、とりあえず本日の記事は以上にします。 近いうちにBookmarkarチュートリアル2に取り組む記事もあげる予定です。
cakePHP3のチュートリアルの足掛かりになればと思います。
php-intlがインストールできて無かった話
libicudata.so.50()(64bit)が無いと言われたので
1 2 3 |
|
って感じでインストールした。
]]>octopressは静的ファイルで運営するブログでして、本文をマークダウンで記述出来て、さくっとコードの埋め込みとかも出来ます。
1 2 3 4 5 |
|
の一連で記事を更新できます。
コードを埋め込んでシンタックスハイライトを期待する文章で
1
|
|
を叩くと
1
|
|
とかでる。
でもってシンタックスハイライト有効にならない。
stackoverflowに出てました。 ここ
つまり、python2.7でないとダメらしく、自分の環境のpythonは3.4.0だからっぽい。
自分の環境はmacにpyenvがインストールされているので、octopressのディレクトリ内では2.7が動くように指定しました。
macのシステムで利用しているpythonは2.7だと思うので
1
|
|
以上をoctopressの設置しているディレクトリ内で叩くことにより、シンタックスハイライトが有効になりました。
めでたしめでたし。
]]>PHPでは
1 2 3 4 5 |
|
とか
1 2 3 4 5 |
|
とかで、!
を論理否定演算子に使う。
だが、Pythonではnot
を利用して論理否定を表現する。
1 2 3 |
|
とか
1 2 3 |
|
で表現する。
pythonだと
1 2 3 |
|
とか表現できるけど、こっちの方だと、pytestとかで警告が出る。
確認する際はphp -a
か、ipythob
を利用して確認すると良い。
ただしphp -a は環境によっては使えないことと、Trueを1、Falseを出力なしで表現することに注意
]]>