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で必要になるということだったのですが、このあたりは分かるような分からないようなかんじでした。

LINEモバイルを使ってみて分かった注意が必要な点

ラインモバイル

父親の携帯電話を以前使っていたソフトバンクの携帯電話から、LINEモバイルの携帯電話に変更してみたのですが、変更してみて分かった注意が必要な点を書いておきます。

1.ソフトバンク回線では海外で音声通話が使えない

LINEモバイルでは、docomo回線とソフトバンク回線が選べるのですが、ソフトバンク回線にしていると、海外に行った場合に音声通話が利用できません。
オプションでも使えないので、海外旅行に行って音声通話を使いたいと思っている人は注意が必要です。
なお、docomo回線の場合はオプションで海外での音声通話ができるので、海外で音声通話が必要な人はdocomo回線を選んでおくとよいでしょう。

2.国内通話10分以内無料に注意

LINEモバイルでは、国内通話10分以内無料というオプションがあるので、電話をよくする人はオプションでつける人が多いかと思いますが、国内通話10分以内無料にオプションに加入していても、電話を普通に電話をしていると通話料金を普通に取られます。
音声通話の10分以内無料を有効にしたい場合は、いつでも電話のアプリをダウンロードして、そこか電話をかける必要があります。

また、このいつでも電話のアプリの使い勝手が微妙な点がいくつかあります。

・ 連絡先のグループ分け機能が利用できない
・ 着信履歴からかけ直しができない

という2点です。
正直、この2点だけ考えてみてもいつでも電話アプリの使い勝手があまりよくないので、ここも注意が必要な点として考慮しておいたほうがよいでしょう。

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

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

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

ポリモルフィズム

クラスの継承の概念を利用することで、同じ名称のメソッド(関数)で、異なる挙動をすることができます。
オブジェクト指向を概念を使っていない場合、例えば車の「走る」メソッドと、バイクの「走る」メソッドを作る場合、それぞれ別名の関数を定義しないといけません。
オブジェクト指向を使っている場合、走るメソッドは名称としては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をはじめとする構成管理ツールを使うことで、あらかじめ定められた手順に沿って一瞬でサーバ構築をすることができる。

Chefとの違い

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

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を使えばイメージを利用することで簡単に環境構築をすることができます。

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

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

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

Dockerと競合する技術

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

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を開発していた中国人の方がされているようです。

VagrantとVirtualBoxについて

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

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

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

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

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

ややこしい点

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

その他の言葉との違い

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

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

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

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

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

Aribnbのデザイン、コーディング勉強

Airbnbのサイトデザインの構成についての調査、勉強です。

調査サイト
Airbnb

調査日
2018年10月

全体的なレイアウト

レスポンシブデザイン

トップページ

下にスクロールすることでコンテンツがjsで追加表示されていく。

総コンテンツはかなり多い

ファーストビューに検索ボックスが大きくでる。
大きく印象的な写真(日替わり?)

白地に余白が多め

グローバルメニュー

横並びのメニューで、縮めるとホームメニューがドロップダウンに変化する。

横並びの部分

ul display:table list-style:none
li display:table-cell

floatは使っていない

ある程度横に縮めるとウグローバルナビは左上のアイコンに折りたたまれる

ヘッダは
position: absoluteで画面上表示

折り畳まれたメニューは、クリックするとz-indexと、position:fixedで画面いっぱいに表示される

ページ内のメニュー

メニューの横並び

display:inline-bock

要素は横並びで中はブロック要素

での

width:◯◯%

を使っての横並び。widthは、メディアしていで、max-width,min-widthで横幅を変更している。
(レスポンシブデザインの基本)

その他で気がついた点

多くの画像を、img src で指定せずに、 div styleでbackground-image: で指定している。
理由は不明。

画像が入っているdiv要素にrole=imgをつけているが、アクセシビリティのためにつけてあるものでSEOや機能的な意味はない。
その他にも、 aria-label要素も、その要素の解説のために使われている。

横並び要素の中の横並びは

display:table-cell で実装している?

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の記述で複数のページを設定した際、現在クロール中のページによって処理を分岐させたかったため役立ちました。

ウェブマスターツールの「Duplicate, Google chose different canonical than user」の対処法

Googleのウェブマスターツールで、新しいバージョンのSearch Cosoleを使っていると、ウェブサイトごとの各ページのインデックスステータスを調べるとができます。

