習志野技術研究所

あれやこれやしたい習志野在住の人間が書いています。他人のマネばかりですが、初心者目線で躓いたところ等まとめたいです。

PHPでデータベース接続とする

環境

OS:Mac

MAMP

DBMSは MySQL (phpMyAdmin)

phpには接続方法が色々あるがPDOを使ってみる。

前提条件

データベースへアクセスするための(phpMyAdminの)パスワードが分かっている。

Macなら/Application/MAMP/bin/phpMyAdmin/config.ini.phpで設定・確認できる。)

Xampと設定が似ているのでこの記事 [Mac]xamppセットアップ-これを読めば思い出す-を参考に。

 用意したテーブル

他の方がエクセルなどで作っているテーブル定義書テーブル定義の出力(Excel, CSV)を参考に、簡単に次の様なものを作成。

f:id:Narashino-tech:20161028150605p:plain

ひとまずパスワードは平文で...。この先で変えていきます...。

PDOとは

PDOとは

PDO(PHP Data Object)とは、PHP標準(5.1.0以降)のデータベース接続クラスのことです。 PHPは標準でMySQLPostgreSQLSQLiteなど、色々なデータベースに接続するための命令が用意されています

これで使い方が見えてきた。

  • PDOはクラスなので、インスタンス化して使う。

  • データベースの接続にはバックグラウンドでかなり難しい処理がされてるけど、PDO使えば簡単にアクセスできるぜ、兄貴。

PDOの使い方は、もう詳しく書かれているサイトが沢山ある。

とりあえず、公式リファレンスから接続、および接続の管理-PHP マニュアル -を見てみます。

マニュアルから、接続に必要なものがわかる。

インスタンスを生成しているコードを読むと f:id:Narashino-tech:20161028150610p:plain

  • host :データベースのドメイン

  • dbname : アクセスするデータベース名

  • $user(変数) :データベースのユーザー名

  • $pass:データベースへ接続するパスワード

を使っているらしい。

PDOでデータベースに接続

以下のようなコードを書いた。

<?php

$host = 'localhost:3306'; //127.0.0.1:[ポート番号]でも良い
$dbname = 'mac_mamp';
$dbuser = 'root';
$dbpassword = 'root';

try{
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword");
    echo "SUCCESS";
}catch(PDOException $e){
   var_dump($e -> getMessage());
    die();
}

公式リファレンスの二番煎じ。

PDO以外の部分を自分なりにまとめる。

  • try - catch : 例外処理 -> 深刻なエラー(ここではデータベースに接続できない)が生じる場合に実装する。

  • PDOException : PDOのエラー(データベースに接続できなかった)を表す

  • $e : PDOException のメッセージが格納される?

  • $e->getMessage() : $eのメソッドgetMessage()を呼び出す。PDOException のエラー格納場所?

MAMPのhtdocsに上記のphpファイルを置いて接続されるか確認する。 f:id:Narashino-tech:20161028150945p:plain

ok

Raspberry Pi 上でLateX を使う

モチベーション

自宅のPC(Windows)とMac Book AirにはLatexを入れている。が、Mac版のTexはOSのバージョン依存が大きい。これじゃ出先で不安だ。 自宅のRaspi3はこんな感じでファイルサーバー兼httpサーバーとして使ってる。 f:id:Narashino-tech:20161024220748j:plain こいつでTexコンパイルができれば、出先でも落ち着て過ごせる。

インストール

$ sudo apt-get install texlive-lang-cjk xdvik-ja latexmk

数時間かかる

.texコンパイル

$ sudo platex [ファイル名].tex

.dviファイルが出力される

div -> pdf

$ sudo dvipdfm [ファイル名].dvi

.pdf ファイルが出力される

あとは、.texを検知して自動でpdf化までできるようにしたい。

参考サイト

1 )ラズベリーパイでTeX

Windowsのコマンドプロンプトの文字コードを自動でUTF-8にする

モチベーション

多くのエディタやLinuxを使うと、文字コードの符号化方式はutf-8が標準になっている。

Windows文字コードはshift-JISが標準なので扱いにくい。 コマンドプロンプト文字コードを自動でutf-8にできたら快適に過ごせそう。

バッチファイルの用意

コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 に書いてあることを丸パクリする。

