<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5334641280801634916</id><updated>2024-09-06T04:42:01.475+09:00</updated><category term="java"/><category term="jetty"/><category term="jersey"/><category term="ｊ2ee"/><category term="server"/><category term="maven"/><category term="spring"/><category term="Wndows"/><category term="java8"/><category term="json"/><category term="ubuntu"/><category term="android"/><category term="jax-rs"/><category term="memcached"/><category term="Cassandra"/><category term="batch"/><category term="cocos2d-x"/><category term="eclipse"/><category term="generic"/><category term="html"/><category term="iOS"/><category term="jni"/><category term="vmware"/><category term="ASP"/><category term="C#"/><category term="CentOS"/><category term="Google"/><category term="aws"/><category term="iptables"/><category term="javascript"/><category term="listener"/><category term="spring-security"/><title type='text'>chkisheの覚え書き</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-4798319359644393497</id><published>2017-05-01T12:51:00.000+09:00</published><updated>2017-05-01T12:51:47.297+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="cocos2d-x"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jni"/><title type='text'>cocos2d-x JNI(Java) の に関する覚書</title><content type='html'>調べたりした結果をずらずらと並べます&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
cocos2d-x 3.x系 android studioでのJNI headerの作成&lt;/h4&gt;
cd proj.android-studio &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;javah -classpath &quot;app/build/intermediates/classes/debug/:../cocos2d/cocos/platform/android/libcocos2dx/build/intermediates/classes/debug:$ANDROID_SDK_ROOT/platforms/android-23/android.jar&quot; -d &quot;app/jni/NativeBridge&quot; org.cocos2dx.cpp.AppActivity&lt;br /&gt;
&lt;br /&gt;
#android-sdkのバージョンは環境に合わせてください&lt;br /&gt;
#一度ビルドする&lt;br /&gt;
#app/jni/NativeBridgeにheaderファイルが作成されます&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
SDKBOX Admobプラグインの位置修正 &lt;/h4&gt;
&lt;pre style=&quot;background-color: white; color: black; font-family: &#39;Menlo&#39;; font-size: 9.0pt;&quot;&gt;Admobプラグインは位置が上下左右固定なのでマージンを指定したい場合&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; color: black; font-family: &#39;Menlo&#39;; font-size: 9.0pt;&quot;&gt;次のようなコードで変更できてる模様 &lt;/pre&gt;
&lt;pre style=&quot;background-color: white; color: black; font-family: &#39;Menlo&#39;; font-size: 9.0pt;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; color: black; font-family: &#39;Menlo&#39;; font-size: 9.0pt;&quot;&gt;ViewGroup rootView = AppActivity.&lt;span style=&quot;font-style: italic;&quot;&gt;getRootView&lt;/span&gt;(context);&lt;span style=&quot;color: grey; font-style: italic;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;if&lt;/span&gt;(rootView != &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;null&lt;/span&gt;)
{
    &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;for &lt;/span&gt;(&lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;int &lt;/span&gt;i = &lt;span style=&quot;color: blue;&quot;&gt;0&lt;/span&gt;; i &amp;lt; rootView.getChildCount(); i++) {

        ViewGroup view = (ViewGroup)rootView.getChildAt(i);

        &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;for &lt;/span&gt;(&lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;int &lt;/span&gt;j = &lt;span style=&quot;color: blue;&quot;&gt;0&lt;/span&gt;; j &amp;lt; view.getChildCount(); j++ ) {
            &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;if &lt;/span&gt;(view.getChildAt(j) &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;instanceof &lt;/span&gt;AdView) {
                View child = view.getChildAt(j);
                &lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;int &lt;/span&gt;height = child.getBottom() - child.getTop();

                ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) child.getLayoutParams();
                lp.&lt;span style=&quot;color: #660e7a; font-weight: bold;&quot;&gt;bottomMargin &lt;/span&gt;= &lt;span style=&quot;color: blue;&quot;&gt;60 &lt;/span&gt;* height / &lt;span style=&quot;color: blue;&quot;&gt;50&lt;/span&gt;;
                child.setLayoutParams(lp);
            }
        }

    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
追記予定... </content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/4798319359644393497/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/4798319359644393497' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/4798319359644393497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/4798319359644393497'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2017/05/cocos2d-x-jnijava.html' title='cocos2d-x JNI(Java) の に関する覚書'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-1676065672567751988</id><published>2017-04-29T11:21:00.003+09:00</published><updated>2017-05-01T12:38:10.922+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="cocos2d-x"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jni"/><title type='text'>cocos2d-x &lt;- android UIスレッドからの値の取得</title><content type='html'>cocos2d-xなどでAndroidのUIスレッドから値を直接取得したいという場合&lt;br /&gt;
例えば、 クリップボードから取得する場合とか&lt;br /&gt;
runOnUiThreadから処理したのちにcallbackを呼ぶ 必要があります&lt;br /&gt;
&lt;br /&gt;
大変面倒なのでwaitを使ってブロッキング処理をしてみましょう&lt;br /&gt;
ということで&lt;a href=&quot;http://stackoverflow.com/questions/5996885/how-to-wait-for-android-runonuithread-to-be-finished&quot;&gt;BlockingOnUIRunnable&lt;/a&gt;を少し改良してGeneric型を返すようにしてみました &lt;br /&gt;
&lt;br /&gt;
&lt;span id=&quot;goog_252782446&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;span id=&quot;goog_252782447&quot;&gt;&lt;/span&gt;

&lt;span id=&quot;goog_252782446&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;span id=&quot;goog_252782447&quot;&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;h4&gt;
BlockingOnUIRunnable.java
&lt;/h4&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;/**
 * Blocking Runnable executing on UI thread
 *
 * @author
 *
 */
public class BlockingOnUIRunnable&amp;lt;t&amp;gt;
{
    // Activity
    private Activity activity;

    // Event Listener
    private BlockingOnUIRunnableListener&amp;lt;t&amp;gt; listener;

    // UI runnable
    private Runnable uiRunnable;

    public T retValue;

    /**
     * Class initialization
     * @param activity Activity
     * @param listener Event listener
     */
    public BlockingOnUIRunnable( Activity activity, BlockingOnUIRunnableListener&amp;lt;t&amp;gt; listener )
    {
        this.activity = activity;
        this.listener = listener;

        uiRunnable = new Runnable()
        {
            public void run()
            {
                // Execute custom code
                if ( BlockingOnUIRunnable.this.listener != null ) {
                    retValue = BlockingOnUIRunnable.this.listener.onRunOnUIThread();
                }

                synchronized ( this )
                {
                    this.notify();
                }
            }
        };
    }


    /**
     * Start runnable on UI thread and wait until finished
     */
    public void startOnUiAndWait()
    {
        synchronized ( uiRunnable )
        {
            // Execute code on UI thread
            activity.runOnUiThread( uiRunnable );

            // Wait until runnable finished
            try
            {
                uiRunnable.wait();
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
        }
    }

}&lt;/pre&gt;
&lt;pre&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&amp;nbsp;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&amp;nbsp;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&amp;nbsp;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;
&lt;h4&gt;
BlockingOnUIRunnableListener.java
&lt;/h4&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;/**
 * Events for blocking runnable executing on UI thread
 *
 * @author
 *
 */
public interface BlockingOnUIRunnableListener&amp;lt;t&amp;gt;
{

    /**
     * Code to execute on UI thread
     */
    public T onRunOnUIThread();
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
使い方&amp;nbsp;&lt;/h4&gt;
&lt;br /&gt;
&lt;pre&gt;BlockingOnUIRunnable&amp;lt;String&amp;gt; actionRunnable 
  = new BlockingOnUIRunnable&amp;lt;String&amp;gt;( {{context}}, new BlockingOnUIRunnableListener()
{
    public String onRunOnUIThread()
    {
        ClipboardManager clipboard = (ClipboardManager) {{context}}.getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.hasPrimaryClip()) {
            ClipData data = clipboard.getPrimaryClip();
            ClipDescription description = clipboard.getPrimaryClipDescription();
            if (data != null &amp;amp;&amp;amp; description != null &amp;amp;&amp;amp; description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                return String.valueOf(data.getItemAt(0).getText());
        }
        
        return &quot;&quot;;
    }
} );

actionRunnable.startOnUiAndWait();
return actionRunnable.retValue;&lt;/pre&gt;
&lt;pre&gt;&lt;string&gt;&lt;string&gt;&amp;nbsp;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;string&gt;&lt;string&gt;&amp;nbsp;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;string&gt;&lt;string&gt;&amp;nbsp;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;
{{context}}はActivityのcontext, Cocos2dxActivity.getContext()等から取得する値
startOnUiAndWait()で処理を待って
retValueから戻り値を取得します&lt;br /&gt;
wait中はGLThreadが停止するので重たい処理には使えません</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/1676065672567751988/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/1676065672567751988' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1676065672567751988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1676065672567751988'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2017/04/cocos2d-x-android-ui.html' title='cocos2d-x &lt;- android UIスレッドからの値の取得'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-8735875718501685383</id><published>2016-02-12T12:08:00.000+09:00</published><updated>2016-02-12T12:08:01.452+09:00</updated><title type='text'>node.js サービス化 on ubuntu</title><content type='html'>&lt;a href=&quot;http://kvz.io/blog/2009/12/15/run-nodejs-as-a-service-on-ubuntu-karmic/&quot;&gt;ここ&lt;/a&gt;から抜粋&lt;br /&gt;
&lt;br /&gt;
/etc/init&lt;br /&gt;
以下にyourprogram.confとしてファイル作成&lt;br /&gt;
&lt;br /&gt;
#yourprogram.conf&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;description &quot;node.js server&quot;
author      &quot;kvz - http://kevin.vanzonneveld.net&quot;

# used to be: start on startup
# until we found some mounts weren&#39;t ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME=&quot;/root&quot;

    exec sudo -u www-data /usr/bin/node /where/yourprogram.js &amp;gt;&amp;gt; /var/log/node.log 2&amp;gt;&amp;amp;1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh &quot;node.js has started!&quot;
end script&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;##/usr/local/bin/node → /usr/bin/nodeに修正&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;## ユーザwww-dataは作成しておく &lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;init-checkconf /etc/init/yourprogram.conf&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;を実行してみる&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;failed to ask Upstart to check conf fileと出るが&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;/tmpフォルダにinit-checkconf-upstart-outputが出力されているので&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;何もエラーがなければOkのはず&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;下記コマンドで実行 &lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;code&gt;start yourprogram　&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;停止&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;stop yourprogram &lt;/code&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/8735875718501685383/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/8735875718501685383' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8735875718501685383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8735875718501685383'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2016/02/nodejs-on-ubuntu_12.html' title='node.js サービス化 on ubuntu'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-7970364601859988323</id><published>2016-02-12T11:55:00.000+09:00</published><updated>2016-02-12T11:55:26.575+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>いまさらながら Linq to SQL</title><content type='html'>必要だったのでLinq to SQL 触ってみましたが&lt;br /&gt;
いろいろ細かいところが面倒だったので&lt;br /&gt;
対応した内容をメモ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&amp;nbsp;Binary形式の比較ができない&lt;/h3&gt;
&lt;br /&gt;
下記のようなクラスを作成し&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;public static class BinaryComparer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int Compare(this Binary b1, Binary b2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
where内で使う&lt;br /&gt;
&lt;br /&gt;
hoge.Where(row =&amp;gt;BinaryComparer.Compare(binary, row.binary_column) == 0) ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
PropertyInfoを使ったカラム指定&lt;/h3&gt;
&lt;br /&gt;
&lt;br /&gt;
public static Expression&amp;lt;Func&amp;lt;TItem, bool&amp;gt;&amp;gt; PropertyEquals&amp;lt;TItem, TValue&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropertyInfo property, TValue value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var param = Expression.Parameter(typeof(TItem));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var body = Expression.Equal(Expression.Property(param, property),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression.Constant(value));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Expression.Lambda&amp;lt;Func&amp;lt;TItem, boo&amp;gt;&amp;gt;(body, param);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
次のように利用する&lt;br /&gt;
&lt;br /&gt;
hoge.Where(PropertyEquals&amp;lt;hogetype, byte&amp;gt;(propertyInfo, somebyte));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上記だとnullableに対応していないので&lt;br /&gt;
nullable対応版&lt;br /&gt;
&lt;br /&gt;
public static Expression&amp;lt;Func&amp;lt;TItem, bool&amp;gt;&amp;gt; NullablePropertyEquals&amp;lt;TItem, TValue&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropertyInfo property, TValue? value) where TValue : struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var param = Expression.Parameter(typeof(TItem));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var body = Expression.Equal(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression.Property(param, property),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression.Constant(value, typeof (TValue?)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Expression.Lambda&amp;lt;Func&amp;lt;TItem, bool&amp;gt;&amp;gt;(body, param);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
nullableでしか動かないので注意&lt;br /&gt;
両方に対応したメソッドも作れるような気はするけど&lt;br /&gt;
取りあえずここまで &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/7970364601859988323/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/7970364601859988323' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/7970364601859988323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/7970364601859988323'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2016/02/linq-to-sql.html' title='いまさらながら Linq to SQL'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-5289715553937393113</id><published>2015-10-27T00:30:00.000+09:00</published><updated>2015-10-27T00:30:39.827+09:00</updated><title type='text'>Orvibo S20</title><content type='html'>電源をWifi(LAN)上で操作できるデバイスです&lt;br /&gt;
外出することが多くなりそうなので導入&lt;br /&gt;
ただ、心配なのが操作するアプリがLAN外から操作する場合に&lt;br /&gt;
製造元のサーバーを経由するということ&lt;br /&gt;
中国のよくわからないメーカーなので心もとない&lt;br /&gt;
ということでハックされたスクリプトで操作することに&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
情報元はここです&lt;br /&gt;
&lt;a href=&quot;https://stikonas.eu/wordpress/2015/02/24/reverse-engineering-orvibo-s20-socket/&quot;&gt;https://stikonas.eu/wordpress/2015/02/24/reverse-engineering-orvibo-s20-socket/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
結論から言うと下記PHPファイルで操作できる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;ob_start();&lt;br /&gt;error_reporting(E_ALL | E_STRICT);&lt;br /&gt;&lt;br /&gt;$server = &#39;IPADDRESS&#39;;&lt;br /&gt;$port = 10000;&lt;br /&gt;$macAddress = &#39;AC:CF:23:56:6C:24&#39;;&lt;br /&gt;$twenties = &#39;202020202020&#39;;&lt;br /&gt;$ma = strtolower(implode(&#39;&#39;,explode(&#39;:&#39;,$macAddress)));&lt;br /&gt;$maReverse = strtolower(implode(&#39;&#39;,array_reverse(explode(&#39;:&#39;,$macAddress))));&lt;br /&gt;$subscribe = pack(&#39;H*&#39;,&#39;6864001e636c&#39; . $ma . $twenties . $maReverse . $twenties);&lt;br /&gt;$on = pack(&#39;H*&#39;,&#39;686400176463&#39; . $ma . $twenties . &#39;0000000001&#39;);&lt;br /&gt;$off = pack(&#39;H*&#39;,&#39;686400176463&#39; . $ma . $twenties . &#39;0000000000&#39;);&lt;br /&gt;&lt;br /&gt;//Create a UDP socket&lt;br /&gt;if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $errorcode = socket_last_error();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $errormsg = socket_strerror($errorcode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; die(&quot;Couldn&#39;t create socket: [$errorcode] $errormsg &amp;lt;br /&amp;gt;&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo &quot;Socket created &amp;lt;br /&amp;gt;&quot;;&lt;br /&gt;&lt;br /&gt;// Bind the source address&lt;br /&gt;if(!socket_bind($sock, &quot;0.0.0.0&quot; , $port)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $errorcode = socket_last_error();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $errormsg = socket_strerror($errorcode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; die(&quot;Error binding socket. Error code was &quot; . $errorcode . &quot; and error message was &quot; . $errormsg);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo &quot;Socket bound. Waiting for incoming data.&amp;lt;br /&amp;gt;&quot;;&lt;br /&gt;&lt;br /&gt;echo &quot;Sending subscribe packet ..&quot;;&lt;br /&gt;socket_sendto($sock, $subscribe, strlen($subscribe), 0, $server, $port);&lt;br /&gt;sleep(2);&lt;br /&gt;echo &quot;Sending ON packet ..&quot;;&lt;br /&gt;socket_sendto($sock, $on, strlen($on), 0, $server, $port);&lt;br /&gt;sleep(2);&lt;br /&gt;echo &quot;Sending OFF packet ..&quot;;&lt;br /&gt;//socket_sendto($sock, $off, strlen($off), 0, $server, $port);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ob_flush();&lt;br /&gt;//Do some communication, this loop can handle multiple clients&lt;br /&gt;while(1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Receive some data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $buf = ascii2hex($buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &quot;Data from &quot; . $remote_ip . &quot;: &quot; . $buf . &quot;&amp;lt;br /&amp;gt;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ob_flush();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ascii2hex($ascii) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $hexadecimal = &#39;&#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ($i = 0; $i &amp;lt; strlen($ascii); $i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $byte = strtoupper(dechex(ord($ascii{$i})));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $byte = str_repeat(&#39;0&#39;, 2 - strlen($byte)).$byte;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $hexadecimal.=$byte.&quot; &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $hexadecimal;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;socket_close($sock);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO Ctrl+Cしないと終了しない</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/5289715553937393113/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/5289715553937393113' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5289715553937393113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5289715553937393113'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2015/10/orvibo-s20.html' title='Orvibo S20'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-1867880754026319192</id><published>2015-10-26T17:08:00.001+09:00</published><updated>2015-10-26T17:08:46.525+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>iPhoneでのOpenSSHの安全な設定</title><content type='html'>いつもiPhoneにOpenSSH入れる時に見ていたサイトから&lt;br /&gt;
いつの間にか記事がなくなっていたのでメモしておく&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
●ssh でユーザーmobileにアクセスする&lt;/h3&gt;
&lt;br /&gt;
ssh mobile@ipaddress&lt;br /&gt;
&lt;br /&gt;
デフォルトのパスワードはalpine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
●rootのパスワード変更&lt;/h3&gt;
&lt;br /&gt;
su&lt;br /&gt;
passwd&lt;br /&gt;
新しいパスワード&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
●共通鍵の生成&lt;/h3&gt;
&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;ssh-keygen -t rsa&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;docs-internal-guid-727c82be-a323-859f-06f6-945623ee8d65&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;保存先は空白&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;任意のパスフレーズ&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;autorized_keyに保存する&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;docs-internal-guid-727c82be-a323-d3ba-a490-df6e90358f40&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;rm ~/.ssh/id_rsa.pub&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;chmod 700 ~/.ssh&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;chmod 600 ~/.ssh/authorized_keys&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span id=&quot;docs-internal-guid-727c82be-a323-3f6b-19a6-2082986130a4&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;docs-internal-guid-727c82be-a324-7b5f-5bd7-93a0577a8e8e&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18.666666666666664px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;●秘密キーの設置&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;作成したid_rsaをPCもしくはMacに持ってくる&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;WinSCPやFileZilla等利用&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;OpenSSHの場合はそのまま、puttyの場合はputty-genで置換する必要がある&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;b&gt;●SSHdの設定を変更する &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;該当行を次のように変更&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;docs-internal-guid-727c82be-a326-ec5f-978e-eb2786c98218&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;sudo vim /etc/ssh/sshd_config &lt;b&gt;#vimはcydiaからインストールしておく&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;# HostKey for protocol version 1 &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;#HostKey /etc/ssh/ssh_host_key &lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;#version1は使わない&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;PermitRootLogin no #&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;rootユーザではログインさせない&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;#RSAAuthentication yes &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;PubkeyAuthentication yes&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; AuthorizedKeysFile .ssh/authorized_keys &lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;#公開鍵方式を使う&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;# To disable tunneled clear text passwords, change to no here!&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt; PasswordAuthentication no &lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;#パスワード認証は行わない&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ちなみにviのコマンド(i:インサートモード,esc:ノーマルモード,x:一文字削除,dd:行削除,:wq:保存,:q!:保存せずに閉じる)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
● サービスの再起動&lt;/h3&gt;
&lt;br /&gt;
su&amp;nbsp;&lt;code&gt;
&lt;/code&gt;&lt;br /&gt;




&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;launchctl unload /Library/LaunchDaemons/com.openssh.sshd.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;launchctl load /Library/LaunchDaemons/com.openssh.sshd.plist
&lt;/code&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/1867880754026319192/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/1867880754026319192' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1867880754026319192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1867880754026319192'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2015/10/iphoneopenssh.html' title='iPhoneでのOpenSSHの安全な設定'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-6869922831933955229</id><published>2015-02-21T20:20:00.000+09:00</published><updated>2015-02-21T20:20:33.972+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Wndows"/><title type='text'>Windows 8 スリープからの自動復帰を切る</title><content type='html'>自宅のメインマシンはWindows 8機で基本的にスリープで運用しています。&lt;br /&gt;
スリープまたは休止状態から勝手に復帰するようになって&lt;br /&gt;
睡眠を妨げるようになったのでイラついた勢いで設定を見直しました&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
原因として考えられるのは、&lt;br /&gt;
WakeOnLan&lt;br /&gt;
マウス等デバイスの （誤）操作&lt;br /&gt;
タスクスケジュールの実行&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4&gt;
&lt;b&gt;１．原因究明&lt;/b&gt;&lt;/h4&gt;
&lt;br /&gt;
直近の起動理由を知るには次のコマンドを実行します&lt;br /&gt;
&lt;br /&gt;
&amp;gt;powercfg lastwake&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マウスでの実行であれば次のような出力&lt;br /&gt;
切ってみましたが効果なし &lt;br /&gt;
&lt;br /&gt;
Wake History [0]&lt;br /&gt;&amp;nbsp; Wake Source Count - 1&lt;br /&gt;&amp;nbsp; Wake Source [0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: Device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Instance Path: ACPI\PNP0303\4&amp;amp;6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Friendly Name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description: 標準 PS/2 キーボー&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer: (標準キーボード)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
復帰予定のスケジュールを探す&lt;br /&gt;
&lt;br /&gt;
&amp;gt;powercfg waketimers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
次のような出力があります。&lt;br /&gt;
原因はmcupdate_scheduledというスケジュールのようです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Timer set by [SERVICE] \Device\HarddiskVolume1\Windows\System32\svchost.exe (Sys&lt;br /&gt;temEventsBroker) expires at 3:31:08 on 2015/02/18.&lt;br /&gt;&amp;nbsp; Reason: Windows は、スリープ状態の解除を要求したスケジュールされたタスク &#39;NT T&lt;br /&gt;ASK\Microsoft\Windows\Media Center\mcupdate_scheduled&#39; を実行します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;b&gt;２．スリープ解除をきる&lt;/b&gt; &lt;/h4&gt;
&lt;br /&gt;
WakeOnLanの場合、&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;デバイスマネージャから対象のネットワークアダプタのプロパティを開く&lt;br /&gt;
電源の管理タブから &lt;br /&gt;
” Magic Packetでのみ、コンピュータのスタンバイ状態を解除できるようにする”&lt;br /&gt;
&amp;nbsp;のチェックを外すか選択できない状態にする&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マウス、キーボードの場合、&lt;br /&gt;
&lt;br /&gt;
デバイスマネージャから対象のデバイスのプロパティを開く&lt;br /&gt;
電源の管理タブの ”このデバイスで、コンピュータのスタンバイ状態を解除できるようにする”&lt;br /&gt;
のチェックを外す&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
スケジュールの場合、&lt;br /&gt;
&lt;br /&gt;
”管理ツール＞タスクスケジューラ”から対象のスケジュール（mcupdate_scheduled）を捜し&lt;br /&gt;
条件タブの”タスクを実行するためにスリープを解除する”のチェックを外す&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/6869922831933955229/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/6869922831933955229' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/6869922831933955229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/6869922831933955229'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2015/02/windows-8.html' title='Windows 8 スリープからの自動復帰を切る'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-5111207463371335735</id><published>2014-05-25T01:47:00.000+09:00</published><updated>2014-05-25T01:48:16.692+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Spring でのAsync処理 Queue </title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
Queuingといえばメール送信や重たい処理を非同期で実行させる場合に&lt;br /&gt;
使わないと行けないというケースがあります。Spring には TaskExecutor という&lt;br /&gt;
非同期で処理を実行するQueueを取り扱うクラスがあります&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これが何かと便利なので覚書 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
コマンド実行をQueueにするサンプル&lt;br /&gt;
asyncExecutorをautowiredして使います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AsyncExecutor.java :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;public class AsyncExecutor {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String command;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setCommand(String command) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.command = command;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private TaskExecutor taskExecutor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void execute(File file) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; taskExecutor.execute(new AsyncTask(file));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private class AsyncTask implements Runnable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; File file;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private AsyncTask(File file) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.file = file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Runtime rt = Runtime.getRuntime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Process pr = rt.exec(command + &quot; &quot; + file.toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pr.waitFor();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InterruptedException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bean定義&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;taskExecutor&quot; class=&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot; p:corePoolSize=&quot;5&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:maxPoolSize=&quot;10&quot; p:queueCapacity=&quot;100&quot; p:waitForTasksToCompleteOnShutdown=&quot;true&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;asyncExecutor&quot; class=&quot;sample.AsyncExecutor&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;command&quot; value=”/opt/jetty/bin/batch.sh&quot;&amp;gt;&amp;lt;/property&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
MailをTaskExecutorでおくる例は下記参照&lt;br /&gt;
&lt;a href=&quot;http://www.i-develop.be/blog/2010/10/01/execute-tasks-asynchronously-with-spring-3-0/&quot;&gt;http://www.i-develop.be/blog/2010/10/01/execute-tasks-asynchronously-with-spring-3-0/ &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
非同期処理は自分で実装するのは気が引けるのでSpringでの実装は助かります </content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/5111207463371335735/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/5111207463371335735' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5111207463371335735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5111207463371335735'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/05/spring-async-queue.html' title='Spring でのAsync処理 Queue '/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-5415331338693548191</id><published>2014-05-15T13:56:00.000+09:00</published><updated>2014-05-15T14:21:32.314+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="batch"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Spring Batch Adminにスケジュール機能をつけてみる</title><content type='html'>&lt;a href=&quot;http://chkishe.blogspot.com/2014/05/spring-batch-adminmysql.html&quot;&gt;前回&lt;/a&gt;、Spring Batch Adminについて触れましたが、&lt;br /&gt;
Springには 3.0からTaskSchedulerという機能がついているのでそれを使って&lt;br /&gt;
Spring Batch Adminにスケジュールをホストさせてみます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
あくまで、Spring Batch Adminの使っているtaskLauncherを&lt;br /&gt;
TaskSchedulerから使うというものでAdminからスケジュールを編集できるとかではありません。&lt;br /&gt;
あしからず。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RunScheduler.java :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;@Component&lt;br /&gt;public class RunScheduler {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private JobLauncher jobLauncher;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ListableJobLocator jobLocator;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String jobName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setJobName(String jobName) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.jobName = jobName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String dateParam = new Date().toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; JobParameters param = new JobParametersBuilder().addString(&quot;date&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dateParam).toJobParameters();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(dateParam);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Job job = jobLocator.getJob(jobName);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; JobExecution execution = jobLauncher.run(job, param);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;/span&gt;&lt;span style=&quot;color: #444444;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;java&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt; e.printStackTrace();&lt;/span&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bean定義に次のようにスケジュールを定義します。&lt;br /&gt;
下の例では、テンプレートにあるsimpleJobを5分毎に実行します。 &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp; &amp;lt;bean id=&quot;runScheduler&quot; class=&quot;my.package.RunScheduler&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;jobName&quot; value=&quot;simpleJob&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;!-- Run every 5 minutes&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;task:scheduled-tasks&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task:scheduled ref=&quot;runScheduler&quot; method=&quot;run&quot; cron=&quot;0 */5 * * * *&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/task:scheduled-tasks&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cronの記述方法については下記&lt;br /&gt;
&lt;a href=&quot;http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06&quot;&gt;http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
記事を書いていて気づいた、&lt;br /&gt;
このscheduler自体をJob化すればadminからスケジュールの開始、停止もできる </content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/5415331338693548191/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/5415331338693548191' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5415331338693548191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5415331338693548191'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/05/spring-batch-admin.html' title='Spring Batch Adminにスケジュール機能をつけてみる'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-2698093331156248670</id><published>2014-05-15T12:58:00.000+09:00</published><updated>2014-05-15T13:58:30.032+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="batch"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Spring Batch AdminのMySQL設定</title><content type='html'>バッチ実行にSpring Batchを利用しようかと検討しています。&lt;br /&gt;
&lt;br /&gt;
jBatchがJavaEEに組み込まれたこともあり、&lt;br /&gt;
それに準拠した形でバッチを作ったほうがなにかと恩恵があるのかなと思ったというだけですが。&lt;br /&gt;
&lt;br /&gt;
で、Spring BatchにはSpring Batch AdminというWebUIがあるので&lt;br /&gt;
使ってみます。あくまで、実行、停止、実行履歴が見れる程度のものです。&lt;br /&gt;
標準のdatabaseがhsqldbとなっているのでMySQLに変更します。&lt;br /&gt;
&lt;br /&gt;
Adminのテンプレートでは&lt;br /&gt;
META-INF/batch-hsql.properties&lt;br /&gt;
というファイルがあるので次のファイルに変更します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
META-INF/batch-mysql.properties:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;batch.jdbc.driver=com.mysql.jdbc.Driver&lt;br /&gt;batch.jdbc.url=jdbc:mysql://localhost/test&lt;br /&gt;batch.jdbc.user=user&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;batch.jdbc.password=&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;batch.jdbc.testWhileIdle=true&lt;br /&gt;batch.jdbc.validationQuery=SELECT 1&lt;br /&gt;batch.jdbc.maxActive=70&lt;br /&gt;batch.jdbc.initialSize=20&lt;br /&gt;batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql&lt;br /&gt;batch.drop.script=classpath*:/org/springframework/batch/core/schema-drop-mysql.sql&lt;br /&gt;batch.business.schema.script=classpath:/business-schema-mysql.sql&lt;br /&gt;batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer&lt;br /&gt;&lt;br /&gt;# Non-platform dependent settings that you might like to change&lt;br /&gt;batch.data.source.init=false&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
batch.data.source.init=falseはdatabase初期化するかという設定です。&lt;br /&gt;
一番最初に起動するときのみtrueにする必要があります。&lt;br /&gt;
&lt;br /&gt;
このままだと、遅いので dataSourceをoverrideします。&lt;br /&gt;
次のファイルを作成します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
META-INF/spring/batch/override/war-content.xml :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:p=&quot;http://www.springframework.org/schema/p&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation=&quot;http://www.springframework.org/schema/aop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/aop/spring-aop.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/batch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/batch/spring-batch-2.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/beans&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/beans/spring-beans.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/tx&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/tx/spring-tx.xsd&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”driverClassName” value=”${batch.jdbc.driver}” /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”url” value=”${batch.jdbc.url}” /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”username” value=”${batch.jdbc.user}” /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”password” value=”${batch.jdbc.password}” /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”initialSize” value=”${batch.jdbc.initialSize}”/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=”maxActive” value=”${batch.jdbc.maxActive}”/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
実行時に引数を渡す必要があります。&lt;br /&gt;
&amp;nbsp;-DENVIRONMENT=mysql&lt;br /&gt;
&lt;br /&gt;
なのでmaven でデバッグするときは 次のようになる&lt;br /&gt;
jetty:run&amp;nbsp; -Dmaven.surefire.debug test -DENVIRONMENT=mysql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
せっかくなのでスケジュールに機能もつけてみました→&lt;a href=&quot;http://chkishe.blogspot.com/2014/05/spring-batch-admin.html&quot;&gt;次&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/2698093331156248670/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/2698093331156248670' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2698093331156248670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2698093331156248670'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/05/spring-batch-adminmysql.html' title='Spring Batch AdminのMySQL設定'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-6768406841285798184</id><published>2014-05-13T19:45:00.001+09:00</published><updated>2014-05-13T23:46:42.523+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jetty"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Jetty 9.1.* の設定について</title><content type='html'>jetty 9.1.*系以降jettyの一部がモジュール化され&lt;br /&gt;
設定項目体系が変わっています&lt;br /&gt;
&lt;br /&gt;
設定方法についてをすこしまとめておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
１．httpsを有効化 &lt;br /&gt;
&lt;br /&gt;
ダウンロードしたアーカイブのdemo-base以下にあるstart.d/ssl.ini、https.iniが参考になります&lt;br /&gt;
demo-baseのstart.d/ssl.ini、https.iniを start.dにコピペして&lt;br /&gt;
環境に合わせて修正する&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. jetty-envを有効化&lt;br /&gt;
&lt;br /&gt;
そのままでOKただし、pom.xmlにjetty関連のdependancyがある場合&lt;br /&gt;
loaderエラーになる可能性があるのでjetty pluginでのみ必要な物は&lt;br /&gt;
jetty plugin 以下のdependancyに移す&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3.　jspを有効化&lt;br /&gt;
&lt;br /&gt;
start.iniの--module=jspのコメントを外す&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. servletを有効化&lt;br /&gt;
&lt;br /&gt;
defaultでservletsモジュールは読み込まれないので&lt;br /&gt;
jetty-servlets を使う場合は、&lt;br /&gt;
start.iniに--module=servletsを追加&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
5.　リクエストログの有効化 &lt;br /&gt;
&lt;br /&gt;
start.iniに--module=requestlogを追加&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
等々&lt;br /&gt;
&lt;br /&gt;
9.1.4はログ出力のリンク回りがバグっているのかjetty.shが動かない場合があるので注意&lt;br /&gt;
多分9.1.5で修正ずか？ &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/6768406841285798184/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/6768406841285798184' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/6768406841285798184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/6768406841285798184'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/05/jetty-91.html' title='Jetty 9.1.* の設定について'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-2164259953090029031</id><published>2014-04-17T15:16:00.000+09:00</published><updated>2014-04-17T15:40:45.346+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cassandra"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="json"/><title type='text'>UUID &lt;-&gt; Base64 変換する Jackson用wrapperクラス</title><content type='html'>データベースでUUIDを何かと使うのですが、&lt;br /&gt;
JSONで出力すると&#39;afb055a0-c18f-11e3-8b27-b1398a321474&#39;みないな&lt;br /&gt;
文字列になってちょっと長いですし、&lt;br /&gt;
UUIDだというのがバレバレでそこはかとなく心配になります。&lt;br /&gt;
&lt;br /&gt;
なので、JSONマッパーに渡すUUIDをwrapしてBase64としてマップするクラスを作ったので共有&lt;br /&gt;
表題にある通りJackson向けです&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
@JsonValueアノテーションをつけることで&lt;br /&gt;
このクラスをシリアライズする際にtoString()が呼ばれBase64化された値を返します&lt;br /&gt;
&lt;br /&gt;
デシリアライズ 時には、&lt;br /&gt;
UUIDBase64(String uuidBase64)で初期化されUUIDBase64クラスとしてマップされます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
UUIDBase64.java :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.util.UUID;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.codec.binary.Base64;&lt;br /&gt;import org.codehaus.jackson.annotate.JsonValue;&lt;br /&gt;import org.codehaus.jackson.annotate.JsonIgnore;&lt;br /&gt;&lt;br /&gt;public class UUIDBase64 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @JsonIgnore&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final UUID uuid;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UUIDBase64(UUID uuid) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.uuid = uuid;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UUIDBase64(String uuidBase64) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] bytes = Base64.decodeBase64(uuidBase64);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ByteBuffer bb = ByteBuffer.wrap(bytes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.uuid = new UUID(bb.getLong(), bb.getLong());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @JsonValue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String toString(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (uuid == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ByteBuffer bb = ByteBuffer.wrap(new byte[16]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bb.putLong(uuid.getMostSignificantBits());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bb.putLong(uuid.getLeastSignificantBits());&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return Base64.encodeBase64URLSafeString(bb.array());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UUID getUUID() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return this.uuid;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static UUIDBase64 fromUUID(UUID uuid) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return new UUIDBase64(uuid);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static UUIDBase64 fromBase64(String str) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return new UUIDBase64(str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;次のように変換されます &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;class User {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #444444;&quot;&gt;UUIDBase64 id;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;} &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;-&gt; { &quot;id&quot; : &quot;base64の文字列&quot; }&lt;!-----&gt;&lt;!-----&gt;&lt;/-&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/2164259953090029031/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/2164259953090029031' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2164259953090029031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2164259953090029031'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/04/uuid-base64-jacksonwrapper.html' title='UUID &lt;-&gt; Base64 変換する Jackson用wrapperクラス'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-7742348584270745688</id><published>2014-04-11T18:54:00.000+09:00</published><updated>2014-04-11T18:57:05.416+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>HttpServletRequestのthread内共有 Spring編</title><content type='html'>HttpServletRequestを参照しようとした時に&lt;br /&gt;
引数で渡さずに、static fieldのthread localに保存して&lt;br /&gt;
スレッド内から参照できるようにする方法を昔紹介していましたが、&lt;br /&gt;
Spring使用時には標準の機能としてすでにあります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
次のようにRequestContextHolderからHttpServletRequestを取得します。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RequestAttributes attrs = RequestContextHolder.getRequestAttributes();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletRequest request =&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;(HttpServletRequest)attrs.resolveReference(RequestAttributes.REFERENCE_REQUEST);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
web.xmlにlistenerを登録する必要があります。&lt;br /&gt;
&lt;br /&gt;
web.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;listener-class&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;　　　　　org.springframework.web.context.request.RequestContextListener&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;　　　&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listener&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spring 2.5以上が必要です&lt;br /&gt;
使い道としては、エラー出力にリクエスト情報を出すとか&lt;br /&gt;
エラーハンドルのためにいちいち、&lt;br /&gt;
リクエストを引数には渡せないのでthreadに保持しているものを参照します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ThreadLocalに自分で保存する&lt;a href=&quot;http://chkishe.blogspot.com/2013/01/httpservletrequestthread.html&quot;&gt;記事&lt;/a&gt;よりは&lt;br /&gt;
既存のものを使うべきでしょう&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/7742348584270745688/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/7742348584270745688' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/7742348584270745688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/7742348584270745688'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/04/httpservletrequestthread-spring.html' title='HttpServletRequestのthread内共有 Spring編'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-2349628862830586666</id><published>2014-03-28T03:00:00.000+09:00</published><updated>2014-03-28T03:00:01.187+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="server"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-security"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Spring Security  Auto Login</title><content type='html'>Spring Security を利用してログインセッション管理を&lt;br /&gt;
している方も多いと思います。&lt;br /&gt;
&lt;br /&gt;
Spring Securityデフォルトのままで使うと&lt;br /&gt;
アカウント作成後に一度ユーザにログインしてもらわないといけないとか&lt;br /&gt;
イケてないので、そういう時に自動でログインセッションを作成する方法です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
アカウント作成後に次のようなメソッドを呼びます&lt;br /&gt;
AuthenticationProvideのBeanを指定します（自作クラスでも動きます） &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthenticationProvider authenticationProvider; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HttpServletRequestを予め取得しておいて、username, passwordから&lt;br /&gt;
tokenを発行し、authenticationProviderに登録します &lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void doAutoLogin(String username, String password,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletRequest request) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Must be called from request filtered by Spring Security,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // otherwise SecurityContextHolder is not updated&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; username, password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; token.setDetails(new WebAuthenticationDetails(request));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Authentication authentication = this.authenticationProvider&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .authenticate(token);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // logger.debug(&quot;Logging in with [{}]&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // authentication.getPrincipal());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecurityContextHolder.getContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .setAuthentication(authentication);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecurityContextHolder.getContext().setAuthentication(null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.error(&quot;Failure in autoLogin&quot;, e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
AutowiredしなくてもSecurityContextHolderからいけるかも&lt;br /&gt;
しれないですね。そのうちやってみよ。&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/2349628862830586666/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/2349628862830586666' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2349628862830586666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2349628862830586666'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/03/spring-security-auto-login.html' title='Spring Security  Auto Login'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-8931727685004850634</id><published>2014-03-25T22:41:00.000+09:00</published><updated>2014-03-25T22:51:01.468+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jetty"/><category scheme="http://www.blogger.com/atom/ns#" term="server"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Session Counter Listener</title><content type='html'>セッション数をカウントするServlet コンテナ用のListenerを自作したので共有&lt;br /&gt;
サービスのセッション数 を監視してーという人はどうぞ&lt;br /&gt;
thread safeなはず。　Java1.5以上必要です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SessionCounterListener.java:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;public class SessionCounterListener implements HttpSessionListener {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static AtomicInteger totalActiveSessions = new AtomicInteger();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int getTotalActiveSession() {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return totalActiveSessions.get();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void sessionCreated(HttpSessionEvent arg0) {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; totalActiveSessions.incrementAndGet();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void sessionDestroyed(HttpSessionEvent arg0) {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; totalActiveSessions.decrementAndGet();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
web.xmlにはListenerとして登録&lt;br /&gt;
&lt;br /&gt;
web.xml :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;listener-class&amp;gt;my.package.SessionCounterListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;listener&gt;&lt;listener-class&gt;&lt;/listener-class&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/listener&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/8931727685004850634/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/8931727685004850634' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8931727685004850634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8931727685004850634'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/03/session-counter-servlet.html' title='Session Counter Listener'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-8043801088096472442</id><published>2014-03-25T00:44:00.002+09:00</published><updated>2014-03-25T02:43:54.389+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cassandra"/><title type='text'>Cassandra3.x CQLでBlobを扱う</title><content type='html'>CassandraでのBlobの扱いに半日ぐらい使ったので覚書&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cassandra3.0、datastax driver 2.0&lt;br /&gt;
でCQLを利用してBlobを扱う場合、&lt;br /&gt;
bindにByteBufferをかまさないといけません。&lt;br /&gt;
それと、row.getBytes()で取得したByteBufferをそのままarray()しても&lt;br /&gt;
ゴミの入ったbyte[]になってしまいます。&lt;br /&gt;
&lt;br /&gt;
なので、次のようにする&lt;br /&gt;
bind時&lt;br /&gt;
byte[] byteArray; &lt;br /&gt;
prepare(cql).bind(ByteBuffer.wrap(byteArray));&lt;br /&gt;
&lt;br /&gt;
取得時&lt;br /&gt;
import com.datastax.driver.core.utils.Bytes; &lt;br /&gt;
byte[] byteArray = Bytes.getArray(row.getBytes(&quot;bytes&quot;));</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/8043801088096472442/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/8043801088096472442' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8043801088096472442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8043801088096472442'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/03/cassandra3x-cqlblob.html' title='Cassandra3.x CQLでBlobを扱う'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-2450559778045369399</id><published>2014-02-22T11:52:00.000+09:00</published><updated>2014-02-22T12:00:25.444+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jax-rs"/><category scheme="http://www.blogger.com/atom/ns#" term="jersey"/><category scheme="http://www.blogger.com/atom/ns#" term="jetty"/><category scheme="http://www.blogger.com/atom/ns#" term="json"/><category scheme="http://www.blogger.com/atom/ns#" term="ｊ2ee"/><title type='text'>Jersey2.6(JAX-RS2.2) with Jetty9 セットアップ</title><content type='html'>&lt;br /&gt;
JAX-RS2.*を使いたいと思って、Jersey2.6をJetty9に組み込もうとしたのですが、&lt;br /&gt;
四苦八苦したのでメモ&lt;br /&gt;
&lt;br /&gt;
いろいろdependancyに入れすぎてたのが問題だったようです。&lt;br /&gt;
jsr311-apiをdependancyから取り除くとうまくいきました。&lt;br /&gt;
&lt;br /&gt;
JAX-RS2.*では、Pojomappingを指定するのではなく&lt;br /&gt;
JAX-RS JSON Providerに対応するライブラリを追加することでJSONに対応します。&lt;br /&gt;
下の例では、jackson-jaxrs-json-providerを追加しています。&lt;br /&gt;
&lt;br /&gt;
JavaEE3以上は、jersey-container-servlet-coreを使うよう言われますが&lt;br /&gt;
自分は以前のweb.xmlでの指定方法が好みなので&lt;br /&gt;
jersey-container-servletを使っています。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pom.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;略&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;java.version&amp;gt;1.7&amp;lt;/java.version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jettyVersion&amp;gt;9.1.2.v20140210&amp;lt;/jettyVersion&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jerseyVersion&amp;gt;2.6&amp;lt;/jerseyVersion&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jetty-server&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${jettyVersion}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jetty-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${jettyVersion}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.glassfish.jersey&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jersey-bom&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${jerseyVersion}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.glassfish.jersey.containers&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jersey-container-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${jerseyVersion}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;com.fasterxml.jackson.jaxrs&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jackson-jaxrs-json-provider&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.2.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;build&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;plugins&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source&amp;gt;${java.version}&amp;lt;/source&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;target&amp;gt;${java.version}&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jetty-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${jettyVersion}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webAppSourceDirectory&amp;gt;${basedir}/webapp&amp;lt;/webAppSourceDirectory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webXmlFile&amp;gt;${basedir}/webapp/WEB-INF/web.xml&amp;lt;/webXmlFile&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jettyEnvXml&amp;gt;${basedir}/webapp/WEB-INF/jetty-env.xml&amp;lt;/jettyEnvXml&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;contextPath&amp;gt;/&amp;lt;/contextPath&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/build&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WEB-INF/web.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;jersey&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-class&amp;gt;org.glassfish.jersey.servlet.ServletContainer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;jersey.config.server.provider.packages&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;パッケージ&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;load-on-startup&amp;gt;10&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;jersey&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url-pattern&amp;gt;/api/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WEB-INF/jetty-env.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE Configure PUBLIC &quot;-//Mort Bay Consulting//DTD Configure//EN&quot; &quot;http://www.eclipse.org/jetty/configure_9_0.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;Configure id=&#39;wac&#39; class=&quot;org.eclipse.jetty.webapp.WebAppContext&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Call name=&quot;setAttribute&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;Arg&amp;gt;org.eclipse.jetty.webapp.configuration&amp;lt;/Arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;Arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Array type=&quot;java.lang.String&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.WebInfConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.WebXmlConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.MetaInfConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.FragmentConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.plus.webapp.EnvConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.plus.webapp.PlusConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.JettyWebXmlConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Item&amp;gt;org.eclipse.jetty.webapp.TagLibConfiguration&amp;lt;/Item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Array&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/Arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Call&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Set name=&quot;war&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;jetty.home&quot; default=&quot;.&quot;/&amp;gt;/&amp;lt;/Set&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/Configure&amp;gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/2450559778045369399/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/2450559778045369399' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2450559778045369399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/2450559778045369399'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/02/jersey26jax-rs22-with-jetty9.html' title='Jersey2.6(JAX-RS2.2) with Jetty9 セットアップ'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-5198373709892174094</id><published>2014-02-12T23:05:00.001+09:00</published><updated>2014-02-13T12:48:14.316+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="maven"/><title type='text'>Maven での デバッグ</title><content type='html'>Mavenでのデバッグ方法が検索しても見当たらなかったので&lt;br /&gt;
書き留めておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eclipseを利用している、m2eclipseをインストールしている前提です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1．プロジェクトを右クリック＞Debug As＞Maven build...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2．Goalsに goal -Dmaven.surefire.debug test を設定&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
例） java ファイルを実行する場合 &lt;br /&gt;
exec:java -Dmaven.surefire.debug test [-Dexec.mainClass=&quot;クラス名&quot;] [-Dexec.args=&quot;引数&quot;]&lt;br /&gt;
&lt;br /&gt;
例） jettyを実行する場合&lt;br /&gt;
jetty:run -Dmaven.surefire.debug test&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3．ParameterにName:forkCount Value:0を追加&lt;br /&gt;
これがないと、デバッグ用のポートをリスニングするのを回避&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maven v2.0.8 以降はmaven.surefire.debugを利用すれば&lt;br /&gt;
ポートを指定したリモートデバッグの必要はありません。&lt;br /&gt;
（実はずっとリモートデバッグしていた…） </content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/5198373709892174094/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/5198373709892174094' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5198373709892174094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5198373709892174094'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/02/maven.html' title='Maven での デバッグ'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-3037036518524348112</id><published>2014-01-31T23:57:00.000+09:00</published><updated>2014-02-01T20:00:38.090+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java8"/><title type='text'>Java 8を使ってみる（使用編・Stream編1）</title><content type='html'>Java 8には、Streamというクラスが追加されています。&lt;br /&gt;
面倒くさい説明を少々しますので飛ばす人はこちらへ→&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8stream1.html#skip&quot;&gt;スキップ&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
StreamはC#でいうIEnumbleに準ずるもので、中間処理を実行しても実際の絞り込みは&lt;br /&gt;
実行されず、終端処理を呼び出された際に実行されるというものです。&lt;br /&gt;
&lt;br /&gt;
下の例のような記述ができます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;int sumOfRedWeights  = blocks.stream().filter(b -&amp;gt; b.getColor() == RED)
                                           .mapToInt(b -&amp;gt; b.getWeight())
                                           .sum();&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
ここでは、&lt;code&gt;blocksをgetColor()==REDで絞り込み(filter)、&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;getWeight()を抽出して(mapToInt)合計しています(sum)。&lt;/code&gt;&lt;br /&gt;
中間処理のfilter、mapToIntでは絞込は行われず、&lt;br /&gt;
終端処理のsumが呼ばれる際に遅延的に実行されます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
言い換えると、繰り返し処理を関数的に記述できるようになるというところでしょうか。&lt;br /&gt;
また、終端処理まで状態を保持しないため並列化にも適しています。 &lt;br /&gt;
stream()のかわりにparallelStream()を使うことによって、処理を並列的に実行します。&lt;br /&gt;
サーバではもともとマルチスレッドなので他のコアも処理してたりして、&lt;br /&gt;
あまり恩恵ないかもしれないですが、可読性と並列化が捗りますね＼(^o^)／。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;skip&quot;&gt;&lt;/a&gt;ということで、&lt;br /&gt;
Streamと&lt;span class=&quot;st&quot;&gt;SQLのクエリと比較してみましょう。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
単純なSELECTでTestMember.idのみを抽出する&lt;/h4&gt;
//SQL&lt;br /&gt;
SELECT TestMember.id &lt;br /&gt;
&lt;br /&gt;
//Listに変換&lt;br /&gt;
List&lt;integer&gt; list = members.stream().map(TestMember::getId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .collect(Collectors.toList());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Setに変換&lt;br /&gt;Set&lt;integer&gt; set = members.stream().map(TestMember::getId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .collect(Collectors.toCollection(TreeSet::new));&lt;/integer&gt;&lt;/integer&gt;&lt;br /&gt;
&lt;br /&gt;
TestMember::getIdは関数渡しでメソッドを渡しています。&lt;br /&gt;
map中でgetIdを呼び出した値を利用しています。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4&gt;
Member.weightの合計を求める&lt;/h4&gt;
//SQL&lt;br /&gt;
SELECT sum(TestMember.weight)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
total = members.stream()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .mapToInt(x -&amp;gt; x.getWeight())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .sum();&lt;br /&gt;
&lt;br /&gt;
合計を求める方法には、Collectorを使う方法もあります&lt;br /&gt;
&lt;br /&gt;
int total = members.stream()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .collect(Collectors.summingInt(x -&amp;gt; x.getWeight())); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
平均を求める&lt;/h4&gt;
//SQL&lt;br /&gt;
SELECT avg(TestMember.weight) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double average = members.stream()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .mapToInt(x -&amp;gt; x.getWeight())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .average()&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .orElse(0d);&lt;br /&gt;
&lt;br /&gt;
orElse()というメソッドが出てきました。&lt;br /&gt;
average()は、OptionalDoubleというNull許容なオブジェクトを返します。 &lt;br /&gt;
OptionalDoubleのNullの場合のデフォルト値を指定してdoubleを返すのがorElse（）です。&lt;br /&gt;
OptionalDoubleは、C#でいうところのdouble?ですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
切り出し&lt;/h4&gt;
何番目の要素を指定して取り出すということもできます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//SQL &lt;br /&gt;
SELECT TestMember.weight &lt;code&gt; LIMIT 1&lt;/code&gt; &lt;br /&gt;
&lt;br /&gt;
members.stream()&lt;br /&gt;
.mapToInt(x -&amp;gt; x.getWeight())&lt;br /&gt;
.findFirst()&lt;br /&gt;
.orElse(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//SQL&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;SELECT * OFFSET 1 LIMIT 2&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;members.stream()
.skip(1)
.limit(2).toArray();&lt;code&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
グループ・パーティション&lt;/h4&gt;
Stream には group byや partitioned byに当たるメソッドもあります&lt;br /&gt;
&lt;br /&gt;
//グループ分け&lt;br /&gt;
Map&lt;integer br=&quot;&quot; bypart=&quot;&quot; estmember=&quot;&quot; gt=&quot;&quot; list=&quot;&quot; lt=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = members.stream()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .collect(Collectors.groupingBy(x -&amp;gt; x.getPart()));&lt;/integer&gt;&lt;br /&gt;
&lt;br /&gt;
同じpartのTestMemberをpart毎のマップにする。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本当は、groupingByには関数渡しで、TestMember::getPartとできるはずが、&lt;br /&gt;
エラーになっちゃいますね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//パーティション&lt;br /&gt;
Map&lt;boolean estmember=&quot;&quot; gt=&quot;&quot; idparted=&quot;&amp;lt;br&quot; list=&quot;&quot; lt=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; members.stream()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .collect(Collectors.partitioningBy(s -&amp;gt; s.getId() &amp;gt;= 5));&lt;/boolean&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
その他&lt;/h4&gt;
条件に一致したものが一件でもある &lt;br /&gt;
&lt;br /&gt;
boolean match = members.stream().anyMatch(b -&amp;gt; b.getId() &amp;gt; 5);&lt;br /&gt;
&lt;br /&gt;
countを使うより軽いはず？&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
weightでソートする&lt;br /&gt;
ソートをstream、ラムダ式で実装してみた&lt;br /&gt;
&lt;br /&gt;
members.stream().sorted((r,l) -&amp;gt; { &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return Integer.compare(r.weight, l.weight); &lt;br /&gt;
}).collect(Collectors.toList());&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
ソートするだけならもっと効率のいい方法があるかな&lt;br /&gt;
parallelStreamが使えるから早いのか？むむ？&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回使ったプロジェクト-&amp;gt;&lt;a href=&quot;https://drive.google.com/file/d/0B6PqJV1iK6Y5dWx4M1hadG8yME0/edit?usp=sharing&quot;&gt;StreamSample.zip&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;次回もStream編がつづく&lt;/span&gt;&lt;/h4&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/3037036518524348112/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/3037036518524348112' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/3037036518524348112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/3037036518524348112'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/java-8stream1.html' title='Java 8を使ってみる（使用編・Stream編1）'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-3656892841552932939</id><published>2014-01-28T00:58:00.000+09:00</published><updated>2014-02-28T17:19:18.641+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>OpenCV for iOS 1/27, 2014 ビルド</title><content type='html'>&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;1/27, 2014現在のgitリポジトリからダウンロードした&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;OpenCV はiOS向けにはそのままだとビルドできません。&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;そのための修正をメモ&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4 class=&quot;commit-group-heading&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;b&gt;ソース修正 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;commit-group-heading&quot;&gt;
&lt;/div&gt;
&lt;a href=&quot;https://stackoverflow.com/questions/16983696/how-to-build-opencv-2-4-9-for-ios/17025423#17025423&quot;&gt;https://stackoverflow.com/questions/16983696/how-to-build-opencv-2-4-9-for-ios/17025423#17025423&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
対象ファイルの指定行を追加修正&lt;br /&gt;
&lt;br /&gt;
3rdParty/libjpeg/CMakeLists.txt:12, jmemansi.c をビルドから除く（これはすでに適応済み？）&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;if(ANDROID OR IOS)
  ocv_list_filterout(lib_srcs jmemansi.c)
else()
  ocv_list_filterout(lib_srcs jmemnobs.c)
endif()&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;modules/world/CMakeLists.txt:105　追加&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;ocv_list_filterout(objlist jmemansi) # &amp;lt;&amp;lt;= dirty fix&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;
&lt;code&gt;arm64対応 &lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;a href=&quot;https://stackoverflow.com/questions/18976893/how-to-compile-opencv-for-ios7-arm64#20143790&quot;&gt;https://stackoverflow.com/questions/18976893/how-to-compile-opencv-for-ios7-arm64 &lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;arm64ビルドは諦めて、&lt;/code&gt;&lt;code&gt;armv7, armv7sのみのビルドに変更する&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;code&gt;opencv/3rdparty/zlib/　にある　&lt;/code&gt;gzlib.c, gzread.c, gzwrite.c&lt;/code&gt;  のincludeに追加

&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;#include &lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/span&gt;unistd.h&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;code&gt;opencv/platforms/ios/build_framework.py&lt;/code&gt; 　行99、100:　変更&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;targets = [&quot;iPhoneOS&quot;, &quot;iPhoneOS&quot;, &quot;&quot;iPhoneSimulator&quot;, &quot;iPhoneSimulator&quot;]&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;&lt;code&gt;archs = [&quot;armv7&quot;, &quot;armv7s&quot;, &quot;i386&quot;, &quot;x86_64&quot;]&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;arm64を削除します&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;なくても、iPhone5sでも動く(プロジェクトが&lt;/code&gt;&lt;code&gt;&lt;code&gt;armv7,armv7sでビルドされる場合）&lt;/code&gt;ので取りあえずなしでビルド&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/h4&gt;
&lt;h4&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/h4&gt;
&lt;h4&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/h4&gt;
&lt;h4&gt;
&lt;code&gt;ビルドする&lt;/code&gt;&lt;/h4&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
&lt;code&gt;ビルド環境のパスを通す&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;sudo ln -s /Applications/Xcode.app/Contents/Developer /Developer&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;cmakeない場合は、portからinstall&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;sudo port install cmake&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;ビルド&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;python platforms/ios/build_framework.py ios&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;※モバイル系の記事は人気あるなあ&lt;/code&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/3656892841552932939/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/3656892841552932939' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/3656892841552932939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/3656892841552932939'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/opencv-for-ios-127-2014.html' title='OpenCV for iOS 1/27, 2014 ビルド'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-8548228471111770089</id><published>2014-01-23T22:03:00.000+09:00</published><updated>2014-02-01T01:28:00.352+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java8"/><title type='text'>Java 8を使ってみる （Timeクラス編）</title><content type='html'>Java 8を使ってみよう 3回目は、Timeクラスです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8_20.html&quot;&gt;前回&lt;/a&gt;はインターフェースを扱いました。流れ的に次はラムダ式かStreamかと思ったのですが、&lt;/span&gt;&lt;br /&gt;
まとめるのが難しいので先に箸休めでTimeクラスを紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
さて、Dateクラス使うの面倒臭いと思いませんか。&lt;br /&gt;
日付処理をしようとするとCalendarクラスを使わないといけないし、&lt;br /&gt;
差分とかとっていろいろしたいけど…、&lt;br /&gt;
という要望に答えた、CalenerクラスとDateクラス（+α）を統合した&lt;br /&gt;
のがJava 8からのTimeクラスです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
DateTime&lt;/h4&gt;
&lt;br /&gt;
時間を表すクラスには、いくつかあります。&lt;br /&gt;
代表的なのは、&lt;br /&gt;
LocalDateTime : タイムゾーンを含まない、日時&lt;br /&gt;
ZonedDateTime : タイムゾーンを含む、日時&lt;br /&gt;
になります。&lt;br /&gt;
ほかにもいろいろ追加されてますが、ここではLocalDateTimeを扱います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
日付処理&lt;/h4&gt;
&lt;br /&gt;
今日の3時のDateクラスを作成したいとなった時に今までは、&lt;br /&gt;
Calendarクラスを使っていました。&lt;br /&gt;
&lt;br /&gt;
Calendar cal = Calendar.getInstance();&lt;br /&gt;
cal.set(Calendar.HOUR_OF_DAY, 3);&lt;br /&gt;
cal.set(Calendar.MINUTE, 0);&lt;br /&gt;
cal.set(Calendar.SECOND, 0);&lt;br /&gt;
cal.set(Calendar.MILLISECOND, 0);&lt;br /&gt;
&lt;br /&gt;
Date date = cal.getTime();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LocalDateTimeでは、クラスに日付処理が組み込まれているので、&lt;br /&gt;
Calendarのようなクラスを呼ぶ必要はありません。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;LocalDateTime datetime = LocalDateTime.now()&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.withHour(3).withMinute(0).withSecond(0).withNano(0);&lt;br /&gt;
&lt;br /&gt;
指定日時のDateも作成しやすくなりました。&lt;br /&gt;
&lt;br /&gt;
LocalDateTime datetime1 = LocalDateTime.of(2014, 5, 21, 1, 12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一行で書けます。Javaではちょっと前から、一行で書くというのに&lt;br /&gt;
狂信的な人たちがいますね。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;10&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h4&gt;
日付差分&lt;/h4&gt;
&lt;br /&gt;
Dateクラスは比較がafter,beforeくらいだったのですが&lt;br /&gt;
Java 8からは、専用のクラスが追加されてかなり拡張されています。&lt;br /&gt;
むしろこちらの方が嬉しい&lt;br /&gt;
&lt;br /&gt;
ふたつのLocalDateTimeクラスの差分をDurationクラスで表せます。&lt;br /&gt;
&lt;br /&gt;
Duration duration = Duration.between(datetime, datetime1);&lt;br /&gt;
&lt;br /&gt;
このdurationは、datetimeからdatetime1までのナノ秒を保持しています。&lt;br /&gt;
LocalDateTimeクラスに、plusすることでdurationの秒数を追加できます。&lt;br /&gt;
&lt;br /&gt;
LocalDateTime datePlused = datetime.plus(duration);&lt;br /&gt;
&lt;br /&gt;
他にもminusとかできます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durationがあると、C#のTimeSpanのようなことができます。&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;a href=&quot;http://chkishe.blogspot.com/2013/09/javatimespan.html&quot;&gt;この記事&lt;/a&gt;の内容をTimeSpanからDurationに置き換えると次のようになる。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
public static final TimeSpan TIMESPAN = TimeSpan.Days(7);&lt;br /&gt;
&lt;br /&gt;
↓&lt;br /&gt;
&lt;br /&gt;
Duration duration1 = Duration.ofDays(1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
で現在と差分を足したDateを求めるには、&lt;br /&gt;
&lt;br /&gt;
Date date = TIMESPAN.getDate(new Date());&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
↓&lt;br /&gt;
&lt;br /&gt;
now.plus(duration1);&lt;br /&gt;
&lt;br /&gt;
とすればいい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
何に利用するかというと主に&lt;br /&gt;
Memcachedに渡すExpireの 定義とかです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Memcached.get(key, new Memgetable&amp;lt;String&amp;gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String get() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}, TIMESPAN.getDate(new Date()));&lt;br /&gt;
&lt;br /&gt;
↓&lt;br /&gt;
&lt;br /&gt;
Memcached.get(key, () -&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return value;&lt;br /&gt;
&amp;nbsp;}, Date.from(now.plus(duration1).toInstant());&lt;br /&gt;
&lt;br /&gt;
こんな風に記述ができます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
まだ、*DateTimeに対応してないのでDateに直さないといけないのが面倒&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8stream1.html&quot;&gt;つづく&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/8548228471111770089/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/8548228471111770089' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8548228471111770089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/8548228471111770089'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/java-8-time.html' title='Java 8を使ってみる （Timeクラス編）'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-1151826827584588181</id><published>2014-01-20T14:14:00.000+09:00</published><updated>2014-01-23T22:09:05.101+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java8"/><title type='text'>Java 8を使ってみる（使用編・インターフェース）</title><content type='html'>&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8.html&quot;&gt;準備編&lt;/a&gt;のつづきです。 &lt;br /&gt;
今回はJava 8 を実際に使ってみましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://chkishe.blogspot.jp/2012/12/java.html&quot;&gt;重みづけ抽選のロジック&lt;/a&gt;(以下RandomUtil）を、Java 8だとどうなるのか見ていきます。&lt;br /&gt;
ここでは、主にインターフェースの変更点についてみていきます。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
FunctionalInterface&lt;/h4&gt;
&lt;br /&gt;
Java 8はインターフェースにFunctionalInterfaceというものが追加されました。&lt;br /&gt;
インターフェースに対して@FunctionalInterface宣言をするまたは、&lt;br /&gt;
一つのメソッドのみ定義するとFunctionalInterfaceと認識されます&lt;br /&gt;
&lt;br /&gt;
RandomUtilだと、&lt;br /&gt;
&lt;br /&gt;
public interface Weight&amp;lt;T&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int getWeight(T temp) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
はJava 8ではFunctionalInterfaceとなります。&lt;br /&gt;
&lt;br /&gt;
@FunctionalInterface&lt;br /&gt;
public interface Weight&amp;lt;T&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int getWeight(T temp) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
と宣言をつけたものと同じ意味です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FunctionalInterfaceにはラムダ式を渡すことができます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TestMember member = RandomUtil.weightedRandom(members,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; new Weight&amp;lt;TestMember&amp;gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public int getWeight(TestMember m) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return m.weight;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
&lt;br /&gt;
以前までは、上記のように関数を渡していたのですが、&lt;br /&gt;
ラムダ式を渡すようにすると、次のように簡略化できます。&lt;br /&gt;
&lt;br /&gt;
TestMember member = RandomUtil.weightedRandom(members,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; m -&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return m.weight;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Default Method&lt;/h4&gt;
&lt;br /&gt;
また、インターフェースにDefaultMethodを追加できるようになりました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public interface Weight&amp;lt;T&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default int getWeight(T temp) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
上のように定義した場合、&lt;br /&gt;
&lt;br /&gt;
TestMember member = RandomUtil.weightedRandom(members,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Weight&amp;lt;TestMember&amp;gt;() { });&lt;br /&gt;
&lt;br /&gt;
とすると、getWeight の定義をしなくてもDefaultMethodとして定義している&lt;br /&gt;
メソッドが呼ばれます。ちなみに、DefaultMethodを定義していると&lt;br /&gt;
FunctionalInterfaceにはできません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8-time.html&quot;&gt;つづく &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用したプロジェクト：&lt;a href=&quot;https://drive.google.com/file/d/0B6PqJV1iK6Y5TXFfVjlGV1VuTjA/edit?usp=sharing&quot; rel=&quot;nofollow&quot;&gt;RandomUtil1.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/1151826827584588181/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/1151826827584588181' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1151826827584588181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1151826827584588181'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/java-8_20.html' title='Java 8を使ってみる（使用編・インターフェース）'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-5191691832967075700</id><published>2014-01-19T14:29:00.000+09:00</published><updated>2014-01-21T01:54:40.539+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java8"/><title type='text'>Java 8を使ってみる（準備編）</title><content type='html'>遅ればせながら、Java8を触ってみようと思います。&lt;br /&gt;
以前、昨年の5月かそれぐらいに、一度動かしてみようと思っていたのですが&lt;br /&gt;
対応するIDEもなく、あきらめて日数がかなりたってしまいました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java 8の特徴は、なんといってもラムダ式の導入と&lt;br /&gt;
C#でIEnumbleにあたるStreamを導入し、Linqのような実装ができるようになるということです。&lt;br /&gt;
C#もつかう身としてJavaでLinqポイ実装ができるのは感慨もひとしおです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
まずは、Java 8が動作する環境を作ります。&lt;br /&gt;
Java 8はまだ正式リリースではないので、あくまでも試験的なものです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Java 8 JDKのインストール&lt;/h4&gt;
&lt;br /&gt;
JDK 8 Early Access Releasesをダウンロードします。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://jdk8.java.net/download.html&quot;&gt;https://jdk8.java.net/download.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
から環境に適したものをダウンロード、インストールします。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Eclipseのインストール&lt;/h4&gt;
&lt;br /&gt;
Eclipseというか、Spring Tool SuiteにJava8 supportのプラグインが&lt;br /&gt;
すでに入ったものがあるのでそれを利用します。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://dist.springsource.com/snapshot/STS/nightly-distributions.html&quot;&gt;http://dist.springsource.com/snapshot/STS/nightly-distributions.html &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
上記のURLから&lt;br /&gt;
Spring Tool Suite - based on Eclipse 4.3 - including Java8 support&lt;br /&gt;
とあるところから、環境に適したものをダウンロードして、適当な場所に解凍します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Eclipseの設定&lt;/h4&gt;
&lt;br /&gt;
解凍したフォルダにあるSTS.exeを起動します。&lt;br /&gt;
起動したらまず、JDkのパスを通しましょう&lt;br /&gt;
&lt;br /&gt;
Window[メニュー] &amp;gt; Preferences &amp;gt; Java &amp;gt; InstalledJREs&lt;br /&gt;
&lt;br /&gt;
からインストールしたJDK 8 (&quot;C:\Program Files\Java\jdk1.8.0&quot;)を追加します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
プロジェクトの追加&lt;/h4&gt;
&lt;br /&gt;
Java 8に対応したプロジェクトを追加してみましょう&lt;br /&gt;
プロジェクト追加する際に、&lt;br /&gt;
Use an execution environment JREからJavaSE-1.8を選びます。&lt;br /&gt;
これで、プロジェクトでJava 8が利用できます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
準備編はここまで、&lt;a href=&quot;http://chkishe.blogspot.com/2014/01/java-8_20.html&quot;&gt;使用編&lt;/a&gt;につづきます&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/5191691832967075700/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/5191691832967075700' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5191691832967075700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/5191691832967075700'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/java-8.html' title='Java 8を使ってみる（準備編）'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-1229707293968319163</id><published>2014-01-18T16:04:00.000+09:00</published><updated>2014-01-18T16:04:54.881+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="Wndows"/><title type='text'>Windows8 でのmecab javaバインディング ビルド</title><content type='html'>mecabとjavaバインディングをビルドしたのでそのメモ&lt;br /&gt;
環境は、Windows 8.1 x64, Visual C++ 2010 Express&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; mecab0.996&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
インストール&lt;/h3&gt;
&lt;br /&gt;
Windows Software Development Kit (SDK) for Windows 8.1　をインストール&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-US/windows/desktop/bg162891&quot;&gt;http://msdn.microsoft.com/en-US/windows/desktop/bg162891&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mecabソースをダウンロード &lt;br /&gt;
&lt;a href=&quot;https://mecab.googlecode.com/files/mecab-java-0.996.tar.gz&quot;&gt;https://mecab.googlecode.com/files/mecab-java-0.996.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://mecab.googlecode.com/files/mecab-0.996.tar.gz&quot;&gt;https://mecab.googlecode.com/files/mecab-0.996.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;
libmecabビルド&lt;/h3&gt;
&lt;h4&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;h4&gt;
&lt;b&gt;&amp;nbsp;Configure&lt;/b&gt;&lt;/h4&gt;
Configureする必要がるのか？&lt;br /&gt;
取り敢えず、MsysでConfigureする&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;cd mecab-0.996&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;./configure&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
make.bat修正&lt;/h4&gt;
&lt;br /&gt;
mecab-0.996/src/make.bat のパスを環境に合わせて修正&lt;br /&gt;
私の環境では次のように、上三行を変更&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;Set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin;%PATH%&lt;br /&gt;Set
 INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 
10.0\VC\include;C:\Program Files (x86)\Microsoft 
SDKs\Windows\v7.0A\Include;%INCLUDE%&lt;br /&gt;Set LIB=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
libmecab.dllを作成 &lt;/h4&gt;
mecab-0.996/src/make.batを実行 &lt;br /&gt;
&lt;br /&gt;
mecab-0.996にlibmecab.dllができる&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;
&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;
Javaバインディング&lt;/h3&gt;
&lt;br /&gt;
&lt;br /&gt;
用意されてるバインディング（MeCab_wrap.cxx）だと動かないので&lt;br /&gt;
自分で作成する &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
mecab-0.996/src/mecab.h を修正する&lt;/h4&gt;
「#ifndef SIWG」を「#ifndef SWIG」に全部修正（何か所かある）&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
swigを実行する&lt;/h4&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;cd mecab-0.996\swig&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;swig -java -package org.chasen.mecab -c++ MeCab.i&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
MeCab_wrap.cxxが生成される &lt;br /&gt;
swigがない場合は&lt;a href=&quot;http://sourceforge.net/projects/swig/files/&quot;&gt;ここ&lt;/a&gt;から、パスを通しても完全パス指定でもOK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
MeCab_wrap.dllを作成&lt;/h4&gt;
&lt;br /&gt;
mecab-java-0.997に作成したlibmecab.dllとMeCab_wrap.cxxをコピー&lt;br /&gt;
下のようなコマンドを実行する。パスは環境に合わせて変更&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;Set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin;%PATH%&lt;br /&gt;Set
 INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 
10.0\VC\include;C:\Program Files (x86)\Microsoft 
SDKs\Windows\v7.0A\Include;%INCLUDE%&lt;br /&gt;Set LIB=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;cl /EHsc /LD /I mecab-0.996\src /I &quot;C:\Program Files (x86)\Java\jdk1.7.0_09\include&quot; /I &quot;C:\Program Files (x86)\Java\jdk1.7.0_09\include\win32&quot; MeCab_wrap.cxx libmecab.dll &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;
動作確認 &lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;libmecab.dllとMeCab_wrap.dllをコピーして&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
適当なサンプルを実行 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考サイト： &lt;br /&gt;
&lt;a href=&quot;http://ftablog.s56.xrea.com/index.php?itemid=167&quot;&gt;http://ftablog.s56.xrea.com/index.php?itemid=167&lt;/a&gt; &lt;br /&gt;
内容はほぼ同じ（Windows7,mecab0.97)</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/1229707293968319163/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/1229707293968319163' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1229707293968319163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/1229707293968319163'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/windows8-mecab-java.html' title='Windows8 でのmecab javaバインディング ビルド'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5334641280801634916.post-619701652711942504</id><published>2014-01-17T13:12:00.000+09:00</published><updated>2014-01-18T00:22:27.096+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Android NDKビルド環境をUbuntu Serverに作ってみた</title><content type='html'>AndroidのNDKビルド用の環境はWindowsやMac上でも作れるのですが、&lt;br /&gt;
Windowsだとcygwinとか面倒くさいし&lt;br /&gt;
Macだとたまにldtoolがないとか怒られるので&lt;br /&gt;
VMWare上のUbuntuに作成することにしました。&lt;br /&gt;
これだとコピペで環境を保存したり増やしたりえきるので便利ですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VMWare上にすでにUbuntuがインストールされていることが前提です。&lt;br /&gt;
Serverなのは消費メモリが少ないとかリソースの問題です。&lt;br /&gt;
&lt;br /&gt;
Build環境&lt;br /&gt;
&lt;span style=&quot;color: #660000;&quot;&gt;sudo apt-get install build-essential&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
１．Javaのインストール&lt;/h2&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;sudo add-apt-repository ppa:webupd8team/java&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;sudo apt-get install oracle-java7-installer &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h2&gt;
2. Android NDKインストール&lt;/h2&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;a href=&quot;https://developer.android.com/tools/sdk/ndk/index.html&quot;&gt;Android NDK&lt;/a&gt;をダウンロードします&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;tar -xvjof android-ndk-r9c-linux-x86_64.tar.bz2
sudo mv ./android-ndk-r9c /usr/local/
echo &#39;export PATH=$PATH:/usr/local/android-ndk-r9c&#39; &amp;gt;&amp;gt; .bashrc 
echo &#39;export NDKROOT=/usr/local/android-ndk-r9c&#39; &amp;gt;&amp;gt; .bashrc&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;h2&gt;
3. Android SDK インストール&lt;/h2&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;a href=&quot;https://developer.android.com/sdk/index.html&quot;&gt;Android SDK&lt;/a&gt;をダウンロードします&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;unzip adt-bundle-linux-x86_64-20131030.zip
sudo mv adt-bundle-linux-x86_64-20131030 /usr/local/

echo &#39;export PATH=$PATH:/usr/local/adt-bundle-linux-x86_64-20131030/sdk/tools&#39; &amp;gt;&amp;gt; .bashrc 
echo &#39;export PATH=$PATH:/usr/local/adt-bundle-linux-x86_64-20131030/sdk/platform-tools&#39; &amp;gt;&amp;gt; .bashrc&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;h4&gt;
ライセンス許可&lt;/h4&gt;
&lt;pre&gt;Android SDKの実行には最初にライセンスの認証が必要です&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;cd /usr/local/adt-bundle-linux-x86_64-20131030/sdk/tools&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;echo &quot;y&quot; | ./android update sdk --no-ui&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h4&gt;
SDK一覧&lt;/h4&gt;
&lt;pre&gt;次のコマンドでSDKの一覧が表示されます
&lt;span style=&quot;color: #660000;&quot;&gt;./android list sdk&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h4&gt;
SDKアップデート&lt;/h4&gt;
&lt;pre&gt;必要なSDKをインストール、アップデートします&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;android update sdk -u --filter platform-tools,android-16,android-8,extra-android-support&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;動かしてみる&lt;/pre&gt;
&lt;pre&gt;ndk-buildを実行してみる &lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h2&gt;
4.ビルドする際のメモ&lt;/h2&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;個人的にAndroid.mkを利用するよりも&lt;/pre&gt;
&lt;pre&gt;Configure時にSysroot, CC, CFLAG, LD, AR等を指定して&lt;/pre&gt;
&lt;pre&gt;クロスコンパイルするほうがiOSと同じ要領なので楽&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;lib作成時にだいたいは次のようにして、static libraryを作って&lt;/pre&gt;
&lt;pre&gt;あとで、static libraryを参照するAndroid.mkでsoにします&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;build.sh :  &lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;BINPATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
export CROSS_COMPILE=$BINPATH/arm-linux-androideabi
export CC=${CROSS_COMPILE}-gcc
export CXX=${CROSS_COMPILE}-g++
export LD=${CROSS_COMPILE}-ld
export AR=${CROSS_COMPILE}-ar&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;export CFLAGS=&quot;--sysroot $SYSROOT -std=gnu99 -L$LIB_DIR -L${NDK_ROOT}/usr/lib -I${NDK_ROOT}/usr/include&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;./configure --prefix=&quot;一時フォルダ&quot; --enable-static --disable-shared --host=arm-linux-androideabi&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;※おそらくConfigure時に&lt;span style=&quot;color: #660000;&quot;&gt;arm-linux-androideabi&lt;span style=&quot;color: black;&quot;&gt;の定義がないと怒られるので&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;下のリンクからconfigure.guess, configure.subをダウンロードして&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;color: #660000;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;configureのあるフォルダに移動、上書きします &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;http://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/config.guess&lt;/pre&gt;
&lt;pre&gt;http://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/config.sub&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;Android.mk :&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;この辺りが参考になるかと &lt;/pre&gt;
&lt;a href=&quot;https://groups.google.com/forum/#!topic/android-group-japan/NMoJAioGi04&quot;&gt;https://groups.google.com/forum/#!topic/android-group-japan/NMoJAioGi04&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chkishe.blogspot.com/feeds/619701652711942504/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5334641280801634916/619701652711942504' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/619701652711942504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5334641280801634916/posts/default/619701652711942504'/><link rel='alternate' type='text/html' href='http://chkishe.blogspot.com/2014/01/android-ndkubuntu-server.html' title='Android NDKビルド環境をUbuntu Serverに作ってみた'/><author><name>chkishe</name><uri>http://www.blogger.com/profile/16858913516983289579</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWlaVmQAOxd0741O6csx3ySIg9sM5bxjjEC5O3yxFCbzF-lmWE1J4nxY7FxHIAhQnj19Q_Oy3Uzm7uT5IBvUJPGxZD0RiYRCHuhS6DyuyGWCiD9C54srqxaQna3fwONQw/s220/pink.gif'/></author><thr:total>0</thr:total></entry></feed>