あるサイトのインデックス状況を調べていたところ、インデックスされていいないページの原因に

Duplicate, Google chose different canonical than user

というメッセージがあり、大量のページがインデックスされていないという状況になっていました。

このメッセージを日本語訳してみると

重複しているため、Googleは別の正規ページをユーザの指定より優先しました

といった意味になっています。

私の場合ですが、どういったページが対象になっているかというと、

https://ドメイン名/ディレクトリ名/?no=1
https://ドメイン名/ディレクトリ名/?no=2
https://ドメイン名/ディレクトリ名/?no=3
https://ドメイン名/ディレクトリ名/?no=4
https://ドメイン名/ディレクトリ名/?no=5

といった、ページURLの末尾にあるクエリストリングのパラメータが複数あり、パラメータの数字によってページの内容を変えるといった実装をしていたサイトがあったのですが、Googleの判断によって

https://ドメイン名/ディレクトリ名/?no=1
https://ドメイン名/ディレクトリ名/?no=2
https://ドメイン名/ディレクトリ名/?no=3
https://ドメイン名/ディレクトリ名/?no=4
https://ドメイン名/ディレクトリ名/?no=5

上記のように、canonicalでそれぞれのページを指定しているにもかかわらず、no=1が正規ページとしてGoogleに判断されてしまい、それ以外のページは全てインデックスから外されるといった処理がされていました。
※ 実際は1~5ではなく、1~2000くらいまであるページもあり、2から2000までのページが全てインデックスから除外されていました。

これは、私がそれぞれパラメータごとに個別のページと指定しているにも関わらず、Googleが全て同じページだという判断をするという、Google側の誤判断が原因となっています。

しかし、Google側が誤判断をしたところで、サイト管理者の私には為す術はありません。

暫定の対応方法として、以下の方法を行いました。

https://ドメイン名/ディレクトリ名/1
https://ドメイン名/ディレクトリ名/2
https://ドメイン名/ディレクトリ名/3
https://ドメイン名/ディレクトリ名/4
https://ドメイン名/ディレクトリ名/5

サイトURLを上記のように変更を行い、301リダイレクトで元のページからそれぞれ移転後のページへリダイレクトを行いました。
意味としては同じなのですが、GoogleがクエリストリングのGETパラメータを誤認識してしまったことが原因のようなので、仕方がありません。
上記のように対応したところ、全てが元通りといったわけではありませんが、一部のURLは再びインデックスされるようになりました。

問題が起こった発端

問題が起こった発端は、サイトのURLをHTTPからHTTPSへと移行したことが発端でした。

そうすることで、これまでは問題なくインデックスされていたページの一部がインデックスされないという状況が発生してきました。

また、上記のページのような現象は、クエリストリングを利用した全ての動的URLのページに発生したわけではなく、発生したページと、そうでないページが両方ありました。

そのため、HTTPSにして、動的URLにすると必ず上記の現象が起きるわけではなく、起きる場合とそうでない場合あり、それはGoogleのアルゴリズムによって左右されるというのが実情のようです。

また、SSLに変更することでこの問題は起こったページがあったので、SSLと動的パラメータのページの組み合わせがGoogleにとって誤認する原因の1つになる?ということも考えられます。

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で実行することで問題なく実行することができました。

Adsense自動広告の関連コンテンツのクリック数の確認方法

最近Google Adsenseの、自動広告が利用可能になりましたが、自動広告の中で、関連コンテンツの広告があります。

関連コンテンツは、ページの下部に、同ドメインサイトの関連コンテンツを自動で表示してくれる機能で、複数の関連コンテンツと、関連コンテンツに合わせて広告も表示してくれます。

本記事では関連コンテンツの広告のクリック数と、関連コンテンツの広告でない記事のクリック数の確認方法について掲載します。

関連コンテンツの広告のクリック数

adsenseの広告ありの関連コンテンツのクリック数
※クリックで拡大

Adsenseの管理画面で、パフォーマンスレポート→詳細レポート→「広告フォーマット」で確認できます。

要求されたコンテンツの種類→「ネイティブ/関連コンテンツ/広告あり」の項目を見ると、クリック数や収益が確認できます。

広告でない関連コンテンツのクリック数

adsenseの関連コンテンツの表示回数
※クリックで拡大

