りぺんぎんの書きなぐり技術書

基本、ITの技術について書きます

マテリアルデザイン(material design lite)

あけましておめでとうございます。まだまだ寒いです。

material design について勉強をはじめました

  1. マテリアルデザインってなに?
  2. どのフレームワーク使っているのか
  3. 触ってみて困ったこと
  4. いままでに解決したこと

①マテリアルデザインってなに?

マテリアルデザインなに? って言ってる人はまずこのサイトに辿り着いてないと思いますが 簡単に言うと

google が推進しているマルチプラットフォームにおいて現実の法則(影や重さなど)を取り入れた共有のUIを使うことで直感的な操作を可能とするデザイン

です。

どんなものかは

Introduction - Material design - Material design guidelines

を見ればわかるでしょう。

androidはこのマテリアルデザインを採用していてandroidの画面がPCにも来るというのが最も早いかもしれません。

②どのフレームワーク使っているのか

マテリアルデザインのcssフレームワークはたくさんありますが

中でも私が使っているのが

material design lite

Material Design Lite

です。

googleが出しているフレームワークの一つでbootstrapと似ています。

polymer

Welcome - Polymer Project

googleが出しているフレームワークの一つですが敷居は高いです。

③触ってみて困ったこと

  1. form の入力値チェック機能があるが required(必須) だけ簡単に実装できない(これほんと謎、もしかしたらあるのかもしれない)
  2. table のスクロールが実装できない (わりと困ります)
  3. まだまだ解説サイトが少ない

④. いままでに解決したこと

(1)レイアウトの単純な中央揃えが上手くいかない

material design lite は bootstrapと同じようにgridシステムを使っていますが中央揃えがずれるんですよね

これはStack Overflow で解決しました

f:id:repenguin:20170103210615p:plain

<div class="mdl-grid">
 <div class="mdl-layout-spacer"style="background-color: #1CB94A"></div>
 <div class="mdl-typography--display-1" style="background-color: red">中央揃え</div>
 <div class="mdl-layout-spacer"style="background-color: #1CB94A"></div>
</div>

真ん中にしたい要素を

<div class="mdl-layout-spacer"></div>

で囲んでやるだけですね。

(2)table の幅がレスポンシブにならない

f:id:repenguin:20170103210619p:plain

これを見ると(上)わかりますが公式サイトのtableをそのままgridに当てはめると幅が固定されます。

これはクラスでどうこうするものではなく

<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp" style="width: 100%">
<!-- 省略 -->                        
</table>

table に width:100%をつけることで解決します。

頑張ってWEBサービスを作っていきます

Laravel 5.3 の JSON response において 日本語 が文字化けする問題の解決法

現状

Laravel 5.3で日本語を含むデータを "return response()->json();" すると このようになる。

f:id:repenguin:20161129210426p:plain

日本語がおかしくなる。(※別にJSONの本来仕様上間違っているわけではないらしい)

json_decode,json_encode をいじればいいんだが、どうせならLaravelの書き方でやりたい。

解決策

これは unicode で日本語がエスケープされているので起こる問題らしい。 だからこれを

$collection = DB::select('select * from user;');
return response()->json( [
                'data' => $collections
]);

$collection = DB::select('select * from user;');
return response()->json(
            [
                'data' => $collections
            ],
            200,[],
            JSON_UNESCAPED_UNICODE
        );

と書いてやると日本語のまま表示される。

apache tomcatで2つのアプリケーションをのせる手順(すべて)

CentOSで2つのIPaddressで2つのアプリケーションを動かすapache tomcat サーバをたてたので書いておく

※CentOS6.8

 

CentOSのインストールは割愛

(2)ネットワークの設定

①ネットワークマネージャーの停止

//NetworkManagerのサービスを停止

「service NetworkManager stop」

//再起動時に勝手に起動しないように停止

「chkconfig NetworkManager off」

