インドのサリーを仕入れてメルカリで売ってみた結果

インドに旅行に行った女性が必ずサリーなどの民族衣装をを買ってくるので、
日本で以外と売れるんじゃないか?と思いインドのECサイトから仕入れてメルカリで売ってみました。こんなのです。

f:id:isotai:20171016194702j:plain

日本でも民族衣装売ってるサイトはあったのですが、値段も結構するしデザインも微妙なところが
多いなーという印象だったので、意外といけるんじゃないかなと思い、予算1万円程でテスト販売してみることにしました。

結論から言うと、残念なから現状としては1着だけ売れて、1万6000円くらいの赤字です。
まぁそううまくはいかないよね。。。

反省と備忘録として以下記録。

商品の選定

まずそもそも購入できる所がないと話にならないよないな、ということで検索です。
本格的な人は仕入れにインドまで行くのだと思いますが、そういうレベルではないので、
インドのECサイトで日本発送できる所を探します。


数カ所見て回ると、どうやらninecloursというECサイトが国際発送に対応してくれそうでした。
(後々インド人の知り合いに聞いた所、このninecloursというサイトは一度も聞いたことがないらしいです。)
www.ninecolours.com


さて、何を買うかなのですが、冷静に考えると………

・お土産で記念に買うかもしれないけど、日本ではサリーとか着る機会ないよね。
・外で着用してる人みたことない。
・サリーはオーダーメードが多いようで、既製品を買うとサイズの縛りが厳しすぎる。

..............

なので、
・LehengaというサイズがSMLの指定になっている服に変更
・使用シーンは、、、、普段きれないならクラブとか??パーティー? 
・子供服はいいかもしれない。
・日本にいるインド人はどうしてるんだろう。たぶん自分で買うか、送ってもらうよね。

と考えた結果、値段も安く買いやすい子供服に決定。

あとは感性に任せて購入していきます。
合計5着で1万4000円ほど、送料が1,638円でした。思ったより送料が安い。

メルカリで販売

Yahooのフリマもありますが、
年齢層が若そうなメルカリでまず出品しました。

2,30代の若いママが買ってくれる想定です。

後々Yahooのフリマにも同じ商品を出品しましたが、圧倒的にメルカリの方がビュー数が多かったです。

メルカリが240ビューのところ、
Yahooフリマは5ビューくらいでした。

メルカリで出すとビューといいねの数で、食い付きがあるのですが、Yahooフリマはしーんとして反応が感じられなかったです。

ユーザーからするとYahooフリマはカテゴリ分けがしっかりしていて、欲しいものがある人は商品にたどり着きやすいかなと、メルカリはカテゴリ分けは甘いけど、色んな画像が次々視界に入ってくるので、つい衝動買いしそうになりますね。

サリーとか検索されることが少い、色物?はメルカリの方が向いてるのかも。

本題の売れ行きのほうなんでが、
まず、出品する前の時点でカルチャーの違いに悩まされました。

まさか、不良品?!という気持ちが晴れません。

まず、2着は服の首の部分に穴が空いてない。どう着ろと?
切るのかな?とおもいましたが、
切り取りの目印もないので、
素人にはどうしようもない…。

あと一着はスカートにトップスの破片みたいな布切れが縫い付けてあり、これも困惑。
切り取って…どうしたらいいんでしょう。

とにかく売ろう! というこで、
上記説明した上で、安めにうったら、
トップスの破片つきスカートが何故かうれました。 きっとこの方は正解をしっているんだろう…。

その他の品は未だ出品中です。

文頭に番号を振る(Java)

特定の文字列の後に、0から順番に番号を振る必要があったので、Javaで作りました。

hogehoge=fugafuga を
hogehoge=1a.fugafugaに変換します。

aは識別文字で数字とは別に指定できるようにしています。
冒頭に#や改行がある行はスキップします。