Adsenseの管理画面で、パフォーマンスレポート→一般的なレポート→アカウント全体の画面で、
「関連コンテンツ」タブをクリックすることで確認が可能です。

MacOSX High SierraでのLibrary not loaded: libmysqlclient.18.dylibへの対処法

Mac OS S High Sieraで、pythonでMySQLのライブラリをインストールして使用していたところ、以下のエラーメッセージが出てしまい対処に困りました。

環境は、
OS:Mac OS S High Siera
MySQLバージョン:5.6
pythonバージョン:3.6.1
です。

ImportError: dlopen(/Library/WebServer/Documents/crawl/scraping/lib/python3.6/site-packages/_mysql.cpython-36m-darwin.so, 2): Library not loaded: libmysqlclient.18.dylib

原因について調べていたのですが、該当のファイルが開けないということで、該当ファイルへのシンボリックリンクを設定することで解決しました。

まず、

find / -name libmysqlclient.18.dylib

で、該当のファイルの存在している場所を調べます。
私の場合は、

/usr/local/mysql-5.6.19-osx10.7-x86_64/lib/libmysqlclient.18.dylib

にありました。

以下のコマンドでシンボリックリンクを設定しました。

sudo ln -s /usr/local/mysql-5.6.19-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

私の場合は、以上の手順で解決しました。

Linuxサーバの場合は、/usr/local/lib/ でなく、 /user/lib/ のパスらしいのですが、MacOSXの場合は、 /user/lib/ のパスがスーパーユーザでも書き込み不可になっていて、 /usr/lobal/lib/がシンボリックの設定箇所になります。

pythonの勉強メモ

最近人気のプログラミング言語の「python」について、勉強をしたことをメモしていっています。

プログラミング言語がphpをこれまでメインに使っていたので、pythonの基本的なことが理解できていないため、個人的なメモとして書いておきます。

変数と型

pythonは変数を宣言時に、明示的に型を宣言する必要がありません。
これはphpと同じですが、変数も変数であるということを表す、phpでいうと $ のような修飾子を変数の前につける必要がありません。

変数は予約語でない場合は変数であると自動的に判断して処理されます。

配列

pythonで配列を定義する場合は、[]を利用します。

array = []
array = [1,3,4,7]

このようにシンプルに定義できます。
phpとの違いとしては、 array()のような定義をする必要がなく、[]だけなのでシンプルです。

配列を参照する場合は

array[1] #上記の配列の場合3になる

のように参照します。これは他の言語の仕様と変わりません。

配列への要素の追加は

array.append(追加する値)

のように行います。

配列の長さは

count = len(array)

で取得できます。

タプル

タプルは配列と似ていますが異なる点は、一旦タプルに値が入ると後で変更ができないのが異なる点です。

tpl = (1,3,4,7)

のように使用します。
配列の[]が()になっています。

辞書(連想配列)

phpでいうところの連想配列は、pythonでは辞書と呼ばれます。

次の様に定義します。

array = {‘apple’:’りんご’, ‘orange’:’みかん’, ‘lemon’:’レモン’}

dict()を使用することで、配列やタプルの集合を辞書に変更することが可能です。

(例)
array = [[apple,りんご][orange,みかん][lemon,レモン]]
array = dict(array)

上記の例の結果、arrayは最初に示した例と同じ辞書になります。

画面出力

print文で画面出力を行えます。

print(出力したい値)

出力したい値は変数でも配列でも問題ありません。

コメント

pythonでのコメントは、
# コメント
を行頭に入れることでコメントをつけることができるのは他の多くの言語と同じです。

複数行コメントを入れるには

“””
コメント
コメント
コメント
“””

”’
コメント
コメント
”’

のように、シングルクオテーションか、ダブルクオテーション3つで行を囲むことで複数行コメントが可能です。

画面出力

画面出力は、print文で行なえます。

print(出力する内容)

文字列の置換

文字列の置換は、以下の記述で行なえます

文字列 = 文字列.replace(“置換元”, “置換先”)

数値のインクリメント

pythonでは、数値のインクリメントは使用できないので

変数+=1
変数-=1

のように記述します。

変数++
変数–

これは使えません。

yield文

yield文は、関数定義内で使用し、指定された値を返します。

そういう意味ではphpの関数内のreturn文と似ていますが、微妙に違いがあるようです。

python版のreturn文に近い存在ですが、関数内に複数のyield文がある場合全てのyieldの値を返します。