「vi /etc/sysconfig/network-scripts/ifcfg-eth0」

ONBOOT=no
M_CONTROLLED=yes

 

以上の二行を下記のように変更する。

#ONBOOT=no
#NM_CONTROLLED=yes
ONBOOT=yes
NM_CONTROLLED=no

 

[解説]

ONBOOT=yes

は起動時にネットワークを自動で起動するようにする設定

NM_CONTROLLED=no

はネットワークマネージャーを使用しないようにする設定

 

IPアドレスを設定(必要な場合)

#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=IPアドレス1
NETMASK=サブネットマスク
GATEWAY=デフォルトゲートウェイ

リゾルバについて

「vi /etc/resolv.conf」

search DNSサーバのFQDN
nameserver DNSサーバのIPアドレス

 ②selinuxを停止

「vi /etc/selinux/config」

SELINUX= enforcing

を以下に変更

SELINUX=disabled

 その後reboot

(3)yumの設定とアップデート

※プロキシを利用している場合

「vi /etc/yum.conf」

一番下に追加

proxy=プロキシのURL:ポート番号
proxy_username=ユーザ名
proxy_password=パスワード

 「yum update」

(4)作業用のユーザの追加、設定

①ユーザの追加とパスワードの設定

「useradd ユーザ名」

「passwd ユーザ名」

②全権限を作業用ユーザにふる

「usermod -G wheel ユーザ名」

③作業用ユーザでsudoを可能にする

「visudo」

#%wheel ALL=(ALL) ALL

%wheel ALL=(ALL) ALL

④作業用ユーザでsudoを可能にする

「vi /etc/pam.d/su」

#auth required pam_wheel.so use_uid

auth required pam_wheel.so use_uid

 確認して終了

(5)ssh接続の設定

①クライアントがmacOSの場合

ターミナルを開き

ssh-keygen -t rsa」を入力。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): ← 作成される場所。問題なければEnter。
Enter passphrase (empty for no passphrase): ← パスフレーズの入力。
Enter same passphrase again: ← パスフレーズの再入力。

指定した場所に生成される。

LINUX側の設定

②作業用ユーザでログインして.sshフォルダが存在するかチェック

「su ユーザ名」

でログイン。

「cd」

「ls -la」

で.sshフォルダが存在することを確認。

 

もし存在しない場合。

「mkdir .ssh
「chmod 700 .ssh

 

③クライアントサイドで作成した公開鍵(.pubファイル)をサーバ側に移動させたあとコマンドを実行。(scpでもUSBでも可能)

「cp ~.pub /home/ユーザ名/.ssh/authorized_keys」

「chmod 600 /home/ユーザ名/.ssh/authorized_keys」

「service sshd restart」

reboot

これでmacならターミナルから、windowsならTeraTermなどから接続可能になる。

(6)iptablesの設定

①バックアップを取る

 「cp /etc/sysconfig/iptables /etc/sysconfig/iptables.old」

②許可するポート番号を追加する

WEBサーバ

iptables -A INPUT -p tcp --dport 80 -j ACCEPT」

tomcat

iptables -A INPUT -p tcp --dport 8009 -j ACCEPT」

tomcat2

iptables -A INPUT -p tcp --dport 8010 -j ACCEPT 」

保存する

「/sbin/service iptables save」

iptablesの再起動

「service iptables restart」

ポート(80,8009,8010)が許可されているか確認

(7)apache(Webサーバ)のインストール

①「yum install httpd

でインストール。

「インストール済みか最新バージョンです」と表示される場合は変更の必要はない。

②「service httpd start」

で起動を確認。

③「chkconfig httpd on」

で起動時に自動起動する設定に変更する。

④確認

ブラウザを立ち上げ 「サーバのアドレス」 か サーバ本体を操作している場合 「localhost」とURLに入力する。

apacheの画面が表示されたら動作確認終了。

(8)javaのインストール

①インストール

yum remove java-1.6.0-openjdk」

