カテゴリー
movabletype(mt) Perl

MT7に独自のコンテンツフィールドを追加する

この記事は「Movable Type Advent Calendar 2017」の12日目の記事です。 MovableTypeは2017年の10月に行われたMTDDCで、時期バージョンとなるMovable Type 7を4月にリリースすると発表がありました。 イベントに出席された方は知っているかもしれませんが、今回大きく変わる部分が、コンテンツタイプという概念です。 コンテンツタイプとは簡単にいうと、作成するページに応じて項目の数や種類などが設定でき、コンテンツに応じた管理画面にできるということです。 WordPressを使うよって人はカスタム投稿タイプを作って、カスタム投稿タイプにカスタムフィールドを作成して関連づけるということをしていると思いますが、それに近いイメージではないかなと思います。 今までは記事、もしくはウェブページという2つのコンテンツタイプしか存在せず、そこにカスタムフィールドをつけたり、ブログを複数に分けたりという対応をせざるを得ないというのがMTを使う上でのお決まりでしたが、その必要も無くなります。 今までのMTで商品紹介ページを作る場合、商品が多くなってくるとカテゴリ分けをしたくなります。「パソコン」だったり「周辺機器」だったり。 パソコンの中でもさらに種別をつけたくて「Mac」「Windows」 「Mac」の中でも「iMac」「Mac Book」 「iMac」の中でディスプレイサイズ、年式などなど。。。 分ければ分けるだけ、検索などでも探しやすくなったりはしますが、管理画面が複雑になっていきます。「パソコン」でブログを作ってその中でカテゴリを作って。。。 カテゴリはブログで1つしか使えないから、トップカテゴリを大項目、2階層目が中項目、その下が小項目。。。 タグはスペックを分けるのに使いましょう。16Gや32bitなどなど。。。 試行錯誤してできた管理画面にもブログや記事などの言葉が出てきて下記のようなマニュアルを作ってみたり。。。