また、for文内にyieldが使用されている場合、for文のループが終了するまで値を返し続けます。

for文

for 変数 in 配列
〜〜〜〜〜

配列をfor文でループする場合、上記のように記述します。

ループ文の中で変数を使用したりできます。

または、

for num in range(数値)
 〜〜〜〜〜

とすることで、数値の回数繰り返しを行います。
numは 0 〜 数値-1 の間で処理されます

mysqlの利用

pythonではmysqlのデータベースと接続するためには様々なクライアントがあります。

その中でもポピュラーなものの一つにmysqlclientがあります。

pip install mysqlclient

でインストールすることができます。

IPython

Pythonは、コマンドラインで「python」とタイプすることで、quit()で終了するまでの間、対話型のインタプリタ形式で実行できます。

これをさらに強化したのがIPythonで、IPythonは、Pythonの対話型実行形式でしか使用できないものの、その部分を大幅に強化したものです。

pythonとは別にipythonとしてインストールすることができ、コマンドラインで

ipython

とタイプすることで使用することができます。

通常のpythonの場合

>>

といった形式でコマンドラインに表示されますが、ipythonの場合

In[1]:
In[2]:
In[3]:

といった形式でコマンドライン上に表示されることも特徴があります。

メルカリで本を販売・発送する際のポイントまとめ

メルカリ

自宅で不要になった本をメルカリで売っていたのですが、けっこう売れて便利です。
特に売れ筋の本は、定価に近い価格ですぐ売れたりもします。

ある程度メルカリで本を売ってみたので、メルカリで本を販売する際のポイントをまとめてみました。

1・アプリ「メルカリカウル」が便利

まずは、メルカリのアプリ本体で本を販売するより、派生したアプリ?「メルカリカウル」を使うと便利です。

メルカリカウル

メルカリに登録してけばアプリをダウンロードするとすぐ使えるのですが、メルカリ本家で本を売ろうとすると、が本の名称を入力したり、値段を自分で調べて登録しないといけないので手間がかかるのですが、カウルを使うとバーコードをスキャンするだけで必要な情報が自動で入力される上に、価格も売れ筋の価格を自動で設定してくれるので、価格を調べる手間も省けるので非常に便利です。

基本的にカウルは出品のフェーズで使用して、注文が入った後のやり取りなどはメルカリ本家のアプリでそのままできます。

2・メルカリで本を販売・発送する際の注意点

以下は、メルカリで本を販売・発送する際の注意点です。

2-1・本に合わせた最適な配送方法を選択する

販売する本によって、最適な配送方法を選択しましょう。
一口に本といっても、本の大きさによって、最適な配送方法が異なります。

小さいサイズ(厚さが薄い)本であれば、らくらくメルカリ便のネコポスやゆうゆうメルカリ便のゆうパケットなどが使用できるので送料が200円以内で安くすみます。
厚さが3cm以下なららくらくメルカリ便かゆうゆうメルカリ便がおすすめですが、3cmから3.5cmの間であればクリックポストがおすすめです。
クリックポストは最も送料が安いですが、発送の際の保証がついていない他、発送のラベル印刷を自分でしないといけません。(そのため、プリンタが必要です。)

3.5cmを超える本で5cm以下くらいの厚さの本であれば、らくらくメルカリ便の宅急便コンパクトがおすすですが、送料が380円かかる他、専用の箱(65円)が必要なので、あわせて445円かかるのでおすすめできません。

それ以上の厚さの本であれば、宅急便になるので送料が600円以上かかるので非常に高いです。

手間はかかりますが、本ごとに最適な配送方法を調べて登録しておくと送料が無駄にかからずにすみます。

配送方法を調べるのには、アプリ「MerCalc」が便利です。

送料計算/送料比較アプリ MerCalc

本の厚さとサイズ、重さを入力すると、最適な配送方法を提案してくれます。

配送方法は多くの種類がありややこしいので、慣れないうちは活用すると良いと思います。

2-2・本の状態の表記に注意

メルカリで本を登録する際に必要なのは、本の状態に関する表記です。

本に汚れがあったり書き込みがあったりするのに、状態を「未使用に近い」にしておくと、注文をした人から商品到着後にマイナス評価がつきかけねません。

商品登録前に、本に汚れがないかや、書き込みがないかなどを十分に活用しておきましょう。