yum remove java-1.7.0-openjdk」

yum install -y  java-1.8.0-openjdk」

元からインストールされているjava 1.6,1.7をアンインストールし1.8をインストールする。正常にインストールできれば完了。

②確認

java -version」

 

(9)tomcatのインストール

tomcatを別ポートで2つ起動させることで2つのアプリケーション動作を実現する

wgetのインストール

yum -y install wget

でインストール。

「インストール済みか最新バージョンです」と表示される場合は変更の必要はない。

 

tomcat専用ユーザの追加

「useradd -s /sbin/nologin tomcat8」

③WEBからtomcatを入手

wget http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz

④解凍

「tar -xzvf apache-tomcat-8.0.36.tar.gz」

⑤移動させる

「cp -r apache-tomcat-8.0.36/ /usr/share/tomcat8.0.36」

「mv apache-tomcat-8.0.36/ /usr/share/tomcat8.0.36.8010」

⑥所有ユーザの変更と権限の変更

「chown -R tomcat8:tomcat8 /usr/share/tomcat8.0.36」

「chmod +x /usr/share/tomcat8.0.36/bin/*.sh」

「chown -R tomcat8:tomcat8 /usr/share/tomcat8.0.36.8010」

「chmod +x /usr/share/tomcat8.0.36.8010/bin/*.sh」

※起動等(今起動させる必要はない)

/usr/share/tomcat8.0.36/bin/ startup.sh

/usr/share/tomcat8.0.36/bin/ shutdown.sh

/usr/share/tomcat8.0.36.8010/bin/ startup.sh

/usr/share/tomcat8.0.36.8010/bin/ shutdown.sh

(10)mysqlのインストールと設定

①「yum remove mysql*」

で既存のmysqlをすべて削除する。

②「rm -rf /var/lib/mysql

でファイルが残っている場合は削除する。すでにない場合は不要。

③「yum -y install mysql-server」

でインストールする。

文字コードを設定する。

「vi /etc/my.cnf 」

symbolic-links=0 の記述のすぐ下に以下を追記する。

default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

 

⑤サービスのスタート

「service mysqld start」

⑥起動時に自動起動するように設定

「chkconfig mysqld on」

⑦初期化設定

MySQLの初期設定

mysql_secure_installation」

-----start-----

Enter current password for root (enter for none):   ←エンターキーを押下

Set root password? [Y/n]  ← Y

New password: パスワード

Re-enter new password: パスワード

Remove anonymous users? [Y/n]  y

Disallow root login remotely? [Y/n]  y

Remove test database and access to it? [Y/n]  y

Reload privilege tables now? [Y/n]  y

-----end-----

(12)apache tomcat 連携

①「vi /usr/share/tomcat8.0.36/conf/server.xml

 

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

の部分をコメント化する

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

ココの部分

</Host>

ココの部分に以下を追記

<Context path="/" docBase="/usr/share/tomcat8.0.36/webapps/a/" debug="0">

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/AccessLog" />

        </Context> 

 

②「vi /usr/share/tomcat8.0.36.8010/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Server port="8005" shutdown="SHUTDOWN"> 

 

の部分を <!-- --> でコメント化する。

コメント化した <Server port="8005" shutdown="SHUTDOWN">

のすぐ下の部分に以下を追記する。

<Server port="8006" shutdown="SHUTDOWN"> 

 

コメント化した <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

のすぐ下の部分に以下を追記する。

<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" /> 

 

さらに

        

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

ココの部分

</Host>

 

ココの部分に以下を追記

<Context path="/" docBase="/usr/share/tomcat8.0.36.8010/webapps/b/" debug="0">


<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/AccessLog" />

        </Context>

 

③バーチャルホストを使用しIPアドレスを二つ使うためIPアドレスを追加する。

「vi /etc/sysconfig/network-scripts/ifcfg-eth0」

 

#BOOTPROTO=dhcp

BOOTPROTO=static

IPADDR=IPアドレス1

IPADDR1=IPアドレス2(※バーチャルホストのためのサブIPアドレス)

PREFIX1=サブネットマスクの切れ目(/24ならば24) ※バーチャルホスト

NETMASK=サブネットマスク

GATEWAY=デフォルトゲートウェイ

 

AJPモジュールを使いapacheからtomcatへ転送する。

「vi /etc/httpd/conf/httpd.conf」

 

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

 

上の記述がコメント化されていないかを確認。コメント化されているならば解除。

最後列に追加

IPアドレスによってアクセスされるtomcatを変更

<VirtualHost IPアドレス2:80>

ErrorLog logs/a-error_log

CustomLog logs/a_log env=common

<Location / >

        ProxyPass ajp:// localhost:8009/

</Location>

</VirtualHost>

<VirtualHost IPアドレス1:80>

ErrorLog logs/b-error_log

CustomLog logs/b_log env=common

<Location / >

        ProxyPass ajp:// localhost:8010/

</Location>

</VirtualHost> 

 

⑤サーバのタイムアウトの設定時間を変更する

「vi /etc/httpd/conf/httpd.conf」

Timeout 60 →Timeout 1800に変更

 

 

⑥プロジェクトのwelcomeページを設定する。ディレクトリアクセス時に表示するページ

「vi /usr/share/tomcat8.0.36/conf/web.xml

<welcome-file-list>

        <welcome-file>index.html</welcome-file>

        <welcome-file>index.htm</welcome-file>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list> 

 

と書かれている部分を以下の通りに変更する。

<welcome-file-list>

        <welcome-file>html/login.jsp</welcome-file>

        <welcome-file>html/index.jsp</welcome-file>

        <welcome-file>index.html</welcome-file>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list> 

 

⑦設定の適用

「service network restart」

「service httpd restart」

「/usr/share/tomcat8.0.36/bin/ startup.sh」

「/usr/share/tomcat8.0.36.8010/bin/ startup.sh」

 

c++で接続されているUSBのシリアル番号を取得するプログラム

仕事でUSBライセンス認証機能をつくった。

MicroSoftサンプルソースをいじった

javaしかやっていなかった私はとても苦労しました。

汚い部分や非効率な部分もあるでしょうが多めに見てください

関数名も英語のできなさがでてて恥ずかしい

#include <devguid.h>//ココらへんのインクルードはどれ使うか忘れました
#include <regstr.h>

#include "stdafx.h"
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#include <string>
#include <fstream>
#include <iterator>
#include <stdlib.h>//ココらへんのインクルードはどれ使うか忘れました


#pragma comment(lib, "wbemuuid.lib")



//hash
string EncodeSerial(string word)
{
    //Hash
}
/*BSTRをSTringに変換*/
string BstrConvertToString(BSTR bst){  // 関数の定義
    //BSTRをcharに変換
    char Char[255]="";
    WideCharToMultiByte(
        CP_ACP,         // コードページ ANSI コードページ
        0,          // 処理速度とマッピング方法を決定するフラグ
        (OLECHAR*)bst,      // ワイド文字列のアドレス
        -1,         // ワイド文字列の文字数
        Char,           // 新しい文字列を受け取るバッファのアドレス
        sizeof(Char) - 1,       // 新しい文字列を受け取るバッファのサイズ
        NULL,           // マップできない文字の既定値のアドレス
        NULL            // 既定の文字を使ったときにセットするフラグのアドレス
    );
    //charをstringに変換
    string Str = Char;
    return Str;
}
/*StringをBSTRに変換*/
BSTR StringConvertToBstr(string str){  // 関数の定義
    LPSTR lstr = (LPSTR)str.c_str();
    //BSTRに必要なバッファサイズを求める
    int bstrlen=(int)MultiByteToWideChar(
        CP_ACP,         // コードページ ANSI コードページ
        0,          // 文字の種類を指定するフラグ
        lstr,           // マップ元文字列のアドレス
        strlen(lstr),       // マップ元文字列のバイト数
        NULL,           // マップ先ワイド文字列を入れるバッファのアドレス
        0           // バッファのサイズ
        );

    //バッファを確保する
    BSTR bstr=SysAllocStringLen(NULL,bstrlen);

    //BSTRに複製
    MultiByteToWideChar(
        CP_ACP,
        0,
        lstr,
        strlen(lstr),
        bstr,
        bstrlen
        );
    return bstr;
}
//メイン
int CompareHash()
{
  //フラグ
    BOOL success=false;
    HRESULT hres = CoInitialize(NULL);
    /コンソールアプリだとStep1,Strp2をコメント化する必要はない。コメントにすると動かなくなる。windowsアプリケーションはコメントにしないと動かない。原因は不明。そもそもc++全くわからない/
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    /*hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        return 0;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

                      
    if (FAILED(hres))
    {
        CoUninitialize();
        return 0;                    // Program has failed.
    }*/
    
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        CoUninitialize();
        return 0;                 // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (for example, Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );
    
    if (FAILED(hres))
    {
        pLoc->Release();     
        CoUninitialize();
        return 0;                // Program has failed.
    }



    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 0;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_DiskDrive Where InterfaceType=\'USB\'"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 0;               // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);
        if(0 == uReturn)
        {
            break;
        }
        VARIANT vtProp;
    char deviceID[]="";
        // Get the value of the Name property
    //デバイズID
        hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
        wcout << " DeviceID : " << vtProp.bstrVal << endl;
    BSTR drvDevId=L"";
    drvDevId=vtProp.bstrVal;
    //usbList[i][255] = vtProp.bstrVal;
    //シリアル番号を取得
    hr = pclsObj->Get(L"PNPDeviceID", 0, &vtProp, 0, 0);
    BSTR pnpdeveiceID = vtProp.bstrVal;
        wcout << " PNPDeviceID : " << vtProp.bstrVal << endl;
    //シリアル番号を抽出する
    string strpnpCode = BstrConvertToString(vtProp.bstrVal);
    char key='\\';
    int position=0;
    //最後の\の位置を特定
    for(int s=0;s<strpnpCode.size();s++){
        char target = strpnpCode[s];
        if(key == target){
            position = s;
        }
    }
    strpnpCode = strpnpCode.substr(position+1,strpnpCode.length());
    //hashに変換
    string serialHash=EncodeSerial(strpnpCode);
    //利用可能判別フラグ
    hr = pclsObj->Get(L"ConfigManagerErrorCode", 0, &vtProp, 0, 0);
    int ableFlg=vtProp.intVal;
        VariantClear(&vtProp);
        pclsObj->Release();
    if(ableFlg != 0){
        //利用不可能だった場合
        continue;
    }
    //パーティションを取得
    IEnumWbemClassObject* pEnumerator2 = NULL;
    HRESULT hres2;
    string strDrvDevId=BstrConvertToString(drvDevId);
    string sql= "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=\'" + strDrvDevId + "\'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
    BSTR sql1Bstr=StringConvertToBstr(sql);
    hres2 = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t(sql1Bstr),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator2);
    if (FAILED(hres2))
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        continue;               // Program has failed.
        }
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
     while (pEnumerator2)
    {
        HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if(0 == uReturn)
        {
            break;
        }
        VARIANT vtProp;
        // Get the value of the Name property
        //デバイズID
        hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
        BSTR patDevId = vtProp.bstrVal;
        VariantClear(&vtProp);
        //論理ディスクを取得
        IEnumWbemClassObject* pEnumerator2 = NULL;
        HRESULT hres2;
        string sql2= "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=\'" + BstrConvertToString(patDevId) + "\'} WHERE AssocClass = Win32_LogicalDiskToPartition";
        BSTR sql2Bstr=StringConvertToBstr(sql2);
        hres2 = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t(sql2Bstr),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator2);
        if (FAILED(hres2))
        {
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            continue;               // Program has failed.
        }
        IWbemClassObject *pclsObj = NULL;
        ULONG uReturn = 0;
         while (pEnumerator2)
        {
            HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, 
                    &pclsObj, &uReturn);
            if(0 == uReturn)
            {
                break;
            }
            VARIANT vtProp;
            // Get the value of the Name property
            //デバイズID
            hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
            //シリアルファイルのhashを確認する
            string path= BstrConvertToString(vtProp.bstrVal) + "\\aaa.hash";
            std::ifstream ifs(path.c_str());
            //解放
            VariantClear(&vtProp);
            if (ifs.fail())
            {
                success= false;
            }else{
                std::string str((std::istreambuf_iterator<char>(ifs)),std::istreambuf_iterator<char>());
                //比較
                int len = strlen(serialHash.c_str());
                int len2=strlen(str.c_str());
                int i=0;
                for (i = 0;i < len;i++) {
                    if(i>len || i>len2){
                        break;
                    }
                    if (str[i] != serialHash[i]) break;
                }
                if (i == len) {
                    success= true;
                } else {
                    success= false;
                }
            }
        }
    }
    pclsObj->Release();
  }
    // Cleanup
    // ========
    
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
    cout << success << endl;
    return success;   // Program successfully completed
}

