ページ

2015年3月27日金曜日

Arduinoと戯れる 9 - LCD表示 -

以前挑戦して惨敗したLCD表示に挑戦してみる!!

とりあえず今日は半田付け〜動作確認まで。

・LCD
    マルツパーツで売られている「MI2CLCD-01」を使用




































いざ半田付け開始!!


















ほぼ初心者なので手が震えるorz
なんとか完成しました^^;


















へ、下手!! orz
とりあえずこれで進めるとして、液晶を取り付けて完成。


















とりあえず半田付けがちゃんとできているか確認。
今回は確認なので他力本願、サンプルにある「I2CLiquidCrystal」を使用。

・スケッチ
/*
  LiquidCrystal Library - Cursor

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch prints "Hello World!" to the LCD and
 uses the cursor()  and noCursor() methods to turn
 on and off the cursor.

 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalCursor

 */

// include the library code:
#include <I2CLiquidCrystal.h>
#include <Wire.h>

// initialize the library
// uncomment next line if you are using a LCD from Straberry Linux
I2CLiquidCrystal lcd(20, false);
                  //  |    +--- set true if the power suply is 5V, false if it is 3.3V
                  //  +-------- contrast (0-63)
// uncomment next line if you are using a LCD from Akizuki denshi
// I2CLiquidCrystal lcd;

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(A5, A4);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // Turn off the cursor:
  lcd.noCursor();
  delay(500);
  // Turn on the cursor:
  lcd.cursor();
  delay(500);
}

・Arduinoとの接続


















ざっくりですが・・・

↓実際に動かしてみた所


















表示できている!! か、感動><

最初、Arduino側の電源を3.3Vにつないでいたんですが、Arduino側が5Vで動作する場合は
5Vでいいらしい。

次回は中身を把握しながら進めようと思います。

参考URL

2015年3月22日日曜日

CSSをきちんと勉強する

CSSを一からお勉強


現在、業務ではStrutsを使用しているが覚える事が沢山あるので
HTML, CSS, JavaScriptがちゃんと勉強できていない!!

という事で今回はCSSお勉強

CSS (Cascading Style Sheets)
ページの見た目を定義する、W3Cの仕様の一つ。
CSS1.0, CSS2.0, CSS2.1, CSS3.0, CSS4.0
とある今回は安定しているCSS2.1をお勉強

公式ページ
http://www.w3.org/TR/CSS2/

基本的なCSSの書き方

セレクタ { プロパティ: 値; }

↓テストHTML
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>CSSの練習</title>
    <style>
      /* ① */
      p { color: orange; }
    </style>
    <!-- ③ -->
    <link rel="stylesheet" href="default.css">
  </head>
  <body>
    <!-- ② -->
    <p style="color: violet;">こんにちは</p>
  </body>
</html>

① <head>タグ内に<style>タグを使用してCSSを記述する
② 属性として直接書く ★①②より優先される
③ 外部ファイルにCSSを書いて読み込む
↓外部ファイル(default.css)
p { color: skyblue; }


↓表示



②の属性を無くすと・・・


<head>タグに書いた順番で適用される。

セレクタの種類

1.   *  => ユニバーサルセレクタ, 全ての要素に適用させる
2.  要素めい(p, h1, div)  => 要素名を直接指定
3.  #id  => id要素
4.  .class => class要素

例) html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>CSSの練習</title>
    <link rel="stylesheet" href="default.css">
  </head>
  <body>
    <h1>H1</h1>
    <p id="id1">うまい</p>
    <p class="class1">やすい</p>
    <p class="class1">はやい</p>
  </body>
</html>

例) css
h1 { color: skyblue; }
#id1 { color: orange; }
.class1 { color: violet; }

↓表示

セレクタの書き方

① a, b  => aとb両方に適用させる
② a b => aの階層の下にあるb全て
③ a > b => aの直下にあるbだけ
④ a + b => a要素の次にくるb要素
⑤ ab => aかつbの要素

2015年3月16日月曜日

GAEと戯れる 21 - トラブル集 -