まず、コマンドプロンプトは chcpコマンドで文字コードを変更できる。

例えば

chcp 932 (shift-JIS)

chcp 65001 (utf-8)

を入力することで、変更できる(自分は毎回chcp65001を入力していた)。

参考サイトに倣って以下のバッチファイルを用意 。 shft-JISで用意したいので、メモ帳を使った。名前は適当に'codeToUtf8.bat'とかで(笑)。

chcp 65001

このバッチファイルを任意の場所に置く。この際、バッチファイルのフルパスをメモしておく。

regedit でCommand Processorを探す

##ここから先は自己責任で##

Windows使ってて初めてみた、regedit。

registry editor の略。 レジストリの内容を弄れるソフトらしい。(レジストリWindowsにしかない仕様なんて初めて知った。)

regeditを起動し、HKEY_LOCAL_MACHINE -> SOFTEARE -> Microsoft -> Command Processor

ディレクトリを展開してく要領で探していく。

Command Processorにバッチファイルを登録

Command Processor まで到達できたら、その階層で右クリック、新規 -> 文字列値 と選択。 作成できたものを右クリックし、「修正」を選択

名前:AutoRun

値のデータ:バッチファイルのフルパス

を入力。

コマンドプロンプトを立ち上げる

f:id:Narashino-tech:20161023210427p:plain

success!

文字コードが65001(utf-8)になっている。 コマンドプロンプトを起動するたびに、バッチファイルが実行され、文字コードが変更されている。

「参考サイト」

1) コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 

slackでいろいろ遊ぶ その1

毎朝天気予報を送信するボットを作る

モチベーション

自宅にはテレビを置いてない。天気予報アプリを見る習慣もない。すると朝玄関を出たら雨でげんなりってことがよくある。

これを見た。

天気予報をSlackに通知する on Heroku

なるほど、毎朝slackに通知を送れば楽しそう。作ってみよう。 言語はPHP。コードは常時稼働してるraspberry pi において、cronで定期実行すればできそうな気がする...。

というか、まずslackのアカウントを作らねば...。

slack api test でテキストを送信する

  • tokenの発行

そもそもslackを使うこと自体初めて。なので簡単なところから始める。 slack api からweb apiにいく。 下の方へスクロールすると、「Generate test tokens」がある。これをクリック。 ここで発行されたtokenをメモメモ...。

  • api/METHOD のMETHODを決める

web apiによるとapi のurl はhttps://slack.com/api/METHOD らしい...。METHODってなんぞ。

先人の知恵を借りよう。

PHPでSlackに通知を送る

これを参考に以下のようなコードを書いた。

<?php
  $baseurl= "https://slack.com/api/chat.postMessage";
  $token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //token
  $channel = "#yyyyyyyy";//投稿したいチャンネル名
  $text = 'Hello,Slack!';
  $channel = urlencode($channel);
  $url = $baseurl. '?token=' . $token . '&channel=' . $channel . '&text=' . $text . '&as_user=true';//trueは自分から、falseだとapi testerからメッセージが贈られる。
  $json = file_get_contents($url);
  $json = json_decode($json);
  print_r($json);
 ?>

実行すると、ok と返ってくる。また、slackにもテキストが送られた。 そして、METHODの部分は実行したい動作に置き換えるようだ。 ブラウジングしていると、

https://api.slack.com/methods

を見つけた。METHODに当てはめる部分を一覧で見れる。今回はメッセージを送るだけなのでchat.postMessageだけ試した。

livedoor の天気予報apiから予報データを取得

天気データは以下のサイトから頂く。

weather_hacks

http://weather.livedoor.com/weather_hacks/webservice

全国の地点定義表から自分の住んでる地域のidを見つける。 千葉県 千葉 にしたいので、id="120010" だ。

天気情報を取得するコードは以下のようにした。

<?php
header('Content-Type: text/html;charset=UTF-8');
  $baseurl = "http://weather.livedoor.com/forecast/webservice/json/v1";
  $cityid = '120010';
  $url = $baseurl . '?city=' . $cityid;

  $options = array(
    'http' => array(
      'method' => 'GET',
      'header' => 'Content-Type: application/json',
    ),
  );
  
  $json = file_get_contents($url,false,stream_context_create($options));
  $json = json_decode($json,true);

  echo '<pre>';
  print_r($json);
  echo '</pre>';
 ?>