Laravelでajaxを利用する

Laravelでajax(POST)を利用するときに少し情報を集めたのでまとめる

 

シーン:一覧表示画面においてページアクセス時にajaxで一覧情報を取得する

① route.php へ登録(ココらへんは自分の環境)

Route::any('user/get','User\UserController@getView');

②html(Laravelのblade)のに追加

<meta name="csrf-token" content="{{ csrf_token() }}">

ajax部分を記述したjavascript

function ajax(id) {
 $.ajaxSetup({
  headers: {
   'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
 });
 $.ajax({
   type : "POST",
   //なければ不要(data)
   data: {
    id : id
   },
   //urlは各々の環境に合わせて 
   url : './user/get',
   dataType : "json",
   //通信に成功した場合
   success : function(json) {
    console.log(json);
   },
   //失敗した場合
   error : function(XMLHttpRequest, textStatus, errorThrown) {
    alert("エラーが発生しました:" + textStatus + ":\n" + errorThrown);
   }
 });
};

④Controllerへの記述

<?php
namespace App\Http\Controllers\User;
use Illuminate\Auth\Access\Response;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Facades\Auth;
use League\Flysystem\Exception;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
 /**
 * ajaxで取得する
 * [getView description]
 * @return {[type]} [description]
 */
 public function getView(){
  //DBdataを取得
  $collections = DB::select('select id,user_name from m_user;');
    return response()->json(
            [
                'data' => $collections
            ],
            200,[],
            JSON_UNESCAPED_UNICODE
        );
 }
}

