ホーム > 技術系

技術系のアーカイブ

Javascriptでデータベース接続する方法

Javascriptでデータベースに値を挿入したり、取得する方法についてです。

基本的にはできない

結論からですが、基本的にはできません。

理由としては、Javascirptは、クライアントサイドの言語だからです。

クライアントサイドというのは、PC側のブラウザの機能で処理を実行するということです。

データベースというのは、サーバ側です。

そのため、サーバ側のデータベースから値を取得しようと思った場合、サーバ側で処理を実行する必要があります。

Javascirptはサーバ側で動くプログラムではないため、この処理は一般的にはサーバサイドの言語で行います。

サーバサイドの言語としては、例えばPHPやRubyなどがあります。

サーバサイドの処理として、これらの言語と組み合わせることが一般的には必要になります。

例外としてNode.jsを使えば可能

例外として、Node.jsを使うことでjavasciptの記述でデータベースに接続して処理を行う事が可能です。

Node.jsは、サーバ側の処理をjavascriptで行うことを可能としています。

jquery3で$.get is not a functionの原因と対処法

jquery3をサイトに導入していたところ、以前のjquery1系で動いていたプログラムが動かなくなったので原因を調べていました。

原因を調べる方法は、Safariの開発者用のツールで、開発→javascriptのコンソールで調べていたのですが、エラーの内容が

$.get is not a function

というものでした。

このエラーメッセージについて調べていたのですが、原因がわかりました。

読み込んでいたのはjquery3だったのですが、

https://code.jquery.com/jquery-3.3.1.slim.min.js

というライブラリを読み込んでいたのですが、この末尾についている「slim」というのが、容量を軽くするために、いくつかの機能を省いているバージョンらしいです。
getもその1つで、その他にもajaxなども動作しないようです。

そのため、読み込み先をslimでなく普通のjqueryに変更したところ動くようになりました。

https://code.jquery.com/jquery-3.1.0.min.js”

bootstrapについての勉強メモ

CSSフレームワークとして有名な、Twitter bootstrapについての勉強メモです。

bootstrapのインクルード

ダウンロードしてFTPでアップロードしなくてもCDNからincludeする記述ができます。

グリッドシステム

bootstrapは、12本のグリッドで構成されていて、幅を指定する場合にそのグリッドのどれだけを利用するかを指定でき、幅指定がスムーズです。

クラス

.container クラス

全体を囲うコンテナです。
画面幅によって可変です。

.container-fluid クラス
可変のコンテナです

.row
行に与えるクラス

.col
列に与えるクラス

.col-画面幅-グリッド数

画面幅
bootstrap3系 .col-xs Extra Samll オートレイアウト(全幅に対応、主にスマホ縦用)
bootstrap4系 .col- Extra Samll オートレイアウト(全幅に対応、主にスマホ縦用)
3、4共通 .col-sm Samll 576px(スマホ横)
3、4共通 .col-md Medium 720px (PC)
3、4共通 .col-lg Large 940px(PC)
3、4共通 .col-xl ExtraLarge 114opx(PC)

レスポンシブの対応

列のグリッド指定は、12を超えると自動的に折り返します。

この仕組みを使って、例えばレシポンシブで記述する場合は以下のようにします。

上記はBootstrap3系の場合で、bootstrapが4系の場合は以下の記述になります。
col-xsが4系ではcol-になっている他、containerだけでなく、rowで囲ってやらないといけなくなっています。

上記のように記述すると、スマホレイアウトのときは左カラムの下に右カラムが入ります。(.col-xs-12 4系では .col-12が適用される)
PCで見た時は、左カラムの横に右カラムが回り込みます(.col-md-4、.col-md-8)

メニューを折りたたみ式にしたい

collapseというクラスを指定することで、メニューを折りたたみ式にすることが可能です。

テーブルのtdの横幅

bootstrap4からは、 class=”w-◯◯”(◯◯は数字)で横幅を%指定できる。

WordPressでソースコードにSQLを直書きで新着記事を10件表示する

WordPressで、ソースコードにSQLを直書きで新着記事を10件表示するというのをやってみました。

やりたいこと

PHPのファイルにSQLを直書きで、新着記事から10件の記事を表示したい

何故SQL直書きが必要なのか

WordPressには、新着記事を指定件数表示する記述が準備されているので、通常であればSQL直書きで記事を取り出す必要はありません。

しかし、今回やりたいことは、WordPressのサブディレクトリにインストールした別のWordPress(ブログ用)から、新着記事を表示したいということです。

もともと、Simplepieというライブラリを使ってやっていたのですが、サイトをhttps化すると取得ができなくなってしまいました。(理由は分かりません)

そのため、仕方なしで、本体のサイトでブログのデータベースに接続し、そこから最新記事を取り出すことにしました。

SQL文は以下のようなかんじです。

一応解説すると
wp_posts ・・・ WordPressの記事が格納されているテーブル
post_title ・・・ 記事タイトル
guid ・・・ 記事のURL
post_status = publish ・・・ 記事が公開されている
order by post_date desc limit 10 ・・・・ 最新記事から10件

あとは、普通に while文でループして記事を出力したらOKでした。

PHPの勉強メモ

PHPについての勉強メモです。

namespace(名前空間)

php5系の途中から利用可能になった仕様。

namespace ◯◯;

で名前空間を定義することで、同名のクラスや関数も定義して同時に読み込むことができる。

例えば異なる名前空間で同名のクラスが定義されている複数のライブラリを読み込んでから使用する場合は、

new 名前空間名\クラス名;

のようにして使うことができる。

use文での省略

名前空間は、

namespace ◯◯\◯◯\◯◯;

のように、サブディレクトリのような形式で使用することができる。

これが長くなると、

new ◯◯\◯◯\◯◯\クラス名;

のようなかんじで、記述が冗長になる。
記述が複数箇所になればなお冗長になる。

このため、use文を使うことで

use ◯◯\◯◯\◯◯ as A

のような形で宣言すれば

new A\クラス名;

のような形式で利用でき、記述が簡潔になる。

また、この宣言はいろいろな記述が可能で

use ◯◯\◯◯\◯◯\クラス名;

のような形式で宣言すれば

new クラス名のようなかんじでいきなり使用できる他、

use AB\CD\EF;

のような形式で、asを省略した場合

use EF\クラス名;

のような形式で記述が可能となる。

また、

use AB\CD;

のようなかんじで途中まで定義して

new CD\EF\クラス名;

のような使い方もできる。

また、これは、クラス名だけでなくメソッドを呼び出す場合も同様の手順で行うことができる。

::(スコープ定義演算子)

スコープ定義演算子は、クラスの静的プロパティやメソッドにアクセスする場合に使用する。

一般的な方法では、

クラス名->メソッド;
クラス名->プロパティ;

といった書き方がしますが、意味はこれと同じで

クラス名::メソッド;
クラス名::プロパティ;

といった書き方ができますが、前者は対象が動的な場合で、後者は静的であることを表しています。

どちらも実行結果は同じですが、プログラムの読み手が、アクセス先が静的で動的かが見ると分かるということです。

Cake-phpの勉強メモ

Cake-phpは、MVCアーキテクチャで構成されているPHPのフレームワーク

MVCアーキテクチャとは、Model、View、Conrollerで分離されている、いわばSwiftのXcodeと似ている。

Configファイル

Model

View

最近のCake-php

昔に比べると下火になっているものの、現在でも使われている。
世界ではそこまで使われていないものの、日本国内では人気がある。
競合するPHPフレームワークとしては、Laravelなどがある。

Cake-PHPの導入

作業環境にLAMP環境が整っていることが前提。

まずは、インストールするためにComposerを導入する必要がある。

これは、PHPに関する各種ライブラリの依存関係を管理するためのツールなので、とりあえずCake-phpを導入するにあたって必要となる。

あればスムーズというか、例ではほぼ使っているのでほぼ必須といってもいいだろう。

実際にMacのローカル環境に導入してみた結果

Macのローカル環境で使えるApacheの環境にCakephpを導入してみた。

まずはComposerの導入だが、これは問題なく進む。

CakephpをApacheのテストディレクトリまで移動してプロジェクトを作成。

導入の時点でWarningが出ているが、とりあえず実行することができた。

作成したプロジェクトディレクトリを見てみると、Cake-phpのフレームワークのファイルが一式生成されている。

それで、サイトにアクセスしてみると、500エラー。

エラーログを見てみると、php-intl.soがないとかそういうかんじのエラーが出ていた。

phpの拡張機能でphp-intlが必要ということで、入れてみる。