これまでのたくさんの工夫と努力をしてきましたが、それが簡単にできるようです。 標準のコンテンツタイプとコンテンツフィールドでできることが増えたので、ほとんどの場合、このままでもコンテンツが作成できるかと思いますが もし自分で増やせるとしたらどうでしょう? 増やしてみたくなりますよね!(エンジニアのみなさん時間です まだコンテンツタイプの公式なプラグインの作り方などドキュメントはないので、少しだけソースを読んでみましょう。 registryの中に新たに「content_field_types」というものがあるようです。 lib/MT/ContentFieldType.pmの中になにやら色々と標準のコンテンツフィールドが定義されており、その中でlabelやdata_type、orderなどがあります。
  • label フィールド一覧に表示される名前?
  • data_type 保存するデータのタイプ?「integer」や「varchar」
  • order 表示される順番?
  • field_html 管理画面で表示されるHTML?
  • field_html_params 管理画面で表示されるHTMLに渡すパラメータ?
  • options コンテンツフィールドのオプション?。例えば数字だとMAX値とかMIN値とか。入力に何か制限かけたい時や、フィールド毎に設定をもたせたい場合に使う?
  • options_html 上記オプションを設定させるときに表示するHTMLの設定?
こんな感じで色々なことができるみたいです。 ここで書いたものはあくまでアルファバージョンのソースコードを読み解いた結果なので、リリースまであと4ヶ月くらいで全然別物になっていることもあるかもしれませんが、少なくとも項目を自由に増やしたり、増やし方も自由度が高くて開発できる人さえいれば、かなり柔軟な管理画面が作れそうです。 これまでもコールバックやプラグインなどの仕組みを使うと、全く別のCMSを作ることだってできるのですが、今回追加されているコンテンツタイプやコンテンツフィールドという仕組みにも、こうした細かく追加できるように作られているようです。 ここで、何か簡単なプラグインを作ってみる予定、、、でしたが、ちょっと時間不足でした。 時間を作れるタイミングで何か作ります。  
カテゴリー
Appple iOS

iOS11でSafariからカメラやマイクにアクセスできるように!

iOS11でSafariからカメラやマイクにアクセスできるように!

Safariで音声を録音して、それを再生するようなウェブアプリケーションを作りたいなと考えた場合、iOSのSafariではカメラやマイクにアクセスができなかったので、どうしても一度ネイティブなアプリで録音などしてからアップロードしてもらうなどの対応が必要でした。

今回iOS11ではSafari11.0というバージョンとなり、iOSのSafariからでもカメラやマイクにアクセスする、「Media Capture and Streams」をサポートしたみたいです。

この機能を使うには、設定→Safari→カメラとマイクのアクセスをオンにしてもらう必要があります。

また、アクセスする際にユーザー側には「”sample.com”がマイクにアクセスを求めています」というメッセージが出るので、許可してもらう必要があります。

それ以外にもセキュリティ関連や、WebRTCをサポートしたなどの変更があるようです。

Safari 11.0

カテゴリー
MySQL データベース

いろんな言語でMySQLに接続してみよう

フリーランスプログラマーの増子です。

今までPerlを中心にお仕事をしてきて、Perlは嫌いだとか思ったことはないのだけれども、
色々な言語を知っていた方がこの先に役に立つのかなということもあったり、
お仕事で使うかもしれないので色々と勉強しているコードを公開しちゃいます。

まずは基本的なhello world。。。だとつまらないので、
いろんなプロジェクトでよく使われているMySQLに接続してしまいましょう。

データベースの作り方はここでは省略します。

  • データベース名:db
  • 接続テーブル名:author
  • 接続ユーザ名:user
  • 接続パスワード:password

※あくまでローカルの開発環境で説明しやすいように作りました。本番環境でこんなパスワードとか使っちゃダメ絶対!!

プログラムの内容は、authorテーブルに接続し、idとnameを表示するだけの簡単なお仕事。
言語ごとにどんな違いがあるのでしょうか。
楽しみですね。

さて、始めていきましょう!

Pythonの場合

PythonはPerlなんかと同じ動的言語と呼ばれるもので、コンパイルなどの作業をプログラマがやらずとも動いてくれる言語です。
楽チンですね。
インデントでプログラムの塊(関数の切れ目とかif文はどこまでだとか)を判断してくれるので、文章の終わりにセミコロン等は必要ありません。
どうしても1行に2つの命令を入れたい場合にはセミコロンで区切ることもできますが、読みにくくなるしやらない。

PythonからMySQLに接続するのみよく使われているのがMySQL-pythonというモジュールみたいです。
他にも色々あったり、Pythonのバージョンが2か3かで違ったりするので、自分がどのバージョンで使おうとしているのか事前に調べておきましょう。

今回はPython3系で説明します。

早速ソースコードを載せちゃいます。

# -*- coding: utf-8 -*- 

import MySQLdb
  
if __name__ == "__main__":
  
    connector = MySQLdb.connect(host="192.168.33.50", db="db", user="user", passwd="password", charset="utf8")
    cursor = connector.cursor(MySQLdb.cursors.DictCursor)
      
    sql = "select * from author"
    cursor.execute(sql)
    records = cursor.fetchall()
    for record in records:
        print "id = " + str(record["id"]) + ", author_name= " + str(record["name"])
    cursor.close()
    connector.close()

見やすいように改行とか入れてますが、スマホとかだとちょっと見辛いかもしれません。

7行目:MySQLdb.connect()というところでdbに接続します。
8行目:カーソルを取得します。この時に、ハッシュでデータをもらいたいのでそのあたりもやってます。
11行目:sqlという変数に入っているSQL文を実行します。
12行目:fetchall()というところですべてのデータを配列で受け取ります。
14行目:受け取った配列をfor文で順番に取得して、printしています。
15、16行目:コネクションを閉じたり終わりの処理

15、16行目はwithとかで書くと入らなくなるらしいというかプログラムの実行が終わると自動的にコネクション閉じてくれそうなものだけど、最初なので丁寧に閉じるところまでやってみた。

つまずいたのは14行目で文字列を連結させてprintしていますが、idがintegerのため、『str()』で文字列に変換しています。
これをやらないと、書きエラーが発生します。

TypeError: cannot concatenate ‘str’ and ‘long’ objects

最近はMovableTypeもそうだし、他のフレームワークでも生のSQLを書くことがないので久しぶりに書きました。
ただのselect文なのに緊張するw

データベースへの接続ってもっとかかるかと思ったけど以外と簡単に行けた。

次行ってみよー

Rubyの場合

みんな大好きRuby on RailsのRubyです。

言語を作ったのは日本人(まつもと ひろゆき さん)が作ったので日本語の情報もいっぱいあっていいですね!
Perlは結構英語のサイトを読むことに。。。

RubyもPythonやPerlと同じくコンパイル作業が必要ない動的言語です。
そしてRubyもPythonと同じく文章の終わりにセミコロンなどが必要なしです。
if文などの塊はif〜endまでと日本人的にはわかりやすい形になってます。
少なくとも{{{}}}}あれ?カッコ一個多くない?みたいなことにはなりませんね。

RubyからMySQLに接続する場合には、mysql2というライブラリが最近は人気だとか。
流行りには乗っかるタイプなのでこちらでやってみたいと思います。

今回Railsはあえて使用しませんでした。
言語として比較したかったので、素のRubyです。

では早速ソースコード書いて見ましょう。

require 'mysql2'

client = Mysql2::Client.new(:host => '192.168.33.50', :user => 'user', :password => 'password', :encoding => 'utf8', :database => 'db')
query = %q{select * from author}
results = client.query(query)
results.each do |row|
  puts "id = " + row["id"].to_s + ", name= " + row["name"].to_s
end

こちらもPythonとほぼ同じですね。
なるべく言語間で比較ができるように同じになるように書いているので当然といえば当然か。

Pythonよりスッキリしているのはカーソル周りの処理がないから。
ちょこっと調べた限りだとどこもこんな感じなので、どうなんでしょう?

細かいところだと、こちらもidをprintするときに文字列連結しているので『to_s』というメソッドを呼び出して文字列に変換しています。
これをやらないと、Pythonと同じようにエラーが発生します。

no implicit conversion of Fixnum into String (TypeError)

とりあえずRubyでも接続成功!