⑤通信成功を確認したらjsonobjectで一覧表示するだけ

感想:POSTだからtokenを入れないといけないんですねー

 

開発環境構築編(Laravel)

この記事は就職を控えた専門学生がWEBサービスを作る途中で技術ネタをまとめたものとなります


早速フレームワークの勉強を始めていこうと思います。

フレームワークは「Laravel」になります。

 

昨今は、プログラミング言語の擬人化も行われている時代ですね...

Laravelちゃん」,「Laravelたん」?

もう名前から可愛いですね。だれか絵を描いてください。

私の環境

OS mac OS X El Capitan
PHP,Apache,Mysql MAMP(PHP 5.6.10,Apache 2.2.29 Mysql 5.5.42)
ブラウザ chrome

お品書き

[1] インストール

[2] プロジェクト作成

[3] 初期設定 HelloWorld(Laravel 5)


[1]インストール

composerをインストールする。

・①mac の人はターミナルから

「 curl -sS https://getcomposer.org/installer | php 」

を実行(あらかじめダウンロードやデスクトップに移動してから行ったほうがいいです。)

②落としてきた composer.pharを簡単に実行できるようにしておく。

「 mv composer.phar /usr/local/bin/composer 」

・①windowsの人は

getcomposer.org

から最新版を落として実行しましょう。現在1.2が最新です。