こんな感じで取得できた。 f:id:Narashino-tech:20161002094921p:plain

まとめ

Slackのapiは意外と簡単に使える。また、webに情報も多いのでそれほど困らなかった。 ただ、現状だとテキストを送るだけなのでよりリッチなメッセージを送れる Incoming Webhooks を使ってみたい。

参考サイト

being search apiから検索結果を表示する

環境

windows10,MAMP,vscode,php5.6.24,google chrome

はじめに

最近httpの仕組みがわかってきた。webプログラミングに興味をもつ apiを使って、何か作って見よう!と思った。

何を使おう

googleapiを使おうかと思った。が、ライブラリ使う必要があるらしいので今回は見送り。 身近なweb検索の結果を自分でも表示したい。=>調べるとbing search apiがあるらしい

使って見る

早速bing serach apiを使ってみようかと思う。

導入

1 developerに登録
2 being search api 5000/month を無料購入
3アカウントキーをメモる

ここまでできたら、先人の知恵を借りる。

PHPからBing Search APIを使って画像を収集する

http://qiita.com/sadapon2008/items/38628ae8266495b3d3a3

Bing Search APIの使い方。月に5000件まで無料で利用できますよ!

https://www.panzee.biz/archives/9401

apiに送るurlの構造はこの人のものを少々変更する。 https://api.datamarket.azure.com/Bing/Search/v1/Web?$format=json&Query=%27%E4%BF%AE%E9%80%A0%27 とする。 以下はコード

MAMPを起動し、 これで表示すると...

...どうやら無事取得できるようだ。

=メモ=

先人の方が使ったurlを見るとapiに飛ばすurlの構造は次のようになっているとわかる。 https://api.datamarket.azure.com/Bing/Search/v1/[検索方法]/[取得する形式]&[検索条件] ここまでわかれば、変数を使ってurlを好きに変更できそう。

理解できていない部分

$this->data=array(
'http' => array(
        'request_fulluri' => true,
        'ignore_errors' => true,
        'header' => "Authorization: Basic $auth",
        )
    );

request_fuluri ignore_errors は何を示しているのだろう...。 今回はここまで。

httpリクエスト1

○要因
あるサイトのhtmlソースを取得したいとき

<?php
 $url='http://○○○○.html';
 $hmtl=file_get_contens($url);

 var_dump($html);
?>

で取得できる・・・

とおもっていた。

取得できない場合

 failed to open stream: Connection timed out in .....

となる。

なぜだろう...?これは、サーバーから帰ってくる情報を見てみる必要があるな。

○調査
chrome app には便利なものがあって、

Advanced REST client - Chrome ウェブストア

でサーバーからの情報を取得できる。
使えるものはなんでも使おう。

□結果

f:id:Narashino-tech:20160820085506p:plain

「httpのステータスが302 Found」になっている。
ググる

HTTPステータスコード - Wikipedia

302 Found
発見した。リクエストしたリソースが一時的に移動されているときに返される。
Location:ヘッダに移動先のURLが示されている。

なるほど、つまり今回入力したurlはアクセスすると移動する(つまりリダイレクトする)のか!

○考察
file_get_contens()では取得先urlがリダイレクトするようになっているとgetできない。

○次回
file_get_contensは上記のような問題があるので、urlからファイルにアクセスするときは使わない。

代わりの関数を使う
qiita.com

phpにはcurlがあり、この関数はurl先の状態を細かく設定できる。これを使っていく。


<今回はここまで>

数学パズル-Q01

この本がくすぶっていたので、少しずつ進めてみる。

 

 phpで書いていく。

Q01

数学パズル

言語処理100本ノック000

//////////////////////////////////注意/////////////////////////////////////

記事を書いている人間はPHP初心者(使い始めて数日)

アルゴリズムの知識も中途半端

 

なので、おバカなコード多い。あくまで自分の記録用です。

/////////////////////////////////////////////////////////////////////////////////

 

 

東北大学のとある研究室が「言語処理100本ノック」というサイトを公開している。

自分も取り組んでみる。

使用言語:PHP

 

課題000

100noc