public static void main(String[] args) {

		if (args.length != 3){
			System.out.println("引数が足りません。1.読み込み元2.書き込み先3.識別子");
		}

		String FP = args[0];
		String FM = args[1];
		String mark = args[2];

引数を3つとります。引数渡すのを忘れてエラーで終了する事が多々あるので、
忘れた時にメッセージ出すようにしました。
一般的にはどう処理するのが正解なのでしょうか...

public static HashMap addNumbersToEachStrings(HashMap linemap, String mark) {
		// String trimedLine = line.trim();
		HashMap<Integer, String> changedlinemap = new HashMap<Integer, String>();

		for (int i = 0; i < linemap.size(); i++) {

			String eachLine = (String) linemap.get(i);
			String[] splitedEachline = eachLine.split("[\\s]*=[\\s]*", 2);
			if(splitedEachline.length == 2){
			String changedLine = splitedEachline[0] + "=" + mark + i + "." + splitedEachline[1];
			changedlinemap.put(i, changedLine);
			}else{
				changedlinemap.put(i, eachLine);
				System.out.println("処理しないで書き込まれた行"+ i);
			}
		}
		return changedlinemap;

メインの処理部分です。
linemapにBufferedReaderでファイルから読み込んだ変換前の文字列が入っています。
markは識別子です。

String[] splitedEachline = eachLine.split("[\\s]*=[\\s]*", 2);

この部分で=の前後で分を分解しています。
分解後はjava|String[] splitedEachlineに格納します。
一番最初の=だけで分解したかったので、splitの第二引数に2を渡します。

この段階では#や改行も処理されていますが、

String changedLine = splitedEachline[0] + "=" + mark + i + "." + splitedEachline[1];

で番号と識別子を付け加えて分解した行を作り直すときに、分解できなかった列になると、
index out of bounds exceptionで終了してしまいます。

そのため、事前に

String[] splitedEachline

に2つ値を格納できているか

if(splitedEachline.length == 2)
||< 
で確認して、入っていない異常終了元の行は、何も手を加えずにスキップします。

その後、書き出し用のファイルを作成して、書き出して終了です。

改行や#など処理できない行をどう回避するのか悩み、
String.startsWith冒頭の文字を指定してスキップしたりしていましたが、

自作アプリ2つめ 勤務表入力アプリ(挫折)

自作アプリケーション2作目は、
エクセルに勤務時間を記載するアプリケーションを途中まで作って挫折しました。

Tomcatが動かなくなりました。
Tomcatダウンロードしなおしても、エクリプスダウンロードしなおしても、新しいワークスペースで作ってもどうしても動かないので一時休止しました。。

構想:2時間
実装:3時間
環境構築にはまる:5時間以上
です。


実装できたところ:

  • GUIから働いた時間と日にちを選択
  • 日にちに対応するExcelのローを取得

  • Excelに必要事項を書き込む


ちょっと工夫したところ:

  • 日にちを毎回選択するのは面倒だと思うので、GUIを開いた日にちを自動的に選択するようにした。
  • ファイルのパスや名前が変わることが予想されるので、外部のファイルから読み込むようにした。

f:id:isotai:20170321232403p:plain
うごけー!


以下、抜粋して紹介します。

HTML:

<form action="/Kinmu/Main" method="get">
日にち:
<select id="day" name="day">
<option value="1">1</option>
<option value="2">2</option>

始業:
<select name="start">
<option value="09:00" selected>09:00</option>
<option value="09:15">09:15</option>
//以下略

昼休み開始:
<select name="lunchstart">
<option value="12:00" selected>12:00</option>
<option value="12:30">12:30</option>
//以下略


昼休み終了:
<select name="lunchend">
<option value="13:00" selected>13:00</option>
<option value="13:30">13:30</option>
//以下略

終業:
<select name="finish">
<option value="18:00" selected>18:00</option>
<option value="18:30">18:30</option>

//以下略

</form>

選択要素はformのselectで統一しています。日にちは

<input type="time">

でカレンダーから選ぶこともできたのですが、
取得できる値が年号から(2017xxxxx)で、今回は使いずらかったのでやめました。



ページを開いた時に、今日の日にちを選択状態にするところ。

JavaScriptで日にち取得して、該当の日にちの

<option value="1">1</option>

にselected を追加して

<option value="1" selected>1</option>

にします。

<script>
windows.onload = setDay;
function setDay(){
	var date = new Date();
	var day = date.getDate();
    document.getElementById('day').options[day-1].selected = true;
}
</script>

<body onLoad="setDay()" >


Main.java

                //エクセルファイルの名前とパスを取得します。
		GetFIlePath getfilepass = new GetFIlePath();
		 String worktablepass = getfilepass.getWorkTablePass();
		 System.out.println(worktablepass);

               // GUIから入力された日にちに対応した、エクセルのRawを取得
                 GetRawAndCell getrawandcell  = new GetRawAndCell();
		int wtRaw = getrawandcell.getWtRaw(Integer.parseInt(day));

ざっくりと省きましたが、Main.javaサーブレットです。
GUIから入力された値を受け取っていい感じに調整します。
GetFIlePathとGetRawAndCellメソッドだけ紹介します。


GetFIlePath.java

public class GetFIlePath {

	public String getWorkTablePass(){

		String worktablepass = null;

		try {

		BufferedReader br = new BufferedReader(new InputStreamReader
               (new FileInputStream("/Users/Documents/workspace/kinmu/filepass.txt"),"UTF-8"));

		worktablepass = br.readLine();
        br.close();

		}catch(IOException e){
			System.out.println(e);
		}
		return worktablepass;

	}
}

filepass.txtの一行目に記載してあるエクセルファイルのパスと名前を取得して返します。
ファイル名が変更になったらfilepass.txtを編集します。

文字コードを指定して読み込むには、FileInputStreamを使用する必要があるようで、
ファイル読み込むだけでFileInputStream,InputStreamReader,BufferedReader、メソッド3つも登場しています。



GetRawAndCell.java

public class GetRawAndCell {

	public int getWtRaw(int day){

		int wtRaw = 0;

		switch (day) {
		case 1:
			wtRaw = 13;
			break;
		case 2:
			wtRaw = 14;

               //以下略

GUIから入力された日にちに対応した、エクセルのRawを取得します。
1から31までの数字に対応する、エクセルのRAWを取得できるようにする必要があります。
最初はif分で書こうと思っていたのですが、こういうときはswitch文の方がわかりやすいですね!発見です。


その後GUIから入力された勤務時間などを、実際にエクセルファイルに書き込んで終わりです。

isotai.hatenablog.com


いろいろと他にもやりたいことがあったはあったのですが、
今はTomcatに立ち向かう気力がないので撤退です!

自作アプリ1つめ 掲示板みたいなやつ

初めて作ったアプリケーションもどきを晒します。

もともとは簡易な社内SNS的なものを想像してたのですが、
雑なチャットぽいものが出来上がりました。

作り始めたころのレベルは、Javaの講座に週末3ヶ月くらい通ったあとです。
入門書に書いてある意味がなんとなくわかるかなーくらいのレベル感です。

CSS,JSP,データベース随所で躓きながらなんとか動く感じにはなりましたが、
なんとも雑な仕上がりになっています。

もう手はつけてないのですが、
このまま葬られるのが(個人的に)もったいないので、記録に残しておきます。
主要なページは3,4枚なので、ページごとに紹介していきたいと思います。

[index.jsp]

f:id:isotai:20170305181912p:plain

最初に表示されるページです。
ここからログインするか、ユーザー登録ページに遷移できます。

ユーザー登録ページは、後ほど説明するとして、
まずはフロントサイドでやったことから紹介します。

まず、このページはBootStrapとか使って整えようと頑張りました。

CSSよくわからなかったので、途中で手を止めて以下の本でお勉強。
クリックアンドドロップで作れるWebサイトとかに慣れていると、
CSSってかなり不便に感じるかも? フォームの表示場所変えるだけなのに
マージンとかフロートの範囲とか気にするのが煩わしい!と思いつつ
今風なログインページを”目指して”作っています。

f:id:isotai:20170306224355p:plain

ロゴだけはいい感じではないでしょうか。
すべてこのサービスのおかけです。
logo.squarespace.com


入力ホームはBootStrapのテンプレートをお借りしました。
以下のサイトは、ログインフォームのテンプレートが充実していていい感じです。
bootsnipp.com

ログインフォームは基本テンプレートのコピペです。
背景を透明にしたかったので、form のstyle = background-color:rgba(0,0,0,0.0);のところだけいじっています。

<div class = "container">
<div class="wrapper" >
<form method = "get" action="/ooo/LoginUser" class="form-signin" style = background-color:rgba(0,0,0,0.0);>
<h3 class="form-signin-heading" style = color:white;>welcome! please sigh in</h3>
<hr class="colorgraph"></br>
<input type = "text" name = "email" class="form-control" placeholder="Username"></br>
<input type = "password" name="pass" class="form-control"placeholder="Password"></br>
<input type = "submit" value = "ログイン"  class="btn btn-lg btn-primary btn-block"></br>
</hr>
</form>
 </div>
</div>

画像の上に黒透明色をかぶせて、それっぽくしています。

photofronto{
     width:100%;
    height:100%;
    background-size: cover;
    margin:0 auto;
    position:relative;
    background-color:rgba(0,0,0,0.5);
}

背景画像がおかしくならないおまじない。

body{   
  background-position: center center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-size: cover;
}

ログインフォームから送付入力されたユーザー名とパスワードが正しいかサーバーサイドで検証し、
正しい場合、ユーザーページに遷移するようにします。
よくよく見返してみると、ユーザーとパスワードの判定もなんだか怪しいのですが、
ログイン情報に間違いがあると、NULLで処理がとまって結果的にログインできなくなります!(´Д` )
ユーザー名とパスワードを指定してselectして結果が得られなかったらログイン失敗になります。


ユーザー登録処理のサーブレット

@WebServlet("/LoginUser")
public class LoginUser extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LoginUser() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		
		//フォームから送付されたデータの受け取り文字コードの指定をしない文字化けする。
		request.setCharacterEncoding("UTF-8");
		String email = request.getParameter("email");
		String pass = request.getParameter("pass");		
		
		//取得したデータを値を保持するだけのクラスに渡す。
		LoginUserModel loginusermodel =  new LoginUserModel(email,pass);
		
		//フォームから入力されたユーザーネームとパスワードでDB検索。 結果をaccount変数に入れて返す。
		//DB検索後に、フォームからの入力値と検索結果が一致するか確認。今考えると入力値の検査はこのDAOでやってはいけなかった。
		//accountにはユーザー名、パスワード、ユーザーID入る。
		LoginUserDAO loginuserdao = new LoginUserDAO();
	    Account account = loginuserdao.login(loginusermodel);
	    
	    //なぜかユーザー名にたいしてヌルチェックをしている。
	    if(account.getUserName().equals("")){
	    	RequestDispatcher dispatch = request.getRequestDispatcher("/registerfalse.jsp");
			 dispatch.forward(request, response);
	   }else{
		   
		   //すべてのユーザーのユーザー名とユーザーIDを取得する。
		   //この情報はチャットで宛先を選ぶときに選択するユーザー表示に使用する。
		   GetAllUserDAO getalluserdao = new GetAllUserDAO();
		   ArrayList<Map<Integer,String>> userlist = getalluserdao.getAllUserNameandID();
			
		   //HttpSessionインタフェースのオブジェクトを取得
		    HttpSession session = request.getSession();
		    //useridデータをsessionスコープで保存
		    session.setAttribute("username",account.getUserName() );
		    session.setAttribute("userid",account.getUserId() );
		    session.setAttribute("userlist",userlist);
		   
		   RequestDispatcher dispatch = request.getRequestDispatcher("/UserPage.jsp");
			  dispatch.forward(request, response);
	   }
	}
}


データベースにログインフォームから送付されたユーザー名とパスワードを持ったユーザーがいるか検索。

public class LoginUserDAO {
	public Account login(LoginUserModel loginusermodel){
		
		 Connection conn = null;
			Account account = null;		
			String sql = "select * from users where email = ? and pass = ?";
		
		 try {	
			 Class.forName("org.postgresql.Driver");
		
	   conn =
	    DriverManager.getConnection("jdbc:postgresql:postgres",	
	                                "postgres",					
	                                "3450");						

			    	 }catch (Exception e){
			    		 System.out.println("接続失敗。");
			    		 e.printStackTrace();			    		 
			    	 }			    
			   	 try { 
   
			   	PreparedStatement ps = conn.prepareStatement(sql);				   		
			       ps.setString(1,loginusermodel.getEmail());
			       ps.setString(2,loginusermodel.getPass());
			       
			       ResultSet result = ps.executeQuery();
			

			      if(result.next()){
			    	  String useremail = result.getString("email"); 
			    	  String userpass = result.getString("pass"); 
			    	  String username = result.getString("name"); 
			    	  String userid= result.getString("userid"); 
			    	  
			    	  account = new Account(useremail,userpass,username,userid);
			      }
			       	    
			       
			   	 }catch (SQLException i){
		    		 System.out.println("select failed。");
		    		 i.printStackTrace();
		    		 
		    		 return null;
			   	 }finally{
		    		 
			    	  
			        if(conn !=null){
			        	try{
			        		conn.close();
			        	}catch (SQLException i){
				    		 System.out.println("closefailed");
				    		 i.printStackTrace();
				    		 return null;
			        	}		        	
			        }
	}	
			   	return account;	
			          	
		 } 

register.jsp

f:id:isotai:20170305224824p:plain

ユーザー登録画面です。
登録画面はこだわらなくていいだろ!という思いがつまっています。

受けっとったあと、一応ヌルチェックをしています。えらい!
あとここはJavaScriptフロントサイドでもヌルチェックをしています。

詳しくはここで。
メールアドレスの入力チェック(JavaScript) - isotaiの日記

request.setCharacterEncoding("UTF-8");
		String email = request.getParameter("email");
		String pass = request.getParameter("pass");		
		String name = request.getParameter("name");	
		
		if((email.equals("")) || (pass.equals("")) || (name.equals(""))){
			RequestDispatcher dispatch = request.getRequestDispatcher("/registerfalse.jsp");
			 dispatch.forward(request, response);


登録フォームから受け取った値でデータベースにユーザーを登録します。
パスワードの暗号化とかは実用するわけではないので気にしていないです。(気にする余裕がなかった)

メッセージ交換にユーザー固有のIDが欲しかったので、
randomUUIDという関数を使用してID生成後、一緒に登録します。

String sql = "insert into users(email,pass,name,userid) values(?,?,?,?)";
		   		PreparedStatement ps = conn.prepareStatement(sql);	
		    
		   		//useridの作成
		   		String uuid = UUID.randomUUID().toString();  
		   		
		       ps.setString(1,registerusermodel.getEmail());
		       ps.setString(2,registerusermodel.getPass());
		       ps.setString(3,registerusermodel.getName());
		       ps.setString(4,uuid);


あとはデータベースに書き込んで終了です。

UserPage.jsp

f:id:isotai:20170306220308p:plain

ようやくメインページです。
FacaBookをイメージして作りました;;

テキストエリアにメッセージを書きます。
do not show in filed:にチェックを入れると個人宛メッセージになり、フィードに表示されません。
個人メッセージ確認画面でのみ表示されます。プルダウンタブから宛先のユーザーを選択します。
この表示でログイン処理の際に取得したユーザー一覧情報を使用しています。
投稿フォームとフィードメッセージの表示CSSはBootStrapのテンプレートから拝借しています。

フォームから説明します。

<input type="text" name = "message" class="span4"  rows="10" size="30" placeholder="Type your post,change line = <br>" ></div>
   do not show in filed:<input type="checkbox" name = 'postconfirm' value = "no"></br>
<input type="hidden" name="useridfrom" value="<%=session.getAttribute("userid")%>">
<select name="useridto">
   <%for(int i = 0; i<userlist.size(); i++){%>
   <%Map<Integer,String> list = userlist.get(i);%>
   <%String name =  list.get(1);%>
   <%String id =  list.get(2);%>
   <option value=<%=id%>><%=name%></option>
   <%}%>
</select>
<br/>
<h6 class="pull-right" id="cLeft"></h6>
<div class = "text-right">
<input type="submit" value = "submit" class="btn btn-info" onClick="return formNullCheck()">

プルダウンタブにユーザー一覧を表示するところでちょっと悩みましたが、
JSPを使い、事前にArrayList型のuserlist変数にユーザーの名前とIDを入れて、
for文の中でユーザー情報を一つ一つ取り出し、
の部分で指定しています。

ログイン時にセッションに入れた情報を取りでしているところ。<%ArrayList> userlist = (ArrayList>)session.getAttribute("userlist");%>


メッセージは以下のように保存されます。
メッセージの送信者、宛先のユーザーのIDとフィード投稿可否が保存されます。

f:id:isotai:20170306220111p:plain


次にフィードのメッセージ表示部分です。

<!>投稿されたメッセージの表示</!>
<div class = "center">
<%GetMessageDAO getmessagedao = new GetMessageDAO();%>
<%ArrayList<Map<Integer,String>> messagelist = getmessagedao.getMessage();%>
<%for(int i = 0; i<messagelist.size(); i++){%>
	<%Map<Integer,String> list = messagelist.get(i);%>
	<%	String message =  list.get(1);%>
	<%	String time =  list.get(5);%>
	<%	String namefrom =  list.get(6);%>
	<%	String nameto =  list.get(7);%>
<div class="activity-feed">
<div class="feed-item">
<div class="date">To:<%=nameto%></div>
<div class="text"><%=message%></div>
<div class="date">From:<%=namefrom%> (<%=time%>)</div>
</div>
</div>
<%}%>

JSPから直接DAOを呼び出しています!MVC的にはやっちゃだめとどこかで読んだ気がしますが、
これ作ってるときはそれどころではなかった!
これで一応、メッセージ投稿→ページ更新→最新の30のメッセージ表示。
といった動きで最新の投稿が常に表示されます!

ここでちょっとめんどくさいことが発覚しまして、
メッセージテーブルにはユーザーIDしか保存してないんですね。
でもやっぱりメッセージを表示するときは、To ユーザーの名前 From ユーザーの名前
で表示したいなーとなります、あたりまえですが。

ユーザーの名前を保持してるのは、userテーブルというのが別にあるんです。
これはユーザー登録のときに情報を書き込んでます。

f:id:isotai:20170306221214p:plain

さぁどうしたものかと。
幸い複数テーブルを一度にselectできるInner Join というのがあるようです。
ということで四苦八苦しながらクエリを作りました。これで無事メッセージは表示できています。

select message,useridfrom,useridto,postconfirm,time,t1.name as usernamefrom,t2.name as usernameto from usermessages ii inner join users t2 on ii.useridto = t2.userid inner join users t1 on ii.useridfrom = t1.userid where postconfirm = 'yes' order by time desc limit 30;


だいたいこんな感じです。
このあと、個人メッセージ受信用のページ、メッセージを受信したらメール通知する機能とかを作りまして、
初アプリケーションは日の目を見ることなく葬られました。

メールアドレスの入力チェック(JavaScript)

フォームにメールアドレスを入力後、submitしたときに、
メールアドレスの形でない場合、ユーザーに通知してsubmitを止めるやつ。

フォームの値を取り出す

elements.[フォームにつけたname or 参照番号]
htmlからJavaScriptを呼ぶ際に、引数でthisを渡しているので、
frm.elements.[フォームにつけたname or 参照番号]で値取得ができる。

HTML側
onSubmit="return registerFormCheck(this)">

JavaScript
function registerFormCheck(frm)

単純に呼び出す場合は、
document.forms.フォームの名前.elements

正規表現

ここは正直コピペです。。今度調べる。

var Seiki=/[!#-9A-~]+@+[a-z0-9]+.+[^.]$/i;


HTML:

<body>
	<h1>登録</h1>
	<form action="/ooo/RegisterUser" method="get"
		onSubmit="return registerFormCheck(this)">
		mail:<input type="text" name='email'><br> pass:
		<input type="password" name='pass'><br> name:
		<input type="text" name='name'><br>
		<input type="submit" value="登録"><br>
	</form>
</body>
</html>


JavaScript:

function registerFormCheck(frm){
	var hissu = Array("email","pass","name");
	var len = hissu.length;
	var Seiki=/[!#-9A-~]+@+[a-z0-9]+.+[^.]$/i;
	for(i=0; i<len; i++){
		var obj = frm.elements[hissu[i]];
		if(hissu[i]==="email" && !obj.value.match(Seiki)){
			window.alert("enter vailed mail address");	
			return false;
		}else if(obj.value == ""){
			window.alert(hissu[i]+"is required");
			obj.focus();
			return false;
		}
	}

	return true;
}

Java mailでメール送信する (Java)

Java mail を使用して、google mail からメール送信する覚え書き。
漠然とプログラムからメール送信するの、
結構手間じゃないのかなー、と思っていましたが、スルスルとできました。
Java mail 便利!

google mail 側の設定で、
アクセス許可設定をしていなかったので、エラーになっていたことに気づかなかったところで
少し詰まりました。気づけば簡単なことでした。

これです。

support.google.com


参考にさせていただいたサイト
JavaMailでメール送信

2007-09-04 diary: Java JavaMail 調査 , JavaMailによるシンプルなメール送信サンプル


細かいところは以下のオラクルのドキュメントが参考になります。
http://www.oracle.com/technetwork/java/providers-150193.pdf


サンプル

package test;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailtest {
   
//エンコード指定
    private static final String ENCODE = "ISO-2022-JP";


    public static void main(final String[] args) {
        
        //メール送付
        new SendMailtest().send();

    }

//ここからメール送付に必要なSMTP,SSL認証などの設定

    public void send() {
        final Properties e.printStackTrace(); = new Properties();

        // SMTPサーバーの設定。ここではgooglemailのsmtpサーバーを設定。
        props.setProperty("mail.smtp.host", "smtp.gmail.com");

        // SSL用にポート番号を変更。
        props.setProperty("mail.smtp.port", "465");

        // タイムアウト設定
        props.setProperty("mail.smtp.connectiontimeout", "60000");
        props.setProperty("mail.smtp.timeout", "60000");

        // 認証
        props.setProperty("mail.smtp.auth", "true");

        // SSLを使用するとこはこの設定が必要。
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", "465");

       //propsに設定した情報を使用して、sessionの作成
        final Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("自分のメールドレス", "アカウントのパスワード");
            }
        });

     

        // ここからメッセージ内容の設定。上記で作成したsessionを引数に渡す。
        final MimeMessage message = new MimeMessage(session);

        try {
            final Address addrFrom = new InternetAddress(
                    "自分のメールアドレス", "送信者の表示名", ENCODE);
            message.setFrom(addrFrom);

            final Address addrTo = new InternetAddress("宛先メールアドレス",
                    "受信者の表示名", ENCODE);
            message.addRecipient(Message.RecipientType.TO, addrTo);

            // メールのSubject
            message.setSubject("ありがとうメッセージ受信しました!", ENCODE);

            // メール本文。
            message.setText("こんにちは。", ENCODE);


            // その他の付加情報。
            message.addHeader("X-Mailer", "blancoMail 0.1");
            message.setSentDate(new Date());
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // メール送信。
        try {
            Transport.send(message);
        } catch (AuthenticationFailedException e) {
            // 認証失敗
                 e.printStackTrace();
        } catch (MessagingException e) {
            // smtpサーバへの接続失敗
           e.printStackTrace();
           
        }
    }
}

SEとプロマネを極める 仕事が早くなる文章作法

SEとプロマネを極める 仕事が早くなる文章作法

プログラミングの技術書を読んでいると、「。」がやたら多いなと思った。読みやすい。
複雑な処理を素人にも理解できるように書くにはさぞ骨が折れるのだろうな。。。など考えているうち、
技術文書を書く訓練をした経験がないことに気づき、これはまずい、、と手に取った本。


まとめ

  • 格助詞「の」を避ける

→文に複数の意味が生まれる。

新しい表計算ソフトウェアのアップデート・プログラムはメーカーより今月末に提供される

「新しい」が表計算ソフトウェア、アップデート・プログラム両方を修飾しているので、
ふた通りの意味に読める。

  • 文章を書く前に、「主題」「目的」を明確にする。

読み手はどういう点に関して、意見を求めているのか。
なんの為に書くのか。
その上で、主題は一つになるように絞り込む。

  • 否定文や二重否定文は避ける

なくならない
なければならない

  • 形容詞と副詞をなるべく避ける
  • 文章の入れ子構造を避ける
  • 一文一義で文を切る
  • 「そして」を避ける

単一の文章で二つ以上の要求をすることになり、分かりずらい。

  • 事実と主張を分ける