[2]プロジェクト作成

プロジェクトを作成します。ワークスペースのルートに移動して作成します。

 

MACの場合:

ターミナルを開いて

「cd /Applications/MAMP/htdocs」(初期設定のままなら)

「composer create-project laravel/laravel プロジェクト名 --prefer-dist

※permission deniedと言われたらrootユーザになりましょう。

 

Windowsの場合:

コマンドプロンプトを開いて

「cd C:\work」(例)

composer create-project laravel/laravel プロジェクト名 --prefer-dist

 

で作成します。結構時間かかるのでしばらく放置

f:id:repenguin:20160811201011p:plain

こんな感じで終了。

f:id:repenguin:20160811201352p:plain

ファイル群が生成されているかを確認

[3] 初期設定 HelloWorld(Laravel 5)

MACの場合:

権限を与える

「chmod -R 777 storage」
「chmod -R 777 bootstrap/cache」

で書き込み権限を与えてやる。これをしないとエラーがでて動かない。

 

Windowsの場合:

特になし。

 

共通の処理

①config/app.php において

timezone: Asia/Tokyo,

'locale' => 'ja',

に変更。

②config/database.php において

自分のmysqlの内容に合わせて変更。

これで終了。

/*

application key を勝手にいじって keyがエラーですみいなことを言われたあなたへ

プロジェクトのディレクトリで

php artisan key:generate」コマンドでアプリケーションキーを生成。

.envファイル(隠しファイル)のアプリケーションキーの部分と

config/app.phpアプリケーションキーの部分を

生成されたアプリケーションキーに合わせると解決するぞい。これで30分悩んだ

*/