トラブル集

「必要な .class ファイルから間接的に参照されています」が発生した場合



ビルドパスの構成より、ライブラリを一旦削除し再度追加する。


↓それでも無理な場合


「.externalToolBuilders」について



ディレクトリトップに.externalToolBuildersが出来ていたので削除したらコンパイルがNGになってしまいました。
「.project」ファイルの中身

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
 <name>eNaviPrj</name>
 <comment></comment>
 <projects>
 </projects>
 <buildSpec>
  <buildCommand>
   <name>org.eclipse.jdt.core.javabuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
   <triggers>full,incremental,</triggers>
   <arguments>
    <dictionary>
     <key>LaunchConfigHandle</key>
     <value>&lt;project&gt;/.externalToolBuilders/com.google.appengine.eclipse.core.enhancerbuilder.launch</value>
    </dictionary>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
   <triggers>full,incremental,</triggers>
   <arguments>
    <dictionary>
     <key>LaunchConfigHandle</key>
     <value>&lt;project&gt;/.externalToolBuilders/com.google.appengine.eclipse.core.projectValidator.launch</value>
    </dictionary>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
   <triggers>full,incremental,</triggers>
   <arguments>
    <dictionary>
     <key>LaunchConfigHandle</key>
     <value>&lt;project&gt;/.externalToolBuilders/com.google.gdt.eclipse.core.webAppProjectValidator.launch</value>
    </dictionary>
   </arguments>
  </buildCommand>
 </buildSpec>
 <natures>
  <nature>org.eclipse.jdt.core.javanature</nature>
  <nature>com.google.appengine.eclipse.core.gaeNature</nature>
  <nature>com.google.gdt.eclipse.core.webAppNature</nature>
 </natures>
</projectDescription>
赤字の箇所でディレクトリを指定している。
試しに新規にGAEプロジェクトを作成しても.externalToolBuildersは作成されない。


↓新規に作成したプロジェクトの.projectファイル
<buildSpec>
  <buildCommand>
   <name>org.eclipse.wst.common.project.facet.core.builder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.eclipse.jdt.core.javabuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>com.google.appengine.eclipse.core.enhancerbuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>com.google.appengine.eclipse.core.gaeProjectChangeNotifier</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>com.google.appengine.eclipse.core.projectValidator</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
   <arguments>
   </arguments>
  </buildCommand>
 </buildSpec>


特に外部フォルダを作成しなくてもよさげ
※ビルド構成を見たい場合は、プロジェクト右クリック > 「プロパティ」、「ビルダー」で確認できる


Metaファイルが生成されない



いくらコンパイルしてもmetaファイルが生成されない場合


1.そもそもアノテーション処理が有効になっているか確認


プロジェクトのプロパティ > 「Javaコンパイラー」 > 「注釈処理」



















生成されるソースディレクトリには「src」を設定




2.ファクトリーパスにslim3-gen-XXX.jarが追加されているか


プロジェクトのプロパティ > 「Javaコンパイラー」 > 「注釈処理」 > 「ファクトリーパス」





















2015年3月13日金曜日

ドラクエ・ヒーローズ購入!!

誘惑に負けて・・・

発売前から欲しくてしょうがなかったドラクエヒーローズですが、
評判がいいみたいなので、ポチってしまいました^^;















公式サイト
http://www.dragonquest.jp/heroes/

プレイした感想は、ドラクエシリーズが好きな人は懐かしくなってしまう。
アクションも無双シリーズのコーエーなので爽快っす。
また夜な夜なやってしまいそうだorz



GAEと戯れる 20 - gdata スプレットシートのリンク取得 -

gdataを使って、スプレットシートのリンクを取得