本の状態のチェックが手間だと思う場合は、少なくとも登録の際に、「未使用に近い」や「目立った傷や汚れなし」にはしないようにしておきましょう。

本の状態に問題がある場合は、その状態を説明欄にきちんと記入しておくほうがよいです。

この部分はやや手間がかかりますが、この部分で手を抜くと低評価をもらいかねないので、気になる場合はきちんと確認しておきましょう。

2−3・本の発送の際の注意点

最後に、本の発送の際の注意点です。

本は封筒に入れるだけでそのまま送れますが、本を封筒にそのままいれただけでは、水濡れの可能性や、折れ曲がる可能性があります。

そのため、封筒に入れて本を送る場合でも、水濡れ対策に透明なビニールに入れておくか、緩衝材を挟むなどして折れ曲がる対策をしておけばより配送の際のトラブルも発生しにくいです。

封筒で送る場合は、少なくとも水濡れ対策にビニールに入れるのはしておきたいところです。

データベースのバックアップをDropboxへ転送する方法

サイトの運営をしていて考える必要があることは、ウェブサイトのバックアップをどう取るかです。

仮にバックアップを取っていない場合、何らかの問題が起こってサーバ上のデータが消えた時に、取り返しがつかなくなります。

サーバ上のデータが消える原因としては、作業ミス、サーバのハッキング、サーバ会社川野問題など、様々なものがあります。

これらの問題に対処するための方法もまた多様で、サーバ自体を多重化することなどもありますが、基本はバックアップを取ることです。

中でもデータベースは、毎日変化する場合もあるため、こまめにバックアップを取ることが求められます。

バックアップを取る基本は、cronでデータベースのダンプファイルをサーバ内の特定のバックアップフォルダに保存することですが、この場合、サーバ自体が消えてしまったときにバックアップがありません。

そのため、サーバ自体の障害に対応するためには、サーバの外部ストレージにデータを定期的に退避させておくことも重要になりますが、手動でやると手間がかかります。

1つの方法として、Dropboxにバックアップデータを転送する方法があります。

Dropboxは無料である程度の容量までは使用できるため、バックアップを取る方法の1つとして優れています。

ただし、セキュリティ的には100%安全とはいえないので、顧客の個人情報を含む場合の方法としては推奨できません。

手順についてなのですが、Git Hubで、Linux系のOSからDropboxにファイルをアップロードするシェルスクリプト(dropbox_uploader.sh)が公開されているので、それを利用する方法は簡単なのでおすすめです。

具体的な手順としては、Qiitaの以下のページに詳しく掲載されていますので参考にするとよいと思います。

さくらVPSのデータのバックアップに Dropbox を使ってみる

流れとしては、サーバにdropbox_uploader.shをアップロードして実行権限を与え、必要なDropboxへのアクセス情報(トークン情報)を設定してやるとシェルスクリプトが利用可能になるので、あとはcronで実行することでDropboxへ好きなタイミングでアップロードできます。

動的URLはSEO上不利になるか考察

ウェブサイトを構築するときに、動的URLがサイトを構築する場合に必要となる場合があります。

動的URLとは以下のようなURLで、英語ではquery string(クエリストリング)というようです。

http://ドメイン名/ディレクトリ名/product.php?id=◯◯◯

id=◯◯◯の数字の部分によって、表示されるページが変わるといったかんじです。

この動的URLというのは、SEO上不利になるのかというのは昔からしばしば議論されていて、関係あるとか無いとか言われていました。

公式には、Googleは動的URLだろうと静的URLだろうとGoogleは同様にページを扱うということを表明しています。

しかし、私はいろいろなサイトで実験をしてみた結果として、やはり動的URLはSEO上不利と言えるという結論に至りました。

何故動的URLはSEO上不利なのか

何故動的URLはSEO上不利になるのかということを考察すると、Google botが、複数のページを個別ページだと認識してくれないケースがあるからです

具体的にいうと

http://ドメイン名/ディレクトリ名/product.php?id=1
http://ドメイン名/ディレクトリ名/product.php?id=2
http://ドメイン名/ディレクトリ名/product.php?id=3
・・・
・・・
・・・
http://ドメイン名/ディレクトリ名/product.php?id=126

みたいな商品ページが120ページあるページがあったとして、Google botが、それらを個別ページだと判断せず、1つのページしかGoogleの検索結果にインデックスしない場合があります。