あと500エラーでよくわからない人はphpのログファイルを見たらヒントになります。

 

③へろーワールドを確認する。

localhost/プロジェクト名/public

でアクセス可能

f:id:repenguin:20160811203409p:plain

これで環境構築編完了。お疲れ様でした。

 

 

 

 

 

 

 

 

WEBサービスを作って/* */作戦(思考)

どうもこんにちは。りぺんぎんと申します。ITの専門で学生をやっています。

もうすぐ就職します。

これからもよろしくお願い申し上げます。

 

最近本当に暑いです٩(๑`н´๑)۶

暑いとPCによくありませんね。

いきなりになりますが、

「私、WEBサービスを作ります!!」

まだ学生とはいえ、IT技術者たるもの経験を積むため、WEBサービスを作成し公開したいと思いました。(就職先はSIerですけどそんなの関係ない!)

なんか実績が欲しいからですね。

WEBサービスを作っても使ってもらえなければ意味はありません。

知ってもらうための宣伝する場所がないのでブログで技術記事でも書きながらやっていきたいと思いました。

はてなブログってやたら技術者が多いような気がするんですけどきのせいですか?

まぁのんびりやっていきたいと思います。


サーバー・言語・DBは何にするのか?

  1. 言語は「PHP」ver7
  2. サーバーは「AWS
  3. DBは「MYSQL

そもそも何を作るのか?

ひ・み・つ(人々の生活をもっと効率化し遊ぶ時間を増やすためのサービスを考えています)


で行きたいと考えています。

問題はフレームワークを何にするのか...

これは最近のトレンドを表しているものですね

やはり有名な「cakePHP」が一位ですが今回は「Laravel」で行きたいと考えています。

cakePHPって最近下火らしいですし

ってわけで頑張っていこう!!

これは宣言することで自分を追い込んでいくスタイルですよ...