・サンプル
protected Navigation run() throws Exception {

SpreadSheetService ss = new SpreadSheetService(“XXXXX");
SpreadsheetEntry se = ss.findSheet(“XXXXX");
System.out.println(se.getHtmlLink().getHref());
request.setAttribute("href", se.getHtmlLink().getHref()); // ★★
WorksheetEntry we = se.getDefaultWorksheet();

// 更新対象のセルを取得
        CellQuery cellQuery = new CellQuery(we.getCellFeedUrl());
        cellQuery.setRange("A1:C1");
        cellQuery.setReturnEmpty(true); // 空セルも返すようにする
        CellFeed cellFeed = ss.getCellFeed(cellQuery);

        // 更新
        CellEntry cellEntry;
        // A1
        cellEntry = cellFeed.getEntries().get(0);
        System.out.println(cellEntry.getTitle().getPlainText());
        cellEntry.changeInputValueLocal("3");
        cellEntry.update();
        // B1
        cellEntry = cellFeed.getEntries().get(1);
        System.out.println(cellEntry.getTitle().getPlainText());
        cellEntry.changeInputValueLocal("4");
        cellEntry.update();
        // C1
        cellEntry = cellFeed.getEntries().get(2);
        System.out.println(cellEntry.getTitle().getPlainText());
        cellEntry.changeInputValueLocal("=SUM(A1,B1)");
        cellEntry.update();

        System.out.println("セルの更新が完了しました。");
return super.run();

}

・JSP側
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Index</title>
</head>
<body>
<p>Hello Index !!!</p>
<a href="${href}">link</a>
</body>

</html>


★★の箇所がスプレットシートのリンクを取得している箇所
  SpreadsheetEntry#getHtmlLink()
  Link#getHref()

・実行












↓リンクを押すと・・


















ちゃんとスプレットシートに遷移しました^^
ただ、当然アカウントのログインは求められます。

2015年3月9日月曜日

GAEと戯れる 19 - gdataエラー -

gdataを使ったら叱られる

何も考えずに、gdataのjarをlibに入れて動かしたら以下のエラーが出た

HTTP ERROR 500

Problem accessing /. Reason:
    com/google/gdata/client/Query

Caused by:

java.lang.NoClassDefFoundError: com/google/gdata/client/Query
 at XX.XX.XXXXXX.org.controller.IndexController.run(IndexController.java:19)
 at org.slim3.controller.Controller.runBare(Controller.java:111)
 at org.slim3.controller.FrontController.processController(FrontController.java:491)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:277)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:237)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:199)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:55)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:223)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:187)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:490)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at org.mortbay.jetty.Server.handle(Server.java:326)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
 at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
 at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
 at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
 at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.ClassNotFoundException: com.google.gdata.client.Query
 at java.lang.ClassLoader.findClass(ClassLoader.java:531)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
 at org.slim3.controller.HotReloadingClassLoader.loadClass(HotReloadingClassLoader.java:114)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
 ... 46 more

Caused by:

java.lang.ClassNotFoundException: com.google.gdata.client.Query
 at java.lang.ClassLoader.findClass(ClassLoader.java:531)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
 at org.slim3.controller.HotReloadingClassLoader.loadClass(HotReloadingClassLoader.java:114)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
 at XX.XX.XXXXXX.org.controller.IndexController.run(IndexController.java:19)
 at org.slim3.controller.Controller.runBare(Controller.java:111)
 at org.slim3.controller.FrontController.processController(FrontController.java:491)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:277)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:237)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:199)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:55)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:223)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:187)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
 at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:490)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at org.mortbay.jetty.Server.handle(Server.java:326)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
 at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
 at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
 at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
 at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Powered by Jetty://


以下ソース
public class IndexController extends BaseController {

/* (non-Javadoc)
* @see XX.XX.XXXXXX.org.controller.BaseController#run()
*/
@Override
protected Navigation run() throws Exception {
SpreadSheetService ss = new SpreadSheetService("test");
//SpreadsheetEntry se = ss.findSheet("aaa");
return super.run();
}

}

なぜかSpreadSheetServiceをnewしている箇所で
com/google/gdata/client/Queryクラスが見つからない?

色々調べた所、場所が間違っていましたorz
プロジェクト直下のlibフォルダにjarをコピーしていましたが、
正解はWEB-INF/lib配下にコピーし、ビルドパスも通さないといけない模様。