この場合、Googleのウェブマスターツールでは、インデックスカバレッジの項目で

Google により、ユーザーがマークしたページとは異なるページが正規ページとして選択されました
(英語で「Google chose different canonical than user」)

と表示されます。

なぜこういう現象が起こるのかは不明なのですが、例えば上記の例だと

http://ドメイン名/ディレクトリ名/product/1.html
http://ドメイン名/ディレクトリ名/product/2.html
http://ドメイン名/ディレクトリ名/product/3.html
・・・
・・・
・・・
http://ドメイン名/ディレクトリ名/product/126.html

のほうが、個別ページだと認識をしてくれやすいようです。

また、

http://ドメイン名/ディレクトリ名/product/1
http://ドメイン名/ディレクトリ名/product/2
http://ドメイン名/ディレクトリ名/product/3
・・・
・・・
・・・
http://ドメイン名/ディレクトリ名/product/126

のほうがおそらく個別にインデックスしてくれる可能性は高いと思います。

仮にインデックスされた場合はページの評価はどちらのURLでも変わらないと思うのですが、動的URLでは全てインデックスされない場合があるということが分かったので、静的URLのほうが有利であるという結論に個人的には至りました。

Google botが、何故個別ページを単一のページと誤認するケースがあるのかは謎ですが、アルゴリズム上そういう事例が発生する場合があるということが分かったので、私も考えを改めました。

動的URLを静的URLとして扱うためには、サーバ側の設定でmod_rewriteを利用したり、あるいはプログラム上の処理で工夫をする必要があります。

Pythonでスクレイピングの勉強メモ

様々なサイトから特定の情報を収集してまとめたサイトを作成しようと思い、Pythonでスクレイピングの勉強をしています。

メモ代わりにやったことをまとめておきます。

やりたいこと

Pythonで複数のウェブサイトから特定の情報を取り出してきてまとめたい。
何故Pythonかというと、PHPでもできるのだろうけど、最近Pythonが人気なのと、勉強も兼ねて。
スクレイピングして取り出したデータをデータベースに保存するまではPythonでやって、表示するサイトはPHP+WordPressでもいいかなと。

ローカル環境でのテスト

まずサイトを立ち上げる前にローカル環境でテストを行っています。

環境
MacOS High Sierra

Pythonのインストール

まずは最新のPython3をインストール

確認したところ、本記事執筆時点でバージョンは3.6.1

仮想環境の作成

以下のコマンドで、仮想環境を作成します。

python3 -m venv scraping

仮想環境を作成してそれ以下でやることで、開発環境でライブラリの依存関係などをプロジェクトごとに制御しやすい。

上の例では「scraping」という仮想環境を作成。

上記で作成した仮想環境に入るには

. scraping/bin/activate

では入れます。

仮想環境を抜けるには

deactivate

で抜けられる。

ライブラリ「Beautiful Soup」のインストール

スクレイピングをするのに便利なライブラリ「Beautiful Soup」をインストールする。
必須ではないが、あると便利

pip install beautifulsoup4

上記のコマンドでインストールを行う。
エラーが出たが、pipのアップグレートを行うことで解決した

pip install –upgrade pip

簡単なスクレイピングのテスト

簡単なスクレイピングのテストを行った。
Beautiful Soupは、それ自体ではローカルにあるファイルしか読み込めないため、urllibというモジュールをインポートして使用し、組み合わせることで外部URLを、URL指定で読み込むことができる。

上記のプログラムでは、抜き出したいHTMLページのURLからa要素を取り出して、URLとテキスト情報を出力している。

pythonのスクレイピングでやりたいこと

特定のウェブサイトのページの、特定テーブルのtd要素を全て取り出してリスト化したい。
そのために色々と試行錯誤をしてみた。

1・Beautiful Soupを使ってみる

上記の例では、スクレイピングしたい対象のページからtd要素のテキストを抜き出して表示するというもの。

結果としては、途中のtd要素までは取得できたものの、取得するページの要素がJavascriptの広告の部分でストップしてしまい、その先の要素を取り出せなかった。

調べてみたところ、そもそも

soup = BeautifulSoup(html, ‘html.parser’)

でhtml要素を取り出して、何故かページの途中までしか正常に取得できていなかった。
原因は不明。

2.lxmlを使ってみる

