おしゃれなギャラリーが作れるCMS「Lychee」を使ってみた
みなさん、CMSってご存じですか?
Contents Management Systemの略で、htmlを直接編集することなく、ブログやホームページが作れるシステムのことです。
世界中で広く利用されている「WordPress」は、このCMSの一種です。
WordPressなら、ブログを書くときにいちいちhtmlをまるごと制作する、なんてことはないですよね?
これがCMSの特徴です。
CMSは、WordPress以外にもDrupalやConcrete5など様々な種類があります。
余談ですが、個人的にはConcrete5が使いやすくて好きだったりします。
今日は、このCMSの中から「Lychee」をご紹介します。
Lycheeとは
タイトルに合ったようにLycheeはギャラリーを作るためのものです。
ギャラリーとは、写真を一覧で表示して、画像をクリックすると拡大される、といった機能を持つものです。
スマホの中にも写真を見るためのギャラリーアプリが入っていますよね。
写真をメインで扱うようなサイトでは、なるべく使いやすく、きれいに見せたいところですよね。
そんな望みを叶えてくれるのが、Lycheeです。
WordPressにプラグインをいれてギャラリーを作ってもいいのですが、そうすると大掛かりなシステムになりますよね。
ちょっと写真が見れるサイトを作りたいんだ、なんて時には面倒だったりします。
ということで、Lycheeが活用されるのです。
Lycheeは、主にPHPとjavascriptで構成されており、写真の管理にMySQLが必要です。
WordPressがインストールできるサーバーであれば、Lycheeもインストール可能です。
インストール手順はとても簡単です。
まず、Lycheeのgithubにアクセスし、ファイルをダウンロードします。
git cloneしても構いません。
github.com
このファイルを解凍し、インストールしたいディレクトリに配置して、その場所にアクセスします。
あとは画面に従って、MySQLのユーザー名やパスワードなど必要な情報を入力し、管理者用パスワードを設定すれば完了です。
詳しい利用方法は、READMEの中に書かれています。
直感的に使い方がわかるので、迷うこともないと思います。
Lycheeの良い点・悪い点
Lycheeの良いところは、シンプルさと美しさです。
ギャラリーを作るCMSは、レイアウトが残念で全近代的なビジュアルだったりしますが、Lycheeは黒を基調としたシンプルなデザインです。
また、それでいて必要な機能はしっかり備わっています。
写真を一括でzipにしてダウンロードしたり、写真1枚1枚を全画面表示したり、名前を変更したり共有したり。
さらにはパスワードによって写真を保護する、なんてこともできます。
基本的な機能は揃っていて、便利です。
今まで3日ほど私が使ってきて困ったことがいくつかありました。
まず、パスワード保護に関するものです。
パスワードによって写真を保護している場合、フォルダ内の写真を見るたびにパスワードを求められることがあります。
写真を1枚見るごとにパスワードを求められ、非常に面倒でした。
この原因はchromeのパスワード保存機能が原因でした。
管理者用のアカウント情報をchromeに記憶させていたことで、このような面倒な現象が起こるようです。
また、写真の一括ダウンロードですが、写真の数が多くなるとうまく動かなくなりました。
原因は、zipファイルの送信にありました。
一括ダウンロードでは、毎回phpにてzipファイルの作成が行われ、そのまま送信されるのですが、これがファイルサイズを考慮しない作りとなっているようです。
サーバーのメモリ不足によって転送ができなくなるようです。
php/Module/Album.php内のgetArchive()を以下のように編集すると直りました。
<?php public function getArchive() { // Check dependencies Validator::required(isset($this->albumIDs), __METHOD__); // Call plugins Plugins::get()->activate(__METHOD__, 0, func_get_args()); // Illicit chars $badChars = array_merge( array_map('chr', range(0,31)), array("<", ">", ":", '"', "/", "\\", "|", "?", "*") ); // Photos query switch($this->albumIDs) { case 's': $photos = Database::prepare(Database::get(), 'SELECT title, url FROM ? WHERE public = 1', array(LYCHEE_TABLE_PHOTOS)); $zipTitle = 'Public'; break; case 'f': $photos = Database::prepare(Database::get(), 'SELECT title, url FROM ? WHERE star = 1', array(LYCHEE_TABLE_PHOTOS)); $zipTitle = 'Starred'; break; case 'r': $photos = Database::prepare(Database::get(), 'SELECT title, url FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY checksum', array(LYCHEE_TABLE_PHOTOS)); $zipTitle = 'Recent'; break; default: $photos = Database::prepare(Database::get(), "SELECT title, url FROM ? WHERE album = '?'", array(LYCHEE_TABLE_PHOTOS, $this->albumIDs)); $zipTitle = 'Unsorted'; } // Get title from database when album is not a SmartAlbum if ($this->albumIDs!=0&&is_numeric($this->albumIDs)) { $query = Database::prepare(Database::get(), "SELECT title FROM ? WHERE id = '?' LIMIT 1", array(LYCHEE_TABLE_ALBUMS, $this->albumIDs)); $album = Database::execute(Database::get(), $query, __METHOD__, __LINE__); if ($album===false) return false; // Get album object $album = $album->fetch_object(); // Album not found? if ($album===null) { Log::error(Database::get(), __METHOD__, __LINE__, 'Could not find specified album'); return false; } // Set title $zipTitle = $album->title; } // Escape title $zipTitle = str_replace($badChars, '', $zipTitle); $filename = LYCHEE_DATA . $zipTitle . '.zip'; // Create zip $zip = new ZipArchive(); if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) { Log::error(Database::get(), __METHOD__, __LINE__, 'Could not create ZipArchive'); return false; } // Execute query $photos = Database::execute(Database::get(), $photos, __METHOD__, __LINE__); // Check if album empty if ($photos->num_rows==0) { Log::error(Database::get(), __METHOD__, __LINE__, 'Could not create ZipArchive without images'); return false; } // Parse each path $files = array(); while ($photo = $photos->fetch_object()) { // Parse url $photo->url = LYCHEE_UPLOADS_BIG . $photo->url; // Parse title $photo->title = str_replace($badChars, '', $photo->title); if (!isset($photo->title)||$photo->title==='') $photo->title = 'Untitled'; // Check if readable if (!@is_readable($photo->url)) continue; // Get extension of image $extension = getExtension($photo->url, false); // Set title for photo $zipFileName = $zipTitle . '/' . $photo->title . $extension; // Check for duplicates if (!empty($files)) { $i = 1; while (in_array($zipFileName, $files)) { // Set new title for photo $zipFileName = $zipTitle . '/' . $photo->title . '-' . $i . $extension; $i++; } } // Add to array $files[] = $zipFileName; // Add photo to zip $zip->addFile($photo->url, $zipFileName); } // Finish zip $zip->close(); // Send zip header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=\"$zipTitle.zip\""); header("Content-Length: " . filesize($filename)); //変更ここから while (ob_get_level() > 0) { ob_end_clean(); } ob_start(); $file = fopen($filename, 'rb'); if(!$file) { exit; } while(!feof($file) and (connection_status() == 0)) { echo fread($file, '1048576'); ob_flush(); } ob_flush(); ob_end_clean(); //変更ここまで // Delete zip unlink($filename); // Call plugins Plugins::get()->activate(__METHOD__, 1, func_get_args()); return true; }
こちらの記事を参考にさせていただきました。ありがとうございます。
every-rating.com
最後に
いかがでしょうか。不具合が多々あるので、実用可能ではないかもしれませんが、おしゃれで使い勝手がいいので、一度使ってみてはいかがでしょうか。
ではまた。
Androidでデータベースの作成・更新中にProgressDialogを表示する
こんにちは。
今日は久しぶりにAndroidネタです。
開発中のアプリでSQLiteを使ったデータベースを使用しているのですが、今回そのデータベースの構造自体を大きく変更する必要が出てきました。
データベースの変更には少し時間がかかる上に、その間にどこか別の場所をタップされたりなんかしたら非常に面倒です。
ということで、この更新処理中にProgressDialogを表示させることにしました。
意外と手間取りましたので、メモしておきます。
ProgressDialogとは
ProgressDialogというのは、これです。
上の画像では少しわかりづらいですが、左にはスピナー、右にはメッセージが表示されるダイアログです。
みなさんも、どこかでご覧になったことがあると思います。
よくデータを取得するときなんかに表示されたりしますよね。
今回は、これをデータベースの準備中に表示させようと思います。
実装
実装方法は非常にシンプル。
DatabaseHelperの中に、AsyncTaskを盛り込むだけです。
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper { private Context appContext; private int oldVersion,newVersion; public DatabaseHelper(Context context){ super(context,"database.db",null,2); this.appContext = context; } @Override public void onCreate(SQLiteDatabase db){ db.execSQL("テーブルの作成処理をここへ"); db.close(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ this.oldVersion = oldVersion; this.newVersion = newVersion; new updateDB().execute(db); } public class updateDB extends AsyncTask<SQLiteDatabase,Void,Integer>{ ProgressDialog progressDialog; @Override protected void onPreExecute(){ super.onPreExecute(); progressDialog = ProgressDialog.show(appContext,"データを更新中","この処理には少し時間がかかる場合があります"); } @Override protected Integer doInBackground(SQLiteDatabase... params) { SQLiteDatabase db = params[0]; //データベースの更新処理 if(oldVersion == 1 && newVersion == 2) { db.execSQL("更新処理をここへ"); } db.close(); return 1; } @Override protected void onPostExecute(Integer result){ progressDialog.dismiss(); super.onPostExecute(result); } } }
非同期処理の中にデータベースの更新処理を入れることで、ダイアログを表示しながら処理ができるようになります。
非同期処理を呼び出す際には、updateDB().execute()を使用します。
ポイントは、doInBackgroundの引数です。
execute()の引数がdoInBackgroundのparamsに配列として渡されます。
そのため、今回は変数dbをparams[0]に格納して受け渡ししています。
最後に
まとめてみると、とても簡単ですね。
ではまた。
Let's Encryptとはなにか、について調べる
本業の方が大変忙しく、最近更新できておりませんでしたが、今日は張り切っていきたいと思います!
今日の話題は、Let's Encryptです。
こちらのブログでもたびたび話題にして参りました。
Let's Encryptは何者なのか
最近、ふと思ったんです。Let's Encryptって何者!?
皆さんの中にも私のように、不思議に思われている方もいらっしゃるのではないでしょうか。
ん?Let's Encryptって何?という方もいらっしゃると思いますので、簡単に説明しておきます。もう分かってるよ、という方は読み飛ばしてください。すでに理解されている方は、そもそもこちらの記事なんか読まないかもしれませんが(笑)
Let's Encryptとは
Let's Encryptは、無料でSSL証明書を取得することが出来るサービスです。
そもそもSSL証明書って?
SSL証明書とは、httpsでの通信を可能にするために必要なものです。
URLがhttps:// で始まるホームページはご覧になったこと、ありませんか?
Chromeでhttpsのサイトにアクセスすると、アドレスバーの左端に緑の鍵マークが現れます。
httpsはSSLという暗号化技術によって、データのやりとりを暗号化するものです。
そう、SSL証明書のSSLは、暗号化技術の名称を表していたんです。
例えるなら、SSL証明書は運転免許証のようなものです。
運転免許証を持っている人は、しっかりとした運転技術を持っていると認められた人ですから、車が運転することを許可されたわけです。
さらに公的に発行された信頼度のあるものですから、身分証明にも使われますよね。
SSL証明書もこれに似たような機能を持っています。
暗号化を行うためには、鍵と呼ばれる情報が必要です。
SSL証明書は、この鍵にあたる情報が含まれているため、ブラウザがこの鍵を使って暗号化を行うことが出来るようになります。
SSL証明書があって初めて暗号化することができる、というところが運転免許証と似ていますね。
さらに、SSLは相手の保証を行うものでもあります。
通信相手が実在することを、公的に信頼された機関が確認し、保証してくれます。
これがあるので、利用者は安心して暗号化できるわけです。
身元を保証する、というところが運転免許証と似ています。
一般的に、SSL証明書は有料です。企業などで使われているものは、何万単位の費用がかかる高級(?)なものです。
無料で手に入る証明書
無料でこれを手に入れようと思うと、主に手段は主に
- Let's Encryptで証明書を取得する
- オレオレ証明書を自作する
の2つがあります。
オレオレ証明書とはなにか
オレオレ証明書というのは、自分で作成した証明書のことです。
本来、専門の機関によって発行されるべき証明書を自分で生み出すわけですから、当然費用はかかりません。
しかし逆に、自作した証明書ということは、公的な機関から認証を受けない、ということになります。よって、この証明書に対しての信頼度は低くなるです。
ですから、ブラウザを通してオレオレ証明書を使ったサイトにアクセスすると、デカデカと警告が出てしまいます。
このサイト、危険なんじゃない?という警告です。だって、誰かよく分からない鍵を暗号化に使ってるんですから。
そんなサイトにアクセスしますか?私ならしないでしょうね(笑)
なぜオレオレ証明書が必要なのか
では、なぜオレオレ証明書なるものが存在するかと言いますと、そもそも証明書がなければhttpsで通信できないからです。
これは先ほど説明したとおり、鍵が必ず必要だからです。
逆に、証明書さえあればhttpsで通信できます。
オレオレ証明書なら、通信する相手を保証してもらうことはできないけど、とにかく暗号化通信が始められるわけです。
昔は公的な機関から発行される証明書は有料のものしかなかったため、お金をかけずにとにかく暗号化するために、これが使われていました。
ここまでの話でお分かりの通り、オレオレ証明書は一般向けのサイトには向きません。だって、警告が出てしまいますから。
しかし、社内ネットワークで暗号化通信したい場合など、相手がすでに分かっていて保証の必要がない場合では、これで十分です。ブラウザを通さずにhttpsにて通信する場合もそうですね。
Let'sEncryptとは?
それに対して、Let'sEncryptとはなんでしょうか。
Let's Encryptにて提供されるのは、秘密鍵・証明書・中間証明書の3種類で、公的に信頼度のある証明書です。
これが無料で取得できるんです。
では、Let's Encryptとオレオレ証明書はどう違うのでしょうか。
ずばり、これは誰が発行するか、です。
オレオレ証明書が個人が勝手に発行したものであるのに対して、Let's Encryptはしっかりとした第三者機関によって発行されています。
これにより証明書に対する信頼度が格段に違うため、Let's Encryptで発行された証明書を使うと、無料でありながらブラウザで警告がでることなくhttpsで通信できるのです。
Let's Encryptは何者なのか
ここまで書いてまいりましたが、私はこんな疑問を抱いていました。
- どこが発行しているのか
- なぜ無料なのか
- どのような仕組みなのか
- 今後なくなることはないのか
- 誰でも発行できれば、サイトの信頼性を保証できないのではないか
ここからは、これらの疑問を一つ一つ解決していく形で、書き進めていきます。
Q1.どこが発行しているのか
一体どこが発行しているのでしょうか。
かなりの普及を見せているLet'sEncryptですから、発行元が怪しいところではないと思われますが、気になります。
なぜこんなに信頼されているのでしょうか。
A1.ISRGという非営利団体がサービスを提供している
では、ここでLet'sEncryptの公式ページを見てみましょう。
うわ、英語かよ!となった方、大丈夫ですよ!
非公式ですが、Let'sEncryptについてまとめている日本語サイトがあります。
こちらのLet'sEncryptについて、から少し引用させてもらいます。
非営利団体の ISRG (Internet Security Research Group) が運営しており、シスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体が、ISRG のスポンサーとして Let's Encrypt を支援しています。
これによると、ISRGという機関が運営しているようです。
調べてみると、ISRGというのはアメリカにある公益法人で、経済的・技術的・教育的な面でインターネット上での安全な通信を行う障壁を減らすことを目的としているようです。
firefoxの開発で有名なmozillaやサーバーなどの製品やサービスを手がけるCisco、情報理論を確立した学者シャノンの出身校であるミシガン大学などの関係者が役員をつとめています。
さらにISRGは、先ほど紹介したmozillaやCisco、さらにはfacebookやchrome、Wordpress.comを運営するautomatticや日本でも利用者の多いJimdoなど、様々な企業や団体がスポンサーとなっています。
このスポンサーを見ると、ネット業界で名を馳せたサービスや商品のプロバイダばかりです。chromeやmozillaが関わっているとなると、信頼度が違いますね。
だからLet'sEncryptは信頼されているのです。逆にブラウザ側からすれば、自分たちがお金を出しているところから発行されているから、信用するといったところでしょうか。
Q2.なぜ無料なのか
無料の理由、これが気になります。どうして無料なのでしょうか。
もしかして、有料サービスのお試しとか?なんて思ってしまいます。
先ほどのISRGのスポンサーを見ていると、有料サービスのお試し、ということはなさそうですが…
A2.非営利団体が運営する全自動認証のSSL証明書だから
では、先ほどのLet'sEncrypt日本語サイトを見てみましょう。
Let's Encrypt は、認証局(CA)として「SSL/TLSサーバ証明書」を無料で発行するとともに、証明書の発行・インストール・更新のプロセスを自動化することにより、TLS や HTTPS(TLSプロトコルによって提供されるセキュアな接続の上でのHTTP通信)を普及させることを目的としているプロジェクトです。
ここが、無料である一つの理由です。
Let'sEncryptの手続きはすべて自動で認証されています。
つまり、人の手が関わっていないわけです。
ですから、運営にかかる費用がうんと低くなるわけです。
さらに運営元のISRGは非営利団体ですから、元からお金を取る気はありません。
こんな理由で、無料で利用できるわけです。
役員のメンバーやスポンサーを見た限り、今後も有料化することはないでしょう。
先ほど、非営利団体が運営する全自動認証のSSL証明書だから無料なのだ、と書きましたが、私はその奥に別の理由もあるのではないかと思っています。
発行を行うISRGの出資元は、ほとんどが企業ですから、なにか目的があって出資するのだと思います。
例えば、chromeの開発元であるgoogleは、常時SSLを推奨しています。
これはサイトがハッキングされ、マルウェアに感染することを防ぎたいと考えているようです。これらのマルウェアに汚染されたサイトが、自分達のサービスに悪影響を与えるかもしれませんから。
しかし、有料の証明書しかなければ、金銭的な理由からなかなか常時SSLのサイトは増えません。
個人でやるブログなんかは、あまり常時SSLにする必要性を感じにくいですから。
ですから、常時SSLの普及にはLet'sEncryptのようなサービスが欠かせないわけですね。
このように、様々な企業や団体の思惑が重なった結果として、Let'sEncryptという無料のサービスが出来上がったわけです。
こんな理由もあるのではないかな、と私は思います。
Q3.どのような仕組みなのか
先ほど、自動化という出てきましたが、どのようにして証明書の発行を行うのでしょうか。
人力の発行ではない、ということは何となくお分かりいただけているのでは、と思います。
A3.クライアントソフトと認証局が発行を自動化している
Let'sEncryptにおける認証方法
認証には、独自のクライアントソフトを使って行います。
このクライアントソフトはcertbotと呼ばれ、多くのLinux系ディストリビューションやmacOS版が公開されています。
残念ながらWindows版のcertbotはないので、ほかのツールを使うか、最近Windowsで利用可能となったbashを使うこととなります。
取得したいドメインを本当に証明するために、Let'sEncryptには主に2種類の認証方法が用意されています。それは
の2つです。
DNSでの認証では、_acme-challenge.(自分のドメイン名)に指定されたTXTレコードを設定します。
これを行うためには、DNSを自分で設定できる環境でなければならず、レンタルサーバーでは実現出来ないことが多々あります。
ファイルにて認証する場合、指定されたパスに指定されたファイルを置き、それを確認するというものです。
これは多くの方が実行可能でしょう。ホームページを運営しているなら、ファイルをアップできない、なんてことはあり得ませんから。
しかし、メールサーバーなどではこれは可能でないかもしれません。そんなときはDNS認証を行います。
認証を行う仕組み - ACME
認証の仕組みは少し専門用語が多くなります。暗号化に対する基礎知識がないと厳しいかもしれません。
でも大丈夫です。認証の仕組みを知らなくてもちゃんと使えるようになっています!
認証には、ACMEという通信プロトコルにて、クライアントソフトと認証局とのやりとりが行われます。
まず、クライアントソフトは認証してほしいドメインを認証局に通知します。
認証局はその通知に対して、認証に必要な情報をクライアントソフトに送ります。
ここで送られる情報は、認証用の番号と認証用ファイルで、認証局によって自動的に生成されます。
認証用ファイルは、先ほど説明したファイル認証でサーバーにアップロードする為のもので、DNS認証の場合にはファイルの代わりに登録すべきDNSレコードが送られます。
クライアント側は認証に必要な設定(ファイル認証なら指定のパスにファイルをアップロードする)を行った後、認証のための準備ができたことを認証局に通知します。
このとき同時に、先ほど送られた認証用番号をクライアントソフトが生成した秘密鍵で署名し、公開鍵とともに認証局へ送ります。
認証局が認証に必要な設定がされたかを確認し、またクライアントソフトから送られてきた認証用番号の確認を行います。
すべて確認が終了すると、正式に認証されたことがクライアントソフトに通知されます。
この一連の流れで認証が自動で行われます。私たちが直接行わなければならないのはクライアントソフトの実行と認証のための設定のみです。
認証自体の仕組みについては理解する必要はありません。
一度証明書が発行されたら、更新するのは簡単で、認証作業は必要ありません。
こちらが大変わかりやすく、参考になりました。詳しくは公式ページにも書かれています。
Q4.今後なくなることはないのか
Webサービスは、突如開発が中止されることはよくあります。
また、どこかの企業に吸収されてしまう、ということもしばしばです。
急に有料化してしまったら、httpsに対応させたものをわざわざhttpに戻さないといけないかもしれません。
それは非常に面倒ですよね。
では、無くなることはないのでしょうか。
A4.無くならない可能性が高い
正直なところ、Let'sEncryptが今後なくなる可能性はないとは言えません。
しかし、googleがSSLに対応しているかどうかを検索順位に考慮する、と発表するように、httpsの利用はさらに重視され普及が進むと思います。
ISRGが掲げる理念を基に考えると、この団体に金銭的な問題が起こらない限り、Let'sEncryptは無くならないでしょう。
スポンサーを見ると、主要なブラウザを開発する団体が資金提供を行っていますから、金銭的問題も起こりにくいのではないでしょうか。
つまり、Let'sEncryptが急になくなるとは考えにくいように思います。
Q5.誰でも発行できれば、サイトの信頼性を保証できないのではないか
最後の疑問となりました。
いろいろ調べていて、ふと思いました。
誰もが証明書を取得できたら、信頼性のある証明書では無いのではないでしょうか。
例えば、詐欺を行おうとする人であっても取得できるわけですから、サイトに対する信頼性を証明することが出来ないのではないか、と。
しかし、ここに私の思い違いがありました。
A5.サイト自体の信頼性を保証するSSL証明書は種類が別
SSL証明書はhttpsによって通信するためのツールであって、サイト自体の安全性を必ずしも保証するものではないのです。
私自身、『SSL証明書 = 安全性を保証する』という感覚を持っていましたが、実際にはそうとは限りません。
こちらにその事が丁寧に書かれています。
このページから引用すると、
SSL/TLSサーバ証明書には「ドメイン認証」「企業実在認証」「Extended Validation(EV)」の3種類が存在します。ドメイン認証は最も手軽な反面、ドメインの使用権のみを認証する証明書しか発行できません。組織の実在認証をするためには「企業実在認証」、「EV」を導入する必要があります。また企業実在認証もドメインの使用権と組織の法的実在の認証は可能ですが、それ以上の「組織の物理的実在」「組織の運営」などのより高度な認証を行うにはEVの導入が必要です。
と書かれています。
ここで書かれているように、企業実在認証やEVでなければちゃんとした通信相手なのかを保証することはできないということです。
Let'sEncryptはドメイン認証を行うだけですから、ドメインが存在することを証明しただけですから、相手がどうであるかは証明されていないのです。
しかし、ブラウザでは緑の鍵マークがでて、いかにも安全です、という印象を与えます。
これでは、もし詐欺サイトで使われていた場合、間違った印象を与えるでしょう。
私はこれがLet'sEncryptの欠点なのではないかと思います。
証明書が有料であった昔は、証明書が安全の証のようになっていましたが、これを改める時が来たのかもしれません。
最後に
長々と書いてまいりましたが、いかがだったでしょうか。
Let'sEncryptは大変素晴らしいサービスですので、皆さんにぜひぜひ使っていただきたいです。
ではまた。
会員制の動画共有サイトの構築した
こんにちは。
今日は、会員制Webページの構築についてです。
まずは、構築したきっかけから。
お急ぎの方は読み飛ばして下さい。
- とある日の会話にて
- 会員向けサイトの仕様
- ①サーバーは有料のサーバーで、十分なスペック
- ②ログイン機能にて、会員以外は見れないようにする
- ③ユーザー名とパスワードは事前に個々に送信し、全ユーザー共通
- ④ユーザーの新規登録は必要ない
- ⑤ホームビデオを共有
- ⑥SSLによるセキュリティ対策
- 参考にしたサイト
- テンプレート
- ログイン画面
- メインページ
- ログイン機能の実装
- 動画のプレイヤー
- テンプレート
- 最後に
とある日の会話にて
ある日、こんなことを言われました。
依頼主『君はプログラミングできるから、ホームページ作れるよね。』
自分『はい?簡単そうに言いますけどそれは…』
依頼主『ホームページは会員だけが見られるようなもので、セキュリティは万全にしといてね。』
自分(もう断る雰囲気じゃないじゃん…)
みなさん、こんな無茶ぶりされたことありませんか!?笑
私はありましたよ、つい最近。
プログラミングできるから、ホームページも作れるって…
その理論でいくとプログラマー全員がホームページ作れて、Webデザイナーが仕事を失うことになるんですよ!
というツッコミを入れたいところですが、いつもお世話になってる方なので断れません。
ということで、はじめて会員サイトを作ってみました。
Javaから見たSwiftとの違い ~for文編~
こんにちは。今回はSwiftネタです。
最近C#とSwiftに一気に手を出してしまったため、苦悶の日々を過ごしております(笑)
両方ちょっとだけ触ってみる予定だったのに…
そんなわけでSwiftに挑戦しているわけですが、よく分からないところが多い!
さらに、Swiftはバージョンがどんどんあがってるようで、今使われているのはSwift3というものだそうです。
そのため、ググってみても古い情報だった、なんてことがよくあります。
『ちょっと手を出したかっただけなのに、苦しめやがって、このやろう!』な気分なので、苦しめられたところをメモしていこうかな、と思います。
今回は、第一回としてfor文を扱っていこうと思います。
本記事をお読みの方へ
ここで注意点ですが、この記事はJavaなどのC言語的文法をもった言語から見ての感想が大いに含まれています。なぜなら私はJavaしか使ったことがない趣味のプログラマーだから。
ほかのもっとモダンな言語使いのプロフェッショナルな方々には、鼻で笑われてしまうような内容となっておりますので、これを読まずにもっとましなものをお読みください。
それでは参りましょう!
for文の基本構文
みなさん、for文使いますか?
うんうん、そうですよね、使いますよね!
巷では、for文を使わなきゃプログラミングしてるとは言わない、と言われてるとか言われてないとか。
ということで、Swiftでfor文を書こうと思うわけですが、これが一癖あります。
Javaではfor文は以下のようになります。
int a = 0; for(int i = 0; i < 10; i++){ a += i; }
aに0から9までを足し続けるという、びっくりするぐらいのくそコードですが、その際そんなことはどうだっていいんです(笑)
C言語もC#もほとんど一緒です。しかし、Swiftではこうなります。
var a = 0 for i in 0 ..< 10{ a += i }
for文が全然違うじゃないか!ってなりませんか!?
あっ、なりませんか。すいません。
少なくとも私はそう思いました。
forをいつものように書くとXcodeが怒ります。
おい、Cっぽい書き方をやめないか!的なエラーがでて驚かされます。
ここでぐぐってみると、Swiftにはモダンなforの書き方があって、上のものがそうだ、と知りました。
ちなみに、0..<10 は 0≦i<10 を、0...10は 0≦i≦10 を表すそうです。
上のソースを見ると、ちゃっかり型推論が使われています。varってなんかすごいなー、という気分になります。
色々なfor文
上に書いた書き方は、1ずつ増やして処理したい(i++する)時でしか使えません。ではそのほかの場合ではどうなるのでしょうか。
Javaと比較しながら書いておきます。見出しがJava的な書き方となっております。
for(i = 0; i < 10; i +=2)と書きたいとき
for i in stride(from : 0, to : 10, by : 2)
for(i = 0; i <= 10; i +=2)と書きたいとき
for i in stride(from : 0, through : 10, by : 2)
for(i = 10; i >= 0; i -=2)と書きたいとき
for i in stride(from : 0, through : 10, by : 2).reversed()
まとめ
stride()を使えば、刻み幅を変えることができます。toなら~未満を、throughなら~以下を表しています。
徐々に減らしていく処理では、最後にreversed()を付ければよいそうです。
ネットの記事ではよくreverse()とされていますが、そう書くとXcodeに怒られました。
最後に
いかがでしたでしょうか。今後もよく分からないところが出ましたら、その都度書いていこうと思います。
こういう書き方もあるよ!とかここは違うよ!といったアドバイスをいただけると、大変助かります。
ではまた。