まずは、Hombrewを使って、brew コマンドでインストールを試みるが、brewコマンドで昔はインストールできていたのだが、現在はできなくなっているらしい。

Macportsというパッケージ管理システムを使ったらインストールできるらしい。

Homwbrewがパッケージ管理でMacportsのパッケージ管理システムで、何がどう違うか分からないが、やってみるととりあえずMacportsのほうではインストールできた。

しかし、相変わらずcakephpのプロジェクトを作成し直してもエラー。

エラーを見ると、php-intl.dllがないということ。

調べると、場所に問題があるのが原因で移動したらいいということのようなので、php-intl.dllを探してみると、どこにもない。
そもそも、.dllファイルはWindows環境で必要なものらしく、MacのLinuxベースの環境では不要らしいのだが、とにかく動かないので駄目。

環境構築の時点でつまづいてしまい、お手上げ状態だったのだが、多くのケースでXAMPまたはMAMP環境が前提になっていたので、MAMP環境を入れてみたところ、あっさりと動いた。

MAMP環境では動いて、ローカルのMac環境では動かなかった、その違いは何なのかよく分からないが、とりあえず動いたのでOK。

チュートリアルで実装してみる

Cakephpの公式サイトのチュートリアルで実装してみる。

まず、モデルの部分

これは、データベースのテーブルごとの規約を書いているところ。
テーブルのカラムごとのバリデーション等を定義できる。

モデルには、Entitityオブジェクトと、Tableオブジェクトがある。

コントローラーは、サイトのURLの呼び出しに対して実行される実行内容と考えればいい。

/Controller/◯◯Controller.php

の場合、サイトURL/◯◯で呼び出される。

ビューは、Templateディレクトリの中で、URLの階層構造と同じようにディレクトリを設置して、作成する。

拡張子がctpというのが変わっているが、Smartyと違って独特の記法があるわけではなく、普通のphpファイルに近い。

しかし、phpのごちゃごちゃしたややこしい記述部分はControllerやModelの部分に映っているので記述は最低限のphpの部分だけになっていてhtmlがベースとなっている。
そのため、フロントエンドエンジニアの人がファイルの内容を見て修正したり内容を理解しやすいというわけだ。

Cakephpのライブラリのソースはどこにあるか

Cakephpで呼び出しているライブラリのソースコードは、以下の場所にありました。

/vender/cakephp/cakephp/src/

例えば以下のプログラムがあります。

それぞれのメソッドやクラスの意味を理解しようと思ったのですが、正直良くわからないので、おまじない的に覚えておいたほうがよさそうです。
(むしろ、そういうのをいちいち理解する必要がないのがフレームワークのいいところ?)

データベース接続

コネクションオブジェクトに対して

$connection->query($sql);

でsqlを実行できるが、パラメータは受け付けず、また、sqlインジェクションの危険性があるため危険

executeオブジェクトの使用を推奨。プリペアードステートメントが使用できる。

$connection->execute(‘SELECT * FROM articles WHERE id = :id’, [‘id’ => 1])->fetchAll(‘assoc’);

型に対してバインドすることも可能。

$connection
->execute(
‘SELECT * FROM articles WHERE created >= :created’,
[‘created’ => new DateTime(‘1 day ago’)],
[‘created’ => ‘datetime’]
)
->fetchAll(‘assoc’);

プリペアードステートメントは、prepareで準備してから別のところで当てはめることも可能。

$stmt = $conn->prepare(
‘SELECT * FROM articles WHERE published = ? AND created > ?’
);

// 複数項目のバインド
$stmt->bind(
[true, new DateTime(‘2013-01-01’)],
[‘boolean’, ‘date’]
);

// 1項目ずつのバインド
$stmt->bindValue(1, true, ‘boolean’);
$stmt->bindValue(2, new DateTime(‘2013-01-01’), ‘date’);

newQuery()メソッドでクエリオブジェクトを生成して、クエリビルダを使用することも可能。

$connection
->newQuery()
->select(‘*’)
->from(‘articles’)
->where([‘created >’ => new DateTime(‘1 day ago’)], [‘created’ => ‘datetime’])
->order([‘title’ => ‘DESC’])
->execute()
->fetchAll(‘assoc’);

connectionオプジェクトから、insert文とupdate、delete文を実行できる

$connection->insert(‘articles’, [
‘title’ => ‘A New Article’,
‘created’ => new DateTime(‘now’)
], [‘created’ => ‘datetime’]);

$connection->update(‘articles’, [‘title’ => ‘New title’], [‘id’ => 10]);

use Cake\Datasource\ConnectionManager;
$connection = ConnectionManager::get(‘default’);

取得した行をを配列に読み込む

// 1行読み込む
$row = $stmt->fetch(‘assoc’);

// 全行を読み込む
$rows = $stmt->fetchAll(‘assoc’);

行数を取得する

$rowCount = count($stmt);
$rowCount = $stmt->rowCount();

エラー情報の取得

$code = $stmt->errorCode();
$info = $stmt->errorInfo();

トランザクションを利用する場合は、コネクションオブジェクトからbeginとcommitを使用することで利用できる。

$conn->begin();
$conn->execute(‘UPDATE articles SET published = ? WHERE id = ?’, [true, 2]);
$conn->execute(‘UPDATE articles SET published = ? WHERE id = ?’, [false, 4]);
$conn->commit();

XAMPPについて

XAMPPとは、ローカル環境、またはサーバ環境に、開発環境を揃えるためのツールです。

サーバにOSをとりあえずインストールしただけの状態では、必要なツールがインストールされていません。

そのため、それらのツールを一式インストールしようと思った場合、それだけでも手間がかかります。

XAMPPは、これらの必要な開発環境を一式そろえてくれるのに便利なツールです。

XAMPの頭文字は

X・・・クロスプラットフォーム、Linux、Windows、Macに対応
A・・・Apacheウェブサーバ
M・・・MySQL
P・・・PHP
P・・・Pearl

の略です。
もともとはLinuxのみに対応していてLAMPPだったのが、後にクロスプラットフォームに対応したのでXAMPPになったそうです。

ちなみに、Mac用のXAMPPのことはMAMPPともいいます。
やることは同じです。

特に開発PCがWindowsの場合Linux系のOSではないので、ローカル環境に開発環境を揃えたい場合は手間がかかるので便利です。

サーバがLinux系のサーバであったり、MacOSの場合はそこまで必要性はないように感じます。

仮想環境とどう違うのか?

XAMPPとは、ローカル環境に必要なソフトウェアを一式揃えるソフトウェアです。

そのため、サーバの仮想環境を作成するソフトとは異なります。

サーバの仮想環境を作成するソフトには、有名どころではVagrant+Virtual Boxなどがありますので、仮想環境を作成する場合はそちらのほうがよいでしょう。

XAMPPはどちらかというと、一括インストーラー的なソフトというイメージですね。

しかし、厳密にいうと一括インストーラーというわけでもなく、例えばMacにはローカルにもともとphpが入っている場合はもともと入っているphpとは別にMAMPP用のphpもインストールされて、それらはインストールされても上書きされるわけでなく区別されます。
設定を変更することで、どちらのphpを使うかを選択できます。

AWSの勉強メモ(実践編)

AWSについて、実際に使ってみて試してみています。

AWSは無料で1年間の間ある程度使用できるので、無料期間中にいろいろ試してみるというかんじでやっています。

EC2サーバの作成

AWSの代表的なサービスであるAmazon EC2の使い方についてです。

AWSにログインして管理画面を開く

EC2を選択

インスタンスの作成を選択

利用するサーバの種類を選択する。
(ここでは無力枠のサーバから選択)
AWSではEC2サーバ作成時に、まずどのOSを使うかを選びます。
様々なOSの種類が準備されています。
Linux系のサーバやWindowsサーバ、

メモリなど、サーバのスペックを選択する画面が表示されるので、使いたい種類を選択する。
(ここでは無力枠のサーバから選択)

サーバスペック以外に、インスタンスの設定、ストレージの追加、タグの追加、セキュリティグループの設定を選択できる。

サーバを作成時にキーペアを設定する。
キーペアは、サーバにログインするのに必要となる鍵情報で、AWSが保有する公開鍵と、ユーザが保有する秘密鍵で構成される。
これはAWSの場合は必須となります。

以上でEC2インスタンスの作成が完了です。

サーバへの接続

macでは、

ssh -i 秘密鍵ファイルへのフルパス [email protected]インスタンスのIPアドレス

で作成したEC2インスタンスに接続できます。