Beautiful Soulを使ってみて駄目だったので、lxmlというライブラリを利用してスクレイピングをしてみました。

まずは必要なライブラリをインストールして、基本的なプログラムを作成。
上記の例は、URL指定をしてページを取得するというもの。
取得する部分でエラー。

failed to load external entity “ページURL”

よく分からないけどできなかった。

3. Scrapyを使ってみる

スクレイピング用のフレームワーク「Scrapy」を使ってみた。

Scrapyは

pip install scrapy

でインストールできる。

最初に対話モードで実行したところ、最初の時点でいきなりエラー。
一度は実行できたのに、もう一度実行するとエラーに。
意味不明・・・。

と思っていろいろと操作していたら、pythonコマンドから実行するのではなく、コマンドライン上ですぐに実行すると実行できた。

上記の例では、まずはscrapyで対象のURLのページ内容を取得し、
次で、特定のクラス名のテーブル要素の、tdのテキスト要素を取得できた。

ただし、上記の例での問題として、tdの中にspan要素があり、span要素に挟まれたテキスト情報が除外されてしまうという問題が発生した

response.xpath(‘//table[@class=”クラス名”]/tr/td/span[@class=”クラス名”]/text()’).extract()

上記に変えて実行することで、除外されていたspan要素に含まれるテキスト情報を逆に全て出力することができた。

また、特定のテーブルの見出し要素の次のtd要素を取得する記述は以下の通り

response.xpath(‘//table/tr/th[text()=”テキスト”]/following-sibling::td[1]’).extract()

だんだんコツがつかめてきた。

Scrapyがツールとしては一番使えそうなかんじがした(といっても、簡単なプログラムを作成した結果問題が起きなかった)ので、とりあえずはスクレイピングに使うツールとして決定。

以下は、変数「url」に入った相対パスを、現在クローラーがいるページのURLにつなげて絶対パスに変換する記述

response.urljoin(‘url’)

プロジェクトを作成する

scrapyを使用するにあたって、まずはプロジェクトを作成する

scrapy startproject プロジェクト名

これで、プロジェクト名のディレクトリが作成される。

プロジェクトを作成すると、プロジェクト名のディレクトリ以下に、フレームワークのファイルやディレクトリ一式が自動生成される。

プロジェクトを作成後、設定ファイルとして「setting.py」ファイルが作成されるが、
クロール先のサイトに迷惑をかけないように、

DOWNLOAD_DELAY = 1

を追記しておいがほうがよい。
デフォルトのダウンロード間隔は0秒のため、クロール先のサイトに思わぬ迷惑をかけてしまう場合があるので、この設定をしておくことで、ページのダウンロード間隔が1秒になるため、クロール先のサイトに迷惑を少なくできる。

Spiderの作成

Scrapyでは、Spiderと呼ばれるファイルを作成することで、クローラーを実行する。

Spiderは、コマンドラインから以下のコマンドで作成できる。

scrapy genspider Spider名 サイトのドメイン名

上記のコマンドで、プロジェクトのspidersディレクトリ以下に、「Spider名.py」と呼ばれるファイルが作成される。

ファイルを開くと、デフォルトで

def parse(self, response):
pass

という関数が定義されているが、このparseという関数をScrapyは実行するのでこの関数を変更していく。

parseで実行した処理は、yield文を使用することでスクレイピングした値を返していく。

返す形式は、辞書形式でも問題なし、itemクラスを使用しても問題ない。

itemクラスは、プロジェクトを作成時に、「items.py」というファイル内に定義されていて、ファイルにクラスを定義することで使用できる。

yieldで返した値は、Scrapyを実行する際に、外部ファイルに出力することができる他、後述するItem Pipelineを使用することで、データベースへ保存することも可能。

実行する場合は、

scrapy crawl スパイダー名

で実行できる。

Item Pipelineの活用

ScrapyにはItem Pipelineと呼ばれる機能があり、使用することでデータをチェックしたり、データベースにデータを保存したり、parseの処理で返したItemオブジェクトを利用した処理を行うことが可能。

Pipelineの記述は、プロジェクトフォルダ内の「pipelines.py」に記述する。

pipeline.pyにクラスを定義し、setting.pyに定義をすることで呼び出す。

ITEM_PIPELINES = {
‘プロジェクト名.pipelines.クラス名’ : 300,
‘プロジェクト名.pipelines.クラス名’ : 800,

上記の例の300や800といった記述は優先度で、数が小さいほど優先して処理される。
0〜1000までの間で定義され、優先度が高い順から定義されたクラスが処理される。

ここで、yieldで返されたitemオブジェクトのチェックを行ったり、データベースに保存する処理を行える。

pipeline.py内の関数 process_item内に、pipeline実行時に処理をする記述を行う。

WordPressをSSL移行でアクセス数が大幅に減少・・・原因を考察

最近のGoogleからの推奨で、ウェブサイトの全体SSL化が推奨されていますね。

私が運営している複数のサイトも、SSLに対応するため、複数のサイトをSSLに対応しました。

SSL移行の手順

手順としては以下の通りです。

1. サイトをHTTPSで見れる設定にして、記述を諸々変更する
2・ 301リダイレクトでHTTPへのアクセスはHTTPSへ飛ばす
3・ ウェブマスターツールでHTTPSのサイトを新しく登録し、Google AnalyticsのサイトのURL設定を変更する

といった形で、複数のサイト(10サイト程度)をほぼ同時期にHTTPS化しました

SSL化する方法としては、Cloudflareの無料SSLを使っています。

結果

結果としてですが、複数のサイト(10サイト程度)で、アクセス数の増減が発生しました。

SSL化してすぐに発生したわけではなく、1週間か2週間程度経ってから発生しました。
(それまでは問題なかったのにです。)

サイトのアクセス数の減少度合いはサイトによってばらつきがあり、最も大きく減少したサイトは、アクセス数が6割程度減少しました。

少ないサイトでは2割程度の減少で、サイトによってはアクセス数がほぼ変動なしのサイトや、むしろ増加したサイトも見られました。
(大幅に増加したサイトはなく、微増といったかんじです)

何故アクセス数が減少したかの考察

アクセス数が減少した理由についていろいろと調査してみましたが、まず、ウェブマスターツールを調べてみたところ、サイト全体の平均検索順位の低下はそこまで顕著には見られませんでした。

それにも関わらずアクセス数が減少幅が大きいサイトで6割も減少したのは、別の理由がありました。

原因としては、HTTPS移行後の特定のURLがインデックスに登録されなくなったことにありました

ウェブマスターツールで調べてみたところ、以前はインデックスされて上位に表示されていた複数のページが

「Google により、ユーザーがマークしたページとは異なるページが正規ページとして選択されました」という結果でインデックスから削除されていることが確認されました。

それらのページがランディングページとしてサイトに流入していたアクセスがごっそり消えてしまったわけです

上記のエラーは、HTTPのURLとHTTPSのURLが混在しているため、HTTPSのほうを非表示にしているといった内容ではなく、何故か移行後の特定のURLがそれまでは単一のURLとみなされていたのが重複URLをみなされてインデックスから除外されてしまうということが発生してしまったわけです。

これには正直困りました。

なぜなら、そのサイトでも、特定のページは問題なく移行できているものもあるのに、特定のURL(パーマリンク設定のURL)のぶんだけ移行できなくなってしまったからです。

設定に不備がなかったからサイトのページを何度も確認してみましたが、Canonical設定の不備や記述の不備も見当たらず、困り果ててしまいました。

そもそも、サイトやページによって何故こうもばらつきがあるのかも理解できませんでした。

HTTP→HTTPSへの完全な移行には一ヶ月ほどかかるそうなので時間がかかるのであれば仕方がないですが、もし回復しなかった場合、致命的な結果ということになります。

結論:サイト全体のHTTPS化は一概に推奨はできない

HTTPSの通信は、ネット通販で個人情報を入力するサイトなど、サイトによってはなくてはならない必須の技術です。

しかし、サイト全体のHTTP→HTTPS化は、移行に伴う検索順位の低下のリスクが伴うことが分かりました。

移行手順に不備があった可能性も考えられますが、それがGoogleの管理コンソールにどういった理由かも表示されず、ただ一方的に順位の低下やインデックスからの削除のみ、結果として受け取らないといけないのは、Google側の不備としかいいようがない気がします。

HTTPS化はGoogleから推奨はされているものの、検索順位のアップなど、メリットが明確に受け取れるわけではないので、どうしても必要という場合以外は見送ったほうが賢明な判断だと思いました。

ホーム

フィード
リンク集

ページの上部に戻る