秘密鍵ファイルはダウンロードした秘密鍵をローカル環境に保存しているフルパスです。

インスタンスの削除

インスタンスをチェックして、アクションからインスタンスの状態→削除を選択
terminatedを表示されたら削除されている

WordPressサーバを作る

インスタンスの作成から、最初のOSを選ぶところで、左メニューの「AWS Marketplace」を選び、WordPressを選択。

あとは通常のEC2インスタンスの作成手順と同じです。

作成したWordPressウェブサイトにアクセスする

コンソールからEC2インスタンスを選択すると、画面下にインスタンスのパブリックIPが選択されるので、コピーしてアドレスに入力すると、作成したWordPressサイトが表示される。

アドレス/admin または /wp-admin

にアクセスすると、管理画面のユーザID/PWが表示される。

ユーザ名はデフォルトは、「user」で、パスワードは

コンソールのEC2インスタンスを選択して、アクション→インスタンスの設定→システムログの取得でパスワードを書いてあるところがあるので確認できる。

Twitter開発者アカウントに軽い気持ちで申請したらリジェクトされた

1開発者として、Twitterの開発者用アカウントを取得してTwitter APIの使い方の練習をしたみたいと思ったので、とりあえず開発者用のアカウントに登録しようと試みてみました。

やってみたいと思ったのは、とりあえず勉強がてらということで、特定のツイートをタイムラインで検索して、特定のワードを含むツイートがあった場合に自分に通知するというアプリ。

それで、このTwitterの開発者用のアカウント、以前は取得が誰でもすぐできたらしいのですが、厳格化されているらしく、使用目的やアプリの仕様について詳しくTwitterの審査チームに伝えないと申請が通らなくなっているらしいです。

とりあえず最初に審査が来たのですが、Twitterチームからの返答としては

——————————————–

以下の情報を追加でください

・ あなたの使用例では、政府や公共機関がTwitterのコンテンツや情報にアクセスします
・ あなたの製品ややサービスや政府や公共機関が使用する特殊な使用例です

——————————————–

という内容だったのですが、ユーザとして政府や公共機関は想定していないので、それらはユーザとして使用しないということで返答しました。

すると返答として要約すると、

———————————————–

もっと詳しい仕様やユースケースをくれ

———————————————–

という内容のメールが来たので、具体的な仕様や想定例について最初に書いていた内容を詳しく書いて返信しました。
すると

————————————————-

あなたのTwitterの開発者用アカウントは許可されませんでした。
関心を持ってくれてありがとうございました。

—————————————————-

という返事が・・・。
さらに開発者用のアカウントにアクセスして、アプリのページにアクセスすると

————————————————-

あなたはアプリを作成できません。
あなたの開発者アカウントはリジェクトまたは凍結されたのでアプリを作成できません。

————————————————-

と表示されました。

申請した内容に問題があったのかと思い、メールで、何が問題があったのか教えて欲しいと送ったのが返事がなく、かつ、別のプランで再申請は可能かと書いたところ、これも返事がありませんでした。

正直、これは不親切極まりないと思ったのですが、調べてみたところ、同じアカウントで再申請できる箇所が今のところ見当たらないので、申請したTwitterアカウントを開発者アカウントとして使用することはできないようで、別のTwitterアカウントを作成して、そのアカウントから再申請するしかないようです。

開発者に対してTwitterの運営が厳しくなっている昨今の事情に加えて、ポリシーや解説が全部英語なので、それらのハードルが高い開発者としては、なかなか苦労が強いられますね・・・。

WordPressのソースコードを読み込んでPHP勉強

良いプログラムを書くには、良くできたプログラムのソースコードを読むことだということで、まずはオープンソースソフトウェアのWordPressのソースコードを読むことで、良いコードの勉強をしてみます。

ちなみにWordPressはPHPで書かれているのでPHPの勉強になります。

関数定義の前にコメント

関数名の前にはコメントがついている
その関数が何をする関数なのか、どのバージョンからか、グローバル変数、引数、返り値の型と、それぞれの解説が入っている

インデントはタブスペース

インデントはタブスペース1つで作られている。
タブスペースは半角空白4つ

defineの前にコメント

defineでマジックナンバーを定義する前にコメントが書かれている

requireの前にコメント

requireで外部ファイルを読み込む前に一行コメントが書いてある

現在のファイルの書き方

dirname( __FILE__ ) .

これで現在の階層のファイルの場所が読みだせる

コメント

ファイルの先頭に、そのファイルが何についてのファイルかのコメントが書かれている
コメントはあらゆる処理の前に書かれていて、他人から見てその処理が何なのか分かりやすい

プログラムの処理の流れ

index.php
テーマを使用することの宣言

wp-blog-header.php
ワードプレスの環境とテンプレートの読み込み

wp-load.php
ライブラリの読み込み
——————-
マジックナンバーの設定
wp-config.php
設定情報の読み込み
===================
設定情報の読み込み
wp-setting.php
セッティングの読み込み
#######################
load.php
関数定義ファイル
default-constant.php
初期値が設定してある
plugin.php
関数が定義してある
“””””””””””””””””””””””
class-wp-hook.php
クラスとメソッドの定義
“””””””””””””””””””””””

#######################

===================

——————-

wp()
ワードプレスのクエリの実行

template-loader.php
テンプレートの読み込み

スマホサイトのデザイン、UI研究

スマートフォンサイトのデザインやUIを、世界でもよく見られていると思われるサイトを見ていってコメントしていって、自分のサイトの鑑識眼を高めたいと思います。

Apple

Appleのサイト

https://www.apple.com/jp/

ジョブズ時代のAppleのサイトは、スマホで見てもスマートフォンに対応していないことで有名でしたが、現在はスマホに対応しています。
レスポンシブデザインで同じコードでPCとスマホの両方に対応しています。

サイトデザインの特徴としては、PCでは横長のグローバルメニューが、スマホでは同一メニューで折りたたみのハンバーガーメニューになるようになっている。

フッターメニューのデザインはこんなかんじ

フッターメニュー

ECサイトのヘッダでは、アプリへのリンクが表示され、誘導される。
ハンバーガーメニューは左上で二本線、右上は手さげカバンタイプのカートアイコン。

Appleサイト-ECヘッダ

ボタンのデザイン

Apple-ボタンデザイン

カートでのボタンはフラットデザイン。上のボタンはグラデがあるのだが、統一されていない?

Appleのボタンデザイン2

コンテンツエリアは写真が多く、見出しには見出しっぽい装飾がない。
左右にある程度マージンと行間の余白あり。

Appleコンテンツエリア

テーブルはあまり使用していない。

要素は縦に並べているのが多い。

スマホでは横に並べると要素が圧迫されるので、極力横並びの要素を使っていない。
PCでは見出しから横に要素を並べる場合でも、スマホでは縦に並べるようにしているところが多い。

Xcode/Swiftの勉強メモ〜ラベルが入力フィールド、ボタンで切り替わる〜

Xcode/Swiftでアプリを作成する勉強メモです。

作るアプリの仕様

テキストラベル、入力テキストフィールド、ボタン

この3つのパーツがあって

・ テキストフィールドに文字を入力することで、テキストラベルが入力した文字列に変更される。
・ ボタンを押すと、テキストラベルがデフォルトのテキストに切り替わる

というシンプルな仕様です。

実装の流れ

ストーリーボードにそれぞれのパーツを設置する

ストーリーボードを選択すると、画面にパーツが設置できるので、テキストフィールド、ラベル、ボタンをそれぞれ設置します。

設置するには、View→Libraries→Show Libraryで一覧が表示される他、ストーリーボード右上のLibraryのメニューアイコンからも表示されます。

ラベル、フィールド、ボタンのパーツをそれぞれ設置して位置や大きさを調整します。

ViewConrtollerにプログラムを記述する

ストーリーボードはUI的な部分になりますが、ViewControllerはプログラムの実装部分になります。

ViewConrtollerクラスにUIパーツを結びつける

ViewConrtollerクラスの内部に、ストーリーボードのUIパーツをControl+ドラッグして、アウトレットを作成します。

画面を分割して、片方にストーリーボードを表示し、片方にコードを表示することで片方からドラッグしてコードとUIを連結することが可能です。

それぞれ以下のように名称をつけます

ラベル:mealNameLabel
テキストフィールド:nameTextField
ボタン:UIで設置してメソッド名SetDefaultLabelText

メソッドSetDefaultLabelText内には、以下のコードを追加します。

mealNameLabel.text = “Default Text”

この時点でコンパイルしてテストして見ると、ボタンを押すとラベルの名称が「Default Text」に切り替わるプログラムが実行されます。

テキスト入力部分を実装

それでは、テキストを入力することで、ラベルが切り替わる部分を実装します。

まずは、

class ViewController: UIViewController {

となっているのを

class ViewController: UIViewController, UITextFieldDelegate {

と、 , UITextFieldDelegate を追加します。

これは、クラスがコンパイラに UITextFieldDelegate でもあると伝えています。

次に、 viewDidLoad() メソッドに、

nameTextField.delegate = self

を追加します。

これは、ロードされたときに、テキストフィールドが自身のdelegateであるとしています。

textFieldShouldReturn、textFieldDidEndEditingメソッドを実装

UITextFieldDelegateには8つのメソッドが用意されていますが、そのうちの2つをここでは使用します。

textFieldShouldReturn は、 テキストフィールドが改行された場合に自動的に実行されるメソッドです。

ここでは以下の記述を追加します。

textField.resignFirstResponder()
return true

これは、テキストフィールドを入力してリターンキーを押したときに、ファーストレスポンダを終了するということで、具体的には入力キーボードを閉じます。
この処理を入れないと、リターンキーを押してもキーボードが閉じず入力を終えることができません。

textFieldDidEndEditing は、テキストフィールドの編集が終わったときに呼び出されるメソッドです。

ここでは

mealNameLabel.text = textField.text

を追加します。

これは、ラベルにテキストの入力を反映させる処理になります。

以上を実装すると、仕様を満たしたアプリが完成します。

delegateとは何か

このサンプルで、UITextFieldDelegateというのがでてきたのですが、その概念がよく分かりませんでした。

調べてみたところ、deleateとは委譲とか代理人という意味で、まず ViewContrllerクラスに、UITextFieldDelegateクラスを継承することでUITextFieldDelegateで定義されているメソッドが利用可能になるのですが、それだけではtextfieldで利用可能にならず、

nameTextField.delegate = self

のような宣言が viewDidLoadで必要になるということだったのですが、このあたりは分かるような分からないようなかんじでした。

表示された画像をタップすることでスマホから画像をアップロードできるアプリ

まずは、ストーリーボードに、オブジェクトライブラリから、「imag view」を選択して配置する。

左ナビのメニューから「Assets.xcassets」を選択し、「+」ボタンを選択して「New Image Set」を選択し、画像をドラッグドロップでアップロードする。

ストーリーボーそに戻って配置したimage viewを選択し、Attributeインスペクタメニューから「image」の項目を、先程アップした画像を選択する。これでデフォルトの画像が設定される。

次にタップジェスチャを設定する。

オブジェクトライブラリから「tap gesture」を選択し、image viewの上にドラッグアンドドロップする。
上のメニューにタップジェスチャアイコンができ、image viewオブジェクトとタップジェスチャが紐付けられる。

次に、ViewControllerにimage viewをコントロールドラッグし、アウトレットとして接続する。

タップジェスチャアイコンをVIewControllerにドラッグドロップし、タイプを「UITapGestureRecognizer」に設定する。
メソッドの中に実行する内容を追加する。
内容としては、キーボードを隠し、フォトライブラリの画面に画面遷移を行うというもの

ViewContorollerに UIImagePickerControllerDelegate, UINavigationControllerDelegate をスーパークラスとして追加

準備されている関数として、imagePickerControllerDidCancel、imagePickerControllerを追加。

関数は準備されているもので、内容が空になっているので、実行内容をそれぞれ追加する。

関数はスーパークラス「UIImagePickerControllerDelegate」の中にそれぞれ定義されている。

imagePickerControllerDidCancel
ユーザがフォトライブラリをキャンセルしたときに自動的に実行される。
ユーザがフォトライブラリでキャンセルしたときにフォトライブラリを消すというもの

imagePickerController
ユーザがフォトライブラリで画像を選択したときに自動的に実行される。
ユーザが選択したオリジナル画像をimage viewに設定し、フォトライブラリを消す

最後に、左メニューから「info.plist」を選択し、一番下の項目に「+」を選択し、「Privacy-Photo Library Usage」を選択し、Valueとして「Allows you to add ptors to your meals」とコメントを追加。
これは、iOS10から必要になった機能で、プライバシーを求める場合にユーザに対して文面を表示する機能で、ないと実行できません。
この場合はフォトライブラリにアクセスするので、必要になってきます。

オブジェクト指向について

オブジェクト指向プログラムは、特定の属性とメソッドを持ったクラスを定義して利用する仕組みのことです。

オブジェクト指向のメリット

ポリモルフィズム

クラスの継承の概念を利用することで、同じ名称のメソッド(関数)で、異なる挙動をすることができます。
オブジェクト指向を概念を使っていない場合、例えば車の「走る」メソッドと、バイクの「走る」メソッドを作る場合、それぞれ別名の関数を定義しないといけません。
オブジェクト指向を使っている場合、走るメソッドは名称としては1つでも、それぞれ車クラスから、バイクのスーパークラスを定義することで、同じメソッド名で異なる挙動をさせることができます。
何のメリットがあるかというと、結果的に定義するメソッドの数は同じですが、メソッド名は1つで済むのでよりシンプルです。(そのかわり、複数のクラス名は存在します)
これをポリモルフィズムといいます。

カプセル化

カプセル化とは、外部から見たときにその内容が分からないことです。
クラスを定義して、そのメソッドを呼び出すだけなので、プログラムのその部分を見たときにはシンプルです。
そのため、複数の人で作業する場合、作業する人は自分が担当する箇所の修正に集中できます。

まとめ

オブジェクト指向は、共通した性質を持っているものの意味が違う複数の機能やふるまいを実装する場合に便利です。

プログラムを実装する場合に、前段階で、作成するこの複数の機能は、この部分は共通してこの部分は異なっていると、そのようなことが分かっている場合、共通している性質をスーパークラスとして定義し、異なる部分をサブクラスとして定義することで、実装や修正にかかるコストを削減できます。

また、プログラムが全体としてまとまりとして分かれるため、分かりやすくなるメリットもあります。

オブジェクト指向を使ってプログラムを実装する場合、実装前に設計の段階である程度クラスを定義したり設計を考慮する必要があります。

パーミッションについて分かりにくいのでまとめた

  • 2018年10月23日 10:09 PM
  • Linux

linuxでサーバ上の作業を行っていると、必ずパーミッションという概念にぶつかる。

chmod 755 とか

chown とか

いろいろあって、何となくわかったようでわからないようなかんじのするあれだ

今一度パーミッションの概念についてまとめてみた。

まず、パーミッションで3桁の数字があるが、これは左から所有者、グループ、その他の順である。

所有者というのは分かりやすく、そのファイルやディレクトリを作成したユーザのことだ。(chownで変更は可能)

グループというのは分かりにくいが、そのファイルを所有しているグループのことだ。

linuxでは、ユーザはならず何らかのグループに属している。
グループには複数のユーザが所属している。
設定次第では、ユーザが複数のグループに所属する場合もある。

そのファイルのグループに対してのパーミッションということである。

分かりやすくいうと、1つのパソコンに複数のユーザがログインすることを想定したとして、それぞれに固有のユーザIDとパスワードでログインしていると想定する。
そのときに、グループに読み出し設定を与えていると、同じグループに所属しているユーザであれば閲覧が可能で、グループ以外のユーザであればアクセスできないと言った挙動が可能だ。

グループの概念は、個人PCや個人で管理しているサーバの場合はあまり必要がない概念だが、複数のユーザが異なるID/PWでアクセスするPCやサーバの場合理解しておくことが必要がある。

その他は、それ以外のユーザで、所有者でもなく、グループでもないユーザだ。

また、7という数字は、2進数の3桁で表されていて

読み出し 書き込み 実行

で、

7:111:全て可能
6:110:読み書き可能
5:101:読み実行可能
4:100:読みだけ可能
3:011:書き込み実行可能
2:010:書き込みのみ可能
1:001:実行のみ可能
0:000:全て不可

といったかんじだ。

ファイルやディレクトリは、作成時のユーザとグループが与えられるが、それぞれchownコマンドで変更が可能となっている。

Ansibleについての勉強メモ

Ansible

Ansibleについての勉強メモです。

Ansibleとは

  • レッドハットが開発した構成管理ツール
  • サーバを立ち上げてのソフトウェアのインストールや設定をPlaybookと呼ばれる設定ファイルを作ることで、Playbookの内容に沿って自動で行える
  • メリットとしては、複数のサーバを運用する場合、数が多くなればなるほど、サーバの設定を1つ1つ手動でやるのは時間がかかり、設定漏れの問題もある
  • Ansibleをはじめとする構成管理ツールを使うことで、あらかじめ定められた手順に沿って一瞬でサーバ構築をすることができる。

どういうときに必要か

複数のサーバ環境を整える必要があり、手動でやると一つ一つ手間がかかって大変だし、設定漏れが出る可能性があるが、Ansibleを使うことで一瞬で設定して同じ状況を作ることができる。
設定漏れも防ぐことができる。

Chefとの違い

  • ChefはRubyだがAnsibleはPython
  • エージェントレス
  • 記述がYAMLなので学習コストが低い(反面、複雑になると苦手)

Ansibleの利用手順の例

まず Vagrant + VirtualBox を導入

サーバを利用環境の中に立てる。
別に仮想環境でなくてもいいのだが、テストをするのに仮想サーバを使うと便利。

Vagrantの設定ファイルに仮想サーバの設定情報を記述する
Controller、targetの2つのサーバを作成
controllerのサーバにAnsibleを導入して、targetのサーバを操作する

OS情報、ネットワークIPアドレス、ポート番号などを記述

VagrantにOSテンプレートを追加

Vagrant up で設定ファイルに記述した仮想サーバを作成

controllerのサーバにyumでAnsibleをインストール
Ansibleの動作要件にはpythonが必要

Controllerのサーバからtargetへの疎通が必要なため、公開鍵を入れておく

Contorollerのサーバへログインし、inventoryファイルを設定。
これは、対象サーバのIPアドレスを記述する

Controllerから対象サーバへの疎通を確認する

Contorollerにyml形式でplaybookを作成する。
記述は独特の形式なので勉強が必要

記述例として、ホスト、ユーザ、実行するタスクを複数記述する
変数や配列は 別の group_vars/target.yml 内に記述することで記述を簡略化できる

ansible-playbookコマンドでplaybookの内容を実行
実行時に、inventoryの場所と、playbookを指定

Ansibleの便利な点

冪等性(べきとうせい)の担保

例えば同じplaybookを複数回実行した場合、実行対象のサーバに対してすでにPlaybookに記述された状態になっている場合、その状態を実行しない。
例えばcopyをplaybookに設定してある場合、上書き処理も実行しない。

Dockerについて

Dockerについての勉強メモです。

Dockerとは

Dockerとは、コンテナ型の仮想化環境を提供するオープンソースソフトウェア。

VMWare、Virtual boxをはじめとする、1台のコンピュータの中に複数のOSを導入する仮想化技術の1つとして注目されている。

Dockerの仮想化技術のポイントとしては、通常の仮想化ソフトウェアは、1台のOSの上に、ハイパーバイザーを使うことで複数のOSをインストールしていたが、DockerはOSの部分は複数の仮想環境で共有して利用し、その上に入っているライブラリやミドルウェアは仮想環境ごとに分けて利用する。
このため、仮想環境のOSのベース部分を共有しているためリソースに無駄がないため効率的である。
また、異なる環境を複数構築したり、コピー、削除したりする場合も他の仮想化技術と比べると効率的にできる。

一方で、1台にマシンで異なるOSを使用したい場合はDockerは適切な方法ではない。
同じOSの複数の環境を構築したい場合に向いている技術である。

なぜ仮想化技術が必要なのか?

目的として複数のOS(例えばWindowsPCとMac)を使用したいときに、仮想化技術がなければOSごとに複数のハードウェアマシンを購入する必要がある。

このため、複数のマシンを購入する必要があるため、価格が多くかかる。

物理的なスペースも多く必要がある。

一方で、仮想マシンを利用することで1台のマシンに複数のOSを入れることができ、利用者が切り替えることで1台のマシンで複数のOSを利用できる。

このため、2台購入する必要がないので価格、設置スペースまた電気代など節約できる。

仮想化技術は、1台のマシンの中にメモリやCPU、またはディスク容量などのリソースが多めにあって、1つの環境だけでは余っている場合に有効な技術である。

Dockerとはどのような場合に有効なのか

サーバ、あるいはローカル環境で、あるアプリケーションが動作する環境を構築しようとする場合、同じOSでDockerを使用していない場合、ライブラリの依存関係が発生し、環境が複雑になる場合があります。
DOckerを使ってそのアプリケーション専用の環境を構築することで、これらの依存関係は無視できます。

また、あるミドルウェアをバージョンアップした場合に、動作し直すようにその上にあるプログラムを全てチェック、修正をする必要があります。
この場合、Dockerを使ってミドルウェアのバージョンを環境ごとに分けることができます。

また、あるアプリケーションが動作する環境を構築しようとした場合、その環境構築作業だけでも手間がかかる場合がありますが、dockerを使えばイメージを利用することで簡単に環境構築をすることができます。

また、サーバ技術として、サーバ上に複数の役割を持ったサーバを構築したい場合にも向いています。

ポイント

様々なサーバ仮想化技術において、コンテナはOSに関する部分を複数のコンテナで共有しているため、サーバごとのOSのための領域が不要になるため、そのぶんサーバのリソースが有効に活用することができる他、設定の手間も省ける。

Dockerはどんな場合に向いていないか

Dockerは単一のOSの上での複数の環境を構築する技術なので、例えばMacOSとWindowsを1台のマシンに入れたいという場合は、VMWAREやVirtualBoxといったツールが向いています。

Dockerと競合する技術

環境構築でVirtual Box+Vagrantや、VMareと競合しています。

Dockerを使用する流れ

Dockerをインストール

Dockerの起動、自動起動設定

コマンド

docker image
ローカル環境のDockerイメージを確認できる

docker ps -a
ローカル環境のDockerコンテナ一覧の確認

docker run 公開されているコンテナ名
Docker Hubで公開されているコンテナをダウンロードしてコンテナを起動する

オプション:
-d コンテナをバックグランド実行
-name コンテナ名を指定
-p ホスト側ポート:コンテナ側ポート ホストとコンテナ間のポート設定

docker pull 公開されているコンテナ名
公開されているDockerイメージをローカル環境にダウンロードする

docker rm コンテナ名
docker rm コンテナid
起動したコンテナを削除する

docker rmi コンテナ名
docker rmi コンテナid
起動したコンテナをローカル環境のイメージごと削除する

docker stop コンテナ名
コンテナを停止する

Docker Compose

Dockerの管理を楽にするツール。

導入することで、コンテナの設定をymlファイルにまとめることができ、コンテナの起動や停止を複雑なコマンドでなくシンプルに使用できる。

普通にコンテナを起動する場合は、コマンドラインがオプションで長くなって複雑になるが、長い部分をymlファイルに移るのでそのぶんコマンド実行がシンプルになる。

公開されているDockerイメージを使うことも、自分自身でイメージをビルドすることもできる。

Vue.jsについての解説

Vue.jsとは

Vue.jsとは、javasriptを使ってサイトを構築するときに役に立つフレームワークです。

もともと、javascriptでサイトを構築する場合には、jqueryが便利でよく使われていて、様々な表現をするのに定番となっていました。

しかし、サイト構築にjavascriputが使われるうち、より大規模に使用したり複雑な処理を行う場合、jqueryで行う場合に処理が遅かったり、または実装する際に複雑になったりする問題が起きてきました。

そこで、Jqueryに替わるjavascriptのフレームワークとして、angular.jsや、React.js、Vue.jsなどがよく使用されるようになってきました。

これらのフレームワークは、javascriptを使ってより複雑なサイトを構築したり表現をするのに有力な選択肢となります。

中でもVue.jsは、一番熱い?フレームワークとなっています。

Google Trendsで検索回数を調べてみても、Reactやangularよりもより多く検索されているようで、Githubでのスターの数も多いようです。

開発は、もともとGoogleでangular.jsを開発していた中国人の方がされているようです。

使い方

Vue.jsの読み込み

ヘッダに以下を記述でインストールできます。

読み込むスクリプトは、jqueryなどと同様に、 完全版やmin、runtime版など様々なビルドがあります。

軽量化したいのであれば、なるべく必要最小限のものを読み込んだほうが容量が少なくなります。

記述の仕方

通常のjavascriptであれば、まずは普通にhtmlを記述して、javascriptの処理をヘッダ内、あるいはヘッダ内で読み込む外部のjsファイルに記述します。

htmlはidやクラスでコーディングし、それをjsで操作するといったイメージです。

Vue.jsの場合は、Vue.jsの独特の記法でhtmlの関連する箇所を記述していきます。

また、javascirptも、Vue.jsの独特の記法があります。

まずは、使うにあたって、これらを覚える必要があります。

ただ、htmlはhtmlとして書いて、javascirptの処理は外部から読み込むと、この流れは同じです。

ただし、記法は独特です。

Vue.jsのサンプル

公式サイトで様々なVue.jsを使った実装のサンプルを見ることができます。

https://vuejsexamples.com/

VagrantとVirtualBoxについて

技術関係で調べ物をしていると、「Vagrant+VirtualBox」を導入します。

とよくでてくるのですが、意味がよく分かっていなかったので調べていました。

Vagrantとは、PCの仮想環境を構築するのを手助けするソフトです。
仮想化ソフトとしては、VirtualBoxのほうが本体なのですが、VirtualBoxだけでは、仮想環境を構築するための設定がややこしいです。

Vagrantをインストールすることで、仮想環境の設定の手間を省けるので、セットになって用いられるることが多いです。

実際はVagrantがなくても、VirtualBoxだけでも仮想環境を構築することが可能です。

ややこしい点

仮想環境を構築するソフトウェアやモジュールなどは、Vagrant+VirtualBox以外にもたくさんあります。
そのため、調べているうちに様々な仮想環境構築方法にであうことがあるため、混乱をきたしてしまいます。

その他の言葉との違い

IT業界ではたくさんの言葉が出てきて混乱します。
似たような言葉との違いです。

仮想化ツール

venv
pythonの仮想環境を構築できるモジュールです。

VMware
Windowsの仮想化ソフトウェア

コンテナツール

Docer

パッケージマネージャ

パッケージマネージャは、モジュールなどが重複しないように依存関係に対処したりするツール。
特定のツール導入時に、必要なライブラリを自動でインストールしてくれる。

homebrew
Macのパッケージマネージャ

pip
pythonのソフトウェアパッケージを管理する。python用のyum?

composer
phpのパッケージ管理ツール。

コンテナとの違い

Dockerをはじめとするコンテナ技術の違いとしては、コンテナは同一のOSの上に、異なるサーバ環境を構築します

Virtual Boxをはじめとする仮想化ソフトウェアは、PCのハイパーバイザを分割し、その上に複数の異なるOSを導入できます。

そのため、仮想化ソフトウェアはその分環境ごとに容量が多かったり設定の手間が大きいデメリットがありますが、そのぶん仮想環境ごとの自由度は高いといえます。

単純にいえば、OSは同じでその上のミドルウェアなどを自由に構築したい→Docker、OSも別々にしたい→仮想化ソフトウェアといったかんじでしょうか。

Google:Descending into ML: Linear Regression(線形回帰)の和訳

GoogleのDescending into MLの和訳です。

元記事
Descending into ML: Linear Regression

機械学習へ降りる:線形回帰

コオロギ(昆虫種)は、涼しい日よりも暑い日に多く鳴くことが長く知られています。

約数十年間、専門家とアマチュアの科学者は、1分あたりの鳴き声と気温のカタログデータを持っています。

誕生日プレゼントとして、おばさんはコオロギのデータベースをくれて、この関係性の予測を学習するように頼みました。

このデータを使って、この関係性を調査したいです。

最初に、プロットすることでデータを調べます。

図1:1分あたりのコオロギの鳴き声
図1:摂氏の気温とコオロギの1分あたりの鳴き声の関係

予測としては、気温と共に鳴き声が増加していることを表しています。鳴き声と気温の間の関係は線形でしょうか?
はい、あなたはこの関係を以下のような1つの直線にすることができます。

図2:線形の関係
図2:線形の関係

はい、ラインは全ての点を通ってはいませんが、線は明らかに鳴く回数と気温の関係性を現しています。

線を等式を使って表すと、以下のように関係性を書くことができます。

y = mx + b

ここで

・ yは予測しようとする摂氏の温度です。
・ mは線の勾配です。
・ xは分あたりの鳴く回数で、入力値です。
・ bは、yの切片です。

機械学習の慣例として、少し違うように以下のように書きます。

y’ = b + w1x1

ここで

・ y’は予測するラベルです。(望まれる出力)
・ bはバイアス(yの切片)で、w0を参照します。
・ w1は特徴1の重みです。重みは、伝統的な線形の等式の勾配mと同じ概念です。
・ x1は特徴です。(明示的な入力)

新しい分あたりの鳴く回数x1の温度y’を予測するために、ただx1の値をモデルに置換します。

このモデルが単一の特徴を使うと課程して、より洗練されたモデルは複数の特徴を頼りにし、それぞれは別の重み(w1、w2、etc…)を持ちます。
例として、このモデルは以下のような3つの特徴を頼りにします。

y’ = b + w1x1 + w2x2 + w3x3

訓練と損失

モデルを訓練するのは、単純な意味としては、ラベルの例から全ての重さとバイアスのための良い値を学習(決定)することを意味しています。
学習の監督として、機械学習アルゴリズムは、多くの例を調査することによってモデルを構築し、損失を最小化するモデルを発見することを試みます。このプロセスはempirical risk minimization(経験損失最小化)と呼ばれます。

損失は悪い予測に対してのペナルティです。それは、損失は、単一の例のモデルにおける予測がどれだけ悪いかを指し示す数です。
もしモデルの予測が完全だったとすれば、損失は0になります。
それ以外では、損失はより大きくなります。
モデルを訓練することのゴールは、全ての例においての平均の少ない損失を持つ重さとバイアスを見つけることです。
例として、図3では左に高い損失のモデルを、右に低い損失のモデルを示します。

図では以下のことを示しています。

・ 赤の矢印は、損失を表しています。
・ 青の線は予測を表しています。

図3:左が高い損失のモデルで、右が低い損失のモデル
“図3:左が高い損失のモデルで、右が低い損失のモデル

左図の赤の矢印は右図に比べてより長いことに注意してください。
明らかに、右図の青い線は左図に比べてより良い予測になります。

意味のあるやり方における個々の損失の集合させる数学的な関数-損失関数-を作ることできないかどうか不思議に思うかもしれません。

二乗損失(squared loss):有名な損失関数

ここで私達が検討するであろう線形回帰モデルは二乗損失(L2損失としても知られる)と呼ばれる損失関数を使用しています。
単一の例に対する二乗損失の例は以下のようになります:

= ラベルと予測の差分の二乗
= ( observation -prediction(x))2
= ( y – y’)2

平均二乗誤差-Mean scuqre error(MSE)は全データセットにおける例の平均の二乗の損失です。
MSEを計算するには、個々の例の損失の二乗を総和し、例の個数で割ります。

MSE = 1/N Σ (y – prediction(x))2

ここの

・ (x,y)は以下の例です
 ・ x はモデルが予測を生成するのに使う特徴のセット(例として、1分あたりのコオロギの鳴き声、年齢、性別)です。
 ・ y は例のラベル(例として、気温)です。
・ 予測xは、特徴セットxの組み合わせにおける重みとバイアスの関数です。
・ Dは(x,y)における多くのラベル付けされた例を含むデータです。
・ NはDにおけるいくつかの例です。

MSEはマシンラーニングにおいて頻繁に使われますが、唯一の実用的な損失関数でもなければ、全ての状況における最善の関数でもありません。

理解度のチェック

平均二乗誤差 (Mean Squared Error)

以下の2つのプロットを考えます。

平均二乗誤差左

平均二乗誤差右

以下の選択肢を考えてみてください。

どちらの前述のデータセットが高い平均二乗誤差(MSE)でしょうか?

・ 下のデータセットです。

◯ 正解です。
8つの線形の例はトータルで損失が0です。
しかしながら、2つの点は線を外せていますが、両方の点は上図の外れ値の点の2倍です。
二乗損失はそれらの差分を増幅し、2つのオフセットは1つのオフセットよりも4倍大きい損失を招きます。

数式1

・ 上のデータセットです。

☓ 不正解です。

6つの線上の例は、トータルの損失が0です。
4つの線上の例は線からそれほど離れていませんが、それらのオフセットの2乗は低い値を生み出します。

数式2

MySQLのビュー内でのサブクエリとビューの扱いについて

MySQLで、複数のテーブルを組み合わせた処理を行うときに、ビューは便利な機能です。

ビューを使うことで、よく使うテーブルの組み合わせで都度構文を組み立てる必要がなくビューを呼び出すとよいだけに簡素化されます。

ただし、ビューでも定義するときに、複雑な処理のビューを作ろうと思った場合、注意する必要があります。

まず、ビュー内でサブクエリを呼び出すのは、特定のバージョンまではできなかったのですが、最新のバージョンではできるようになっているようです。
MySQL 5.7、MariaDBなら10.2以降はできますが、それ以前のバージョンではできません。

その場合で少し複雑なビューを作ろうと思った場合、複数のビューを組み合わせることで実現可能です。

まずビューの中で呼び出そうと思っていたサブクエリにあたるビューを定義し、そのビューをビューを定義する際に呼び出すといったやり方です。

file_get_contentsがNULLを返すようになった原因の調査

PHPで、あるプログラムを作成していて、file_get_contents関数で特定のURLからJSONファイルを取得するという処理を行っていたのですが、以前は動作していたプログラムが、サーバ移行後に file_get_contents関数で取得できなくなってしまった現象に遭遇してしまったので調査と対応について記しておきます。

状況

・ 特定のURLから file_get_contents関数でJSONファイルを取得し、後に処理

・ 以前は動作していたが、サーバ移転後に動作しなくなった

・ レスポンスヘッダもNULLを返すようになっていて、原因が不明

調査

まず、エラーログを見て file_get_contents 関数がエラーになっていないかどうかを調べてみたのですが、エラーにはなっていませんでした。

結果からいうと、エラーになっていたわけではなく、取得がNULLになっているという謎の結果。

解決

ファイルを取得するのに、file_get_contents関数ではなく、cURL関数を使うことで解決できました。

以下の記事が参考になりました。

file_get_contents関数が動かなかった場合の方法 | Tips Note by TAM

cURL関数を使うことで、file_get_contentsとほぼ同じ動作をする関数を定義して、使用しました。

何故 file_get_contents 関数が新しいサーバで動作しなかったのかについては不明ですが、代用の関数でなんとかなりました。

Googleの自動広告で、モバイル全画面広告だけは削除した

だいぶ前からですが、Googleが自動広告を出す設定にしていて、それを利用しているユーザも多いのではないかと思います。

Googleの自動広告は、設定で「テキスト広告とディスプレイ広告」「インフィード広告」「記事内広告」「関連コンテンツ」「アンカー広告」「モバイル全画面広告」の6種類があります。

私も運営しているサイトにGoogleの自動広告を導入していたのですが、このうちで「モバイル全画面広告」だけは削除しました。

なぜモバイル全画面広告を削除したか

以下が、なぜモバイル前画面広告を削除したかの理由についてです。

1.ユーザ体験を著しく悪化させる

なぜモバイル全画面広告を削除したかというと、まず自分のサイトをスマホでチェックしているときに、リンクをクリックしたときに画面全体に広告がバンと表示されるのですが、これは、そのサイトを使うのをやめたくなるレベルで印象が悪いマイナスの体験でした。

いくら広告がクリックされて収入がでても、こんなに露骨に広告が表示されるサイトは使いたくないと思ってしまいました。

2.収益、クリック数が少ない

Adsenseのレポートを確認してみたところ、自動広告全体のパフォーマンスは優れていましたが、その中でのモバイル全画面広告のパフォーマンスはあまり良いとはいえませんでした。

クリック率は他の広告と比べても悪くはなかったのですが、表示回数が少ないので収益も全体からすると大きな割合ではありませんでした。

まとめ

自分で使ってみて単純に邪魔だったのと、収益がよくないという2つの理由から、自分の運営しているサイトからモバイル全画面広告を外しました。

GoogleのMachine Learningの学習サイト和訳

AIの勉強として、GoogleのMachine Learningのサイトを見て勉強しているのですが、全部英語なので理解がてら翻訳で書いていきます。

機械学習とはなにか?

機会学習のシステムは、入力値をどうやって混ぜ合わせて、まだ見たことがないデータを予測することを学習します。

用語集

Label:ラベル
ラベルはyを予測するにあたっての真の事象です。
基本線形回帰における変数yです。

Features:特徴
特徴や、データを描画する入力値です。
基本線形回帰における、{x1、x2・・・・xn}変数です。

Example:例
xで、データの実体です。

Labeled example:ラベル付けされた例
特徴で(x,y)です。モデルを学習するのに使います。

Unlabelede example:ラベル付けされていない例
特徴で(x,?)です。新しいデータを予測するのに使います。

Model:モデル
モデルはからy’を予測するためのマップです。
学習した内部のパラメータによって定義されます。

モデルは特徴とラベルとの間の関係を定義します。
例として、スパムフィルターモデルはス確かな特徴をパムと関連付けます。

モデルの2つのフェーズをハイライトしましょう。

トレーニング(Traigning):
トレーニングはモデルを構築まあは学習することを意味します。
それは、ラベル付けされた例をモデルに見せることで、特徴とラベルの間の関係を徐々に学習することを可能にします。

推論(Inference):
推論は、訓練したモデルをラベル付けされていない例に適用することを意味します。
それは、学習されたモデルを使って有用な予測y’を作成します。
例として、
推論の間に、ラベル付けされていない例のための住宅価格の中央値を予測することができます。

回帰(regression) vs 分類(classification)

回帰モデルは連続した値を予測します。
例えば、回帰モデルは以下のような回答を予測します。

・ カリフォルニアの住宅価格は?
・ ユーザの広告のクリック率の予測は?

分類モデルは、離散的な値を予測します。
例として、分類モデルは以下のような問題の回答の予測を作成します。

・ 電子メールメッセージはスパムかそうでないか
・ この画像は犬か、猫か、ハムスターか

学習の監修

以下のオプションを探索してみましょう。

電子メールがスパムかそうでないかを予測するために、監修された機械学習のモデルを開発するのを監修します。
以下のどの文章が正解でしょうか?

・ いくつかの例に適用したラベルはあてにならない。

正解
その通りです。どうやってデータの信頼性をチェックするかは重要です。このデータセットのラベルは電子メールのユーザから来ていて、電子メールをスパムとマークしています。
多くのユーザが全ての疑わしい電子メールをスパムとマークしているわけではなく、私達は電子メールがスパムであるかどうかを知るのに苦労します。
それに加えて、スパマーは意図的に間違ったラベルを提供することで私達のモデルを汚染します。

・ ラベル付けされていない例をモデルを訓練するのに使用します。

不正解
私達はラベル付された例をモデルを学習するのに使用します。
私達は訓電されたモデルを、ラベル付けされていない例がスパムかそうでないかを判定するのに対して使用します。

・ サブジェクトのヘッダーに含まれる語句はよいラベルになります

不正解
サブジェクトのヘッダに含まれる語句は素晴らしい特徴ですが、よいラベルではありません。

・ スパムにもスパムでないのにもマークされていない電子メールはラベル付けされていない例である。

正解
なぜなら私達のラベルはスパムかそうでないかの値を含んでいて、全てのスパムかそうでないかをマークされていない電子メールはラベル付されていない例です。

特徴とラベル

以下の選択を調べてみましょう。

オンラインの靴店は、ユーザに対して最適化した靴をおすすめするように監督した機械学習モデルを想定としています。
それで、そのモデルは正しいペアの靴をマーティーと、別の靴のペアをジャネットに対しておすすめします。
以下のどの選択肢が正しいでしょうか。

・ 靴の美しさは使える特徴です。

間違いです。
良い特徴は、具体的で定量化できるものです。美しさは、よい特徴となるにはかなり漠然としたコンセプトです。
美しさはおそらく正しく具体的な特徴であるスタイルや色を混ぜ合わせたものです。
スタイルや色は美しさと比べるとよい特徴といえるでしょう。

・ 靴のサイズは使える特徴です。

正解です。
靴のサイズは定量的なシグナルで、それはユーザがおすすめされた靴を気に入るかどうかに対して強い影響があります。
例えば、マーティーがサイズ9の靴を着ている場合、モデルは7サイズの靴をおすすめします。

・ ユーザの好みの靴は使えるラベルです。

違います。
好みは観測できず、定量化出来ないメトリクスです。
私達ができることは、観測できる好みの代理的なメトリクスを探すことです。

・ ユーザがクリックした靴の説明は有用なラベルです。

正解です。
ユーザは多分彼らが好みの靴に対してより多くを知りたいと望んでいます。
ユーザのクリックは、白髪って、観測でき、定量化できるメトリクスで、よいトレーニングのためのラベルになりえます。
 

Gitの使い方の勉強メモ

Gitの使い方について勉強したことのメモです。

Gitとは

プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システム。
Linuxの生みの親であるリーナス・トーバルズによって開発された。

Gitという技術自体ととく使われているGit Hubのサイトは別。

最近プログラム界隈では非常によく使われている。

Gitを使うメリット

複数人でプロジェクトに携わる場合、ソースコードの管理がしやすい(状況をメンバー全員で履歴として把握できる。他人がアップロードしたファイルをローカルにダウンロードできる)
ソースコードの変更の履歴が追えるため、古いファイルを上書きしてしまった場合でも差し戻すことも可能。(バックアップとしても機能する)

Git Hub と Git lab

Gitを使ってソースコードを管理できるサイトは様々なサイトがある。

最も有名なサイトがGit Hub。
それ以外では Git labやBacklogなどがある。

メリットでいうと、Git Hubは最もよく利用されているために機能が充実している。
しかし、プロジェクトを非公開のプライベートプロジェクトにする場合は有料会員にならないといけない。
全て公開プロジェクトで利用する場合は無料でも使用できる。

デメリットでいうと、サイトが全て英語。

Git lab

Git Hubに続いて2番手でよく利用されているサイト。
メリットとして、Git Hubとほぼ同様の機能を持ちながら、プライベートプロジェクトを無料でも作成することができる。

デメリットでいうと、やはりサイトが全て英語。

Backlog

Gitを使ったバージョン管理を行える他に、様々な機能がついている。
メリットとしてはサイトがすべて日本語なので日本人にとって使いやすい。

デメリットでいうと、無料がトライアル期間の30日間しかなく、それをすぎると最低でも2000円/月の料金が発生する。

私はこの中ではプライベートプロジェクトが個人利用で無料なことからGit labを選択しました。

Gitの使い方

Gitは、PCからコマンドラインで実行します。

ローカル環境の作業フォルダをGitのローカルリポジトリに登録し、サイトにアップロードを行います。

コマンド

git init

現在のフォルダ(カレントディレクトリ)をgitに対して初期化します。
cdコマンドで、作業フォルダに移動してから行います。

gid add ファイル名

作成したファイルをローカル環境のインデックスに登録します。

git commit -m “メッセージ”

インデックスに追加されたファイルをコミットします。
コミットとはGitの用語で、ファイルやディレクトリの変更をリポジトリに登録する操作のことです。

git commit .

インデックスに登録されたファイルの中で修正のあったファイルを全てリボジトリに登録します。
実行するとコメントを入力する画面が表示されるので、入力して保存すると変更内容が自動的にコミットされます。

git status

ローカルリポジトリの状況の確認

git remote add origin リモートリポジトリのアドレス

リモートリポジトリのアドレスを登録します。

git push origin master

登録したリモートリポジトリに、ローカルリポジトリの情報を反映されます。

git branch

現在のブランチの一覧を確認します。

git branch ブランチ名

ブランチを作成します。

git checkout ブランチ名

指定したブランチに移動します。

git checkout -b ブランチ名

上記のコマンドで、ブランチを作成して移動できます。

ブランチを移動後は、ファイルを登録したりコミットしたりするのは通常と同じです。

git push origin ブランチ名

ブランチの内容をリモートリポジトリに登録します。

git pull ブランチ名

リモートリポジトリのファイルをローカル環境にダウンロードします。

git merge ブランチ名

ブランチの状況をmasterブランチに取り込みます。

git push origin master

マスターブランチにmergeしたファイルを反映します。

git clone url

既存のリモートリポジトリをローカル環境にダウンロードします。

WordPressSSL化後の管理画面のリダイレクトループの対処法

WordPressのサイトURLをHTTPからHTTPSに変更した後に管理画面にログインすると、500エラーでリダイレクトループが発生していると表示され、管理画面にログインできなくなりました。

以下は、対処した方法のメモです

wp-config.phpに以下を追記

wp-config.phpに以下の箇所を追記します。

追記する箇所がポイントで、wp-settings.phpを読み込む前に記述しないと、管理画面にログイン後に「このページにアクセスする権限がありません。」と表示されて別のエラーが表示されるので注意が必要です。

wp-config.phpの末尾に追記してしまうと上記のエラーが表示されたので、記述位置には注意してください。

Scrapyでクロール中の現在のURLを取得する方法

PythonのWebスクレイピングフレームワーク「Scrapy」で、クロール中の現在のURLを取得する方法についての解説です。

Scrapyで特定のurlをクロール中、クロール中のページのurlを取得したい場合があり、方法について調べてみました。

以下の記述で取得ができました。

response.request.url

Spiderのstart_urlの記述で複数のページを設定した際、現在クロール中のページによって処理を分岐させたかったため役立ちました。

Scrapyでクロール中にリンク先のページから抽出した要素を追加する

pyhtonのスクレイピングのフレームワーク「Scrapy」で、以下のことを実装しようと思い、方法で行き詰まってしまいました。

スクレイピング中に、リンク先のページから特定の要素を取得し、元の処理に加える

要するに、以下のようなイメージです。

上記のような処理は、Scrapyでよく遭遇します。

parseの処理中に、リンク先のページから要素を取得し、yieldで返します。

ただし、上記の記述は、処理2で返した辞書型の要素を、そのままRequest型で返すため、単にリンク先のページで特定の値だけ取得してその後の処理でその値を使いたい場合には、上手く処理することができません。

どう解決したらいいかを考えてみたのですが、結論としては、Scrapy.Requestを使用しないということで解決しました。

URLは確定していて、リンク先のページの特定の要素を取得したいだけであれば、他のライブラリのBeautiful Soupなどを使うことでも解決できます。

例えば以下のような処理を使用することでリンク先ページのタイトルタグを取得できます。

無理にScrapyのRequestオブジェクトを使って取得する必要はなく、処理の中で別のライブラリを使用することで上手く解決できました。

phpstormで選択範囲に一括でインデントを入れる(または下げる)方法

phpstormで、選択した行に一括でインデントを入れる方法について調べたのでメモです。

方法としては、インデントをいれたい行を選択して、上のメニューの「Edit」→「Indent Selection」で入れることができます。

phpstormでの一括インデントを入れる方法

逆に一括でインデントを下げる場合は、上記のメニューの下にある「Unindent Line Selection」で選択範囲のインデントを一括で下げることができます。

WordPressのカスタムパーマリンクのURL末尾の1が消える現象に対処

WordPressで、カスタムパーマリンクを使っていて、以下のようなことを実現しようとしていました。

パーマリンクを使ってURLを作成し、以下のようなURLのページがあったとします。

http://example.com/test/

このページに /test/ ディレクトリ以下に、数字の /1/というURLを付加し、パラメータとして処理をしようとしました。

http://example.com/test/1

上記のようなURLにして、数字の1を取り出して、プログラム内で処理しようとしていました。

しかし、いざ実行してみると・・・

http://example.com/test/1

とアドレスバーに入力すると

http://example.com/test/  

にリダイレクトされてしまうという現象が・・・・

何故?

ちなみに

http://example.com/test/2

とアドレスバーに入力すると、問題なく表示される。

何で2は通るのに1が駄目・・・?

ということで、問題に対処するために、

WordPressのソースコードに

echo $_SERVER[‘REQUEST_URI’];

を処理開始部分から追記していって、URLがどこで変化しているかを調べてみました。

すると、最初の段階では

http://example.com/test/1

と画面上に出力されていました。

それが、どこで変化しているのか・・・

結論としては

/wp-includes/template-loader.php内の

do_action( ‘template_redirect’ );

この処理の後で、

http://example.com/test/1 → http://example.com/test/

にURLが変化していました。

そして、上記の処理(do_action( ‘template_redirect’ );)をコメントアウトしてみたところ、

http://example.com/test/1

きちんと処理されるようになりました。

この処理を飛ばすとサイトの表示に問題が起きるわけでもなく。

というわけで、調査の結果としては以上となりました。

仮想環境venv内でcronを実行する方法

サーバ内での環境構築で、仮想環境を使用してプロジェクトを作成する場合があると思います。

ただし、仮想環境で作成したプログラムは主に仮想環境内で実行しているので、仮想環境の外からcronを実行しようとした場合に動作しない場合があります。

その場合で、cronで仮想環境からプログラムを実行する手順について調べました。

手順としては、シェルスクリプト(.sh)を作成して、シェルスクリプト内でサーバ内のディレクトリを移動し、仮想環境を有効にしてからプログラムを実行。

後に仮想環境から出るという手順で問題なく実行できました。

以下は仮想環境のvenvを使用した例です。

上記のシェルスクリプト(.sh)を作成し、cronで実行することで問題なく実行することができました。

ホーム > 技術系

フィード

ページの上部に戻る