tag:blogger.com,1999:blog-30340013572406748102024-03-05T22:25:17.240+09:00ぽいぽい日々やってること、やったこと、やりたいことを書く。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.comBlogger102125tag:blogger.com,1999:blog-3034001357240674810.post-2699202253707270772014-06-14T01:44:00.002+09:002014-06-14T01:44:15.794+09:00ワールドカップがキターブログの更新をさぼっている間にワールドカップが始まりましたね!(マテ<br />
私は高校生まではサッカー漬けの日々を送っていたので、いつもサッカーの試合となると自分もフィールドにいるつもりで観戦してしまいます。<br />
<br />
開幕戦のブラジル対クロアチア。おもしろかったですねー。<br />
特に目を引いたのはシュート性のゴールに向かうクロスでした。<br />
クロアチアはこれで1点をブラジルからもぎ取りましたね。<br />
<br />
これは相手DFが触ってもゴールが狙えるので点が入る確率が上がります。<br />
しかし、これはFWが触れません。なぜならFWはマイナスのクロスを想定して動くからです。サッカーはスペースを奪い合うスポーツです。誰かが動けば必ずスペースは生まれます。<br />
クロスをあげる人が切り替えしをすることで、相手DFはディフェンスの再構築をしなければなりません。そこで必ずスペースが生まれます。クロスをあげる人がまるでファンタジスタですね。このスペースが得点のにおいを感じさせます。ほんとに一瞬ですけどね。<br />
<br />
サッカーを観戦するときに、空いてる人ではなく空いてるスペースを見つけながら観戦するのをおすすめします。とてもエキサイティングですよ。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-40920289482876652262014-04-20T23:19:00.000+09:002014-04-20T23:24:59.912+09:00Genymotionを導入してみたeclipseのエミュレータでandroid4.4.2のテストをしたかったのだけど、<br />
どうにもこうにもTheme.Holo.Light.NoActionBar.TranslucentDecorの状態が作れなかった。スキンに問題あるのかな。<br />
<br />
そんなわけでGenymotionを導入してみました。<br />
試してみたところTheme.Holo.Light.NoActionBar.TranslucentDecorが反映されていることが確認できました。しばらく使ってみよう。<br />
4.4の実機がほしいです。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy4qTxMffMNwY8TwMh-C0sDCtwOsfxOPw58b3Tyd0OerjoH4JW8g1j5_ZgFYDSdI0Y76TXyC_biRhWp0v1BnCVn-dXr194JdAeatafuyXpcr3foa5I85dd6vVP4GGNYyBXq_VgOmu4W7Q/s1600/00.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy4qTxMffMNwY8TwMh-C0sDCtwOsfxOPw58b3Tyd0OerjoH4JW8g1j5_ZgFYDSdI0Y76TXyC_biRhWp0v1BnCVn-dXr194JdAeatafuyXpcr3foa5I85dd6vVP4GGNYyBXq_VgOmu4W7Q/s200/00.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTAYcae9QqhhjNcyh0hTjL5j59T14_448hPitQYufY7IAiRhP9d9JKdHPv-pSw3hNoq97wscAYlMy24Bb2KF3y_uEzIpbHro345MjdaWzN2JoQibatPdwN3Ej4uJLni8pwnmdf4Q0f1P8/s1600/01.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTAYcae9QqhhjNcyh0hTjL5j59T14_448hPitQYufY7IAiRhP9d9JKdHPv-pSw3hNoq97wscAYlMy24Bb2KF3y_uEzIpbHro345MjdaWzN2JoQibatPdwN3Ej4uJLni8pwnmdf4Q0f1P8/s200/01.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjraw6q87S7-j0KALZ4-f5mwujDLTthmQpJjLonCGhbn41jkMYcsZdBg-QNuxBWDa3gGXrA6IXwVsOCX6_jx7KJHYUKwNx2Wcv3dD6856oV4o8k1HK3fTwkp3kKBSd0YHl5R7Rsifu6a5A/s1600/02.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjraw6q87S7-j0KALZ4-f5mwujDLTthmQpJjLonCGhbn41jkMYcsZdBg-QNuxBWDa3gGXrA6IXwVsOCX6_jx7KJHYUKwNx2Wcv3dD6856oV4o8k1HK3fTwkp3kKBSd0YHl5R7Rsifu6a5A/s200/02.png" /></a>
Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-60905598731768330442014-04-20T01:13:00.000+09:002014-04-20T01:13:25.899+09:004.4のアクションバーも含めて透過ぼへーっとStackOverFlowを見てたら面白そうなのがあった。<br />
http://stackoverflow.com/questions/19746943/why-cant-we-use-a-translucent-system-bars-with-and-actionbar<br />
<br />
アクションバーも含めて透過してる。<br />
からくりとしてはアクションバーの背景を透過する。<br />
んで、activityの一番上のレイアウトに色をつける。<br />
そうするとその一番上のレイアウトの色がステータスバーとアクションバーの背景として見える。<br />
<br />
おもしろいけど、個人的にはちょっと見づらいかな。<br />
でもアプリのカテゴリーを表示する色として使うとかならありなのかなぁ。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-85431042216552593642014-04-18T05:07:00.000+09:002014-04-18T05:18:02.772+09:00というわけでステータスバーがレイアウトに被るような場合のレイアウトのサイズが見れるものを作ってみた。<br />
https://play.google.com/store/apps/details?id=ahscode.statusbaronscreen<br />
https://github.com/ahscode/teststatusbar<br />
<br />
androidのdimenのapilevel15~19を確認したけど、公式ではステータスバーの高さは25dipだった。<br />
マージンなりパディングなりは25dipでとれば大丈夫そうだけど、滲んだりするといやだから追加で8dipくらいとればいいのかな。<br />
<br />
kitkatの実機がほしいです。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-41722532015684967122014-04-17T22:12:00.001+09:002014-04-17T22:12:49.739+09:00kitkat対応盲点だった。<br />
<br />
kitkatでは新しいテーマで<br />
android:style/Theme.Holo.Light.NoActionBar.TranslucentDecor<br />
というのがある。<br />
こいつはステータスバーが透明になる。<br />
かつ、Viewのコンテンツ領域がDisplaySizeと等しくなる。<br />
そしてコンテンツ領域に被さるようにステータスバーがある。<br />
<br />
この被さるというのを考えてなかった。<br />
コンテンツ領域がステータスバーに被ってしまう。<br />
<br />
じゃあ、他のバージョンもこれに似た状況にしないとね。<br />
というわけで、ActivityのsetContentViewの前に、<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
]]></script>というのを呼び出すと、ステータスバーがコンテンツ領域に被るようにできる。<br />
他のバージョンでも透明になったらいいのになぁ。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-35345277131735848182014-04-16T21:41:00.001+09:002014-04-16T21:46:48.699+09:00FragmentPagerAdapterで登録しているFragmentの完全取得ViewPagerのアダプターにFragmentPagerAdapterを使っている場合、<br />
mAdapter.getItem(int position)で返ってくるFragmentはその実体ではない。<br />
具体的に言うと、メンバ変数として登録したレイアウトなどへのアクセスが全てnullになる。<br />
staticなものとかfinalは試してません。<br />
<br />
じゃあ、どうやってアクセスするの?<br />
ということで、surpportv13にある実装を見てみる。<br />
コンストラクタのFragmentManagerを使って内部でタグをつけてaddしていた。<br />
<br />
そんなわけで真似して呼んでみたらnullじゃなかった。<br />
FragmentがもつViewの入れ替えもできた。<br />
<br />
なんだろう。こう、もにょる。<br />
それなら自分でsupportv4のPagerAdapterを拡張しておれおれFragmentPagerAdapter作ったほうがいいような気がしてきた。<br />
<br />
全部のFragmentを必ず最初にattachしてonCreateは呼ばせたいが、そうなると今度はViewPagerの根本的な拡張になるんだろうなー。<br />
<br />
具体的にはこんな感じで試してみました。<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
public void changeParent(Object localstate, FragmentManager fm, int oldCurrent, int newCurrent, int container_id) {
@SuppressWarnings("unused")
final String method_tag = mTAG+"/changeParent";
Fragment fragment = fm.findFragmentByTag(makeFragmentName(container_id, oldCurrent));
Log.d(method_tag, "fragment is null?"+(fragment == null));
mIAdapterInterface_old = (IAdapterInterface)fragment;
mIAdapterInterface_old.pergeView();
fragment = fm.findFragmentByTag(makeFragmentName(container_id, newCurrent));
mIAdapterInterface_new = (IAdapterInterface)fragment;
mIAdapterInterface_new.mergeView(localstate);
}
]]></script>Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-39630303435944447812014-04-15T23:42:00.001+09:002014-04-15T23:49:37.435+09:00とあるDragAndDropドラッグアンドドロップのやっているところで簡単なテストアプリを作ってみた。<br />
onDragListenerのテストでございます。<br />
やりたいことは、<br />
・レイアウト内にあるViewを他のレイアウトにドラッグアンドドロップする<br />
こんだけ。<br />
<br />
で、試しにやってみたところうまくいかなかった。<br />
エラーで、<br />
E/AndroidRuntime(12379): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.<br />
<br />
これが出る。何ぞこれ?と思って調べたところ、<br />
Kazzzの日記 Viewの階層を入れ替える<br />
http://d.hatena.ne.jp/Kazzz/20100603/p1<br />
というサイト様で図解が出ていた。<br />
<br />
ほむほむ。<br />
親との縁を切れと(違<br />
<br />
冗談はさておき、元のparentとの関係を無効(removeView)にして宙ぶらりんにした後、<br />
新しい親に加わえる(addView)。invalidateではだめでした。<br />
<br />
最初はアニメーションの関係かなぁと思ったのでpostDelayしてみたりしたがだめでけっこう行き詰ってました。だってview init<うんたらかんたら>とかいうエラーが出たし。<br />
さらにMainActivityの匿名クラスでやってたもんだから、参照がわけわかめになっていた。<br />
<br />
そんなわけで、匿名クラスを全部外に出し、やりとりは全て独自インターフェイスにして、必要なものだけActivityのメンバ変数にした。<br />
<br />
以下ソース。<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_body"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/main_doc"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</RelativeLayout>
]]></script>
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
package ahscode.testdrag;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class MainActivity extends Activity
implements MyDragListener.ICommnicate
,MyClickListener.ICommunicate
,MyLongClickListener.ICommunicate{
protected String mTAG = "MainActivity";
private RelativeLayout mRelativeLayout;
private LinearLayout mLinearLayout;
private Button mButton;
private View mDraggingView;
private ViewGroup mOldParent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout)findViewById(R.id.main_body);
mLinearLayout = (LinearLayout)findViewById(R.id.main_doc);
mButton = (Button)findViewById(R.id.button1);
}
@Override
protected void onResume() {
@SuppressWarnings("unused")
final String method_tag = mTAG+"/onResume";
super.onResume();
MyClickListener click = new MyClickListener(this,this);
mButton.setOnClickListener(click);
MyDragListener recive = new MyDragListener(this);
mRelativeLayout.setOnDragListener(recive);
}
@Override
public void dropedItem(int x,int y) {
@SuppressWarnings("unused")
final String method_tag = mTAG+"/dropedItem";
Log.d(method_tag, "座標:x/y?"+x+"/"+y);
mOldParent.removeView(mDraggingView);
mRelativeLayout.addView(mDraggingView);
}
@Override
public void createdView(View v) {
@SuppressWarnings("unused")
final String method_tag = mTAG+"/createdView";
mLinearLayout.addView(v);
MyLongClickListener longclick = new MyLongClickListener(this);
v.setOnLongClickListener(longclick);
}
@Override
public void postDraggingView(View v) {
@SuppressWarnings("unused")
final String method_tag = mTAG+"/postDraggingView";
mDraggingView = v;
mOldParent = (ViewGroup)mLinearLayout;
}
}
]]></script>
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
package ahscode.testdrag;
import android.app.Activity;
import android.view.DragEvent;
import android.view.View;
import android.view.View.OnDragListener;
public class MyDragListener implements OnDragListener {
public static final String TAG = "MyDragListener";
protected final String mTAG = "MyDragListener";
private ICommnicate mPoster;
interface ICommnicate{
/**from MyDragListener*/
void dropedItem(int x,int y);
}
public MyDragListener(Activity act) {
//system use
mPoster = (ICommnicate)act;
}
@Override
public boolean onDrag(View v, DragEvent event) {
@SuppressWarnings("unused")
final String method_tag = mTAG + "/onDrag";
int action = event.getAction();
switch(action){
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DROP:
mPoster.dropedItem((int)event.getX(),(int)event.getY());
break;
case DragEvent.ACTION_DRAG_ENDED:
break;
}
return true;
}
}
]]></script>
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
package ahscode.testdrag;
import android.app.Activity;
import android.content.ClipData;
import android.view.View;
import android.view.View.DragShadowBuilder;
import android.view.View.OnLongClickListener;
public class MyLongClickListener implements OnLongClickListener {
public static final String TAG = "MyLongClickListener";
protected final String mTAG = "MyLongClickListener";
private ICommunicate mICommunicate;
interface ICommunicate{
/**MyLongClickListener*/
void postDraggingView(View v);
}
public MyLongClickListener(Activity act) {
//system use
mICommunicate = (ICommunicate)act;
}
@Override
public boolean onLongClick(View v) {
@SuppressWarnings("unused")
final String method_tag = mTAG + "/onLongClick";
ClipData data = null;
DragShadowBuilder shadowBuilder = new DragShadowBuilder(v);
Object myLocalState = null;
int flags = 0;
v.startDrag(data, shadowBuilder, myLocalState, flags);
mICommunicate.postDraggingView(v);
return true;
}
}
]]></script>
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
package ahscode.testdrag;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
public class MyClickListener implements OnClickListener {
public static final String TAG = "MyClickListener";
protected final String mTAG = "MyClickListener";
private Context mContext;
private ICommunicate mIPoster;
interface ICommunicate{
/**MyClickListener*/
void createdView(View v);
}
public MyClickListener(Context context, Activity act) {
//system use
mContext =context;
mIPoster = (ICommunicate)act;
}
@Override
public void onClick(View v) {
@SuppressWarnings("unused")
final String method_tag = mTAG + "/onClick";
View view = new View(mContext);
float cellsize_dp = 56f;
float density = mContext.getResources().getDisplayMetrics().density;
int px_cellsize = (int) (cellsize_dp * density + 0.5f);
view.setBackgroundColor(Color.CYAN);
view.setLayoutParams(new LayoutParams(px_cellsize, px_cellsize));
mIPoster.createdView(view);
}
}
]]></script>
Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-81146052026194448932014-04-13T02:23:00.002+09:002014-04-13T02:32:21.791+09:00GridLayoutを均等にしてみるテスト均等にするのってめんどくさそうだなーと思いながらカスタムビューを作ろうとして、<br />
既存のウィジェットでできないもんだろうかと思ったのでやってみた。<br />
<br />
どっかでワンクッションを置く感じで透明な状態で使いたいサイズで組み込んでおけば、あとから使いたい実数値も取れる。<br />
例えば、始める前に「Hi! this app is うんたらかんたら Okボタンを押すと始まるよ!」とかいう画面を入れてみたり。んで、永続データに突っ込む。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieZpGREPZ6bqubSlHrlzx1eMo0fKiD0MB4R1Bjk6nf5FdvrJ_3gy70oCmlUEzm3yDjPpKVD9Tg_3vFKZIwNZnfKxOITQAlgJfnc7zDi4HuSaHV92dJlEhXx1i30AXgrIoDWhRQEa5M46U/s1600/Screenshot_2014-04-13-02-07-28%5B1%5D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieZpGREPZ6bqubSlHrlzx1eMo0fKiD0MB4R1Bjk6nf5FdvrJ_3gy70oCmlUEzm3yDjPpKVD9Tg_3vFKZIwNZnfKxOITQAlgJfnc7zDi4HuSaHV92dJlEhXx1i30AXgrIoDWhRQEa5M46U/s1600/Screenshot_2014-04-13-02-07-28%5B1%5D.png" height="200" width="112" /></a></div>
ボタンをタップもしくはクリックするとこんな感じになります。<br />
階層は、<br />
RelaitiveLayout<br />
LinearLayout<br />
ボタンとView<br />
RelativeLayout<br />
RelativeLayout(ポイント1)<br />
GridLayout<br />
と言う感じです。<br />
このポイント1を入れたのは、当初はそのままGridLayoutを入れていたのですが、Gravityをいじってみたりしたけどだめで、そもそもこいつはどこを基点としているのかなーと思い試しに囲ってみたらうまくいきました。<br />
ちなみにGridLayoutのRelativeLaytoutの関係は、<br />
android:layout_centerInParent="true"になっています。<br />
これプラスAlignParentTop = "true"にすると上ぴったりになります。<br />
<br />
以下ソース。レイアウトとjavaを置いておきます。気が向いたらGithubに突っ込んどきます。<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<LinearLayout
android:id="@+id/mock_doc_ll_horizontal"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<FrameLayout
android:id="@+id/mock_cell"
android:layout_width="56dp"
android:layout_height="56dp" >
</FrameLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/mock_area_screen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/mock_doc_ll_horizontal"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" >
<GridLayout
android:id="@+id/mock_cellarea_gl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
android:rowCount="2" >
</GridLayout>
</RelativeLayout>
</RelativeLayout>
]]></script>
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
package ahscode.testgrid;
import java.util.Random;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.GridLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
private GridLayout mGrid;
private FrameLayout mCell_fl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_mock_screen);
Button b = (Button) findViewById(R.id.button1);
mGrid = (GridLayout)findViewById(R.id.mock_cellarea_gl);
mCell_fl = (FrameLayout)findViewById(R.id.mock_cell);
b.setOnClickListener(new MyClick());
}
public class MyClick implements OnClickListener {
public static final String TAG = "MyClick";
@Override
public void onClick(View v) {
@SuppressWarnings("unused")
final String method_tag = TAG + "/onClick";
mCell_fl.setBackgroundColor(Color.CYAN);
View view = findViewById(R.id.mock_area_screen);
int width_grid = view.getWidth();
int height_grid = view.getHeight();
int width_cell = mCell_fl.getWidth();
int height_cell = mCell_fl.getHeight();
int maxColCount = (int)(width_grid/width_cell);
int maxRowCount = (int)(height_grid/height_cell);
int cell_sum = maxColCount*maxRowCount;
FrameLayout cell = new FrameLayout(getApplicationContext());
LayoutParams params = new LayoutParams(width_cell, height_cell);
cell.setLayoutParams(params);
GridLayout.LayoutParams params_gl = new GridLayout.LayoutParams();
GridLayout.Spec rowSpec = null;
GridLayout.Spec colSpec = null;
mGrid.setColumnCount(maxColCount);
mGrid.setRowCount(maxRowCount);
TextView child = null;
GridLayout.LayoutParams child_param = null;
View.OnClickListener clicked = new OnClickListener() {
@Override
public void onClick(View v) {
@SuppressWarnings("unused")
final String method_tag = TAG + "/onClick";
mGrid.setVisibility(View.GONE);
int index = mGrid.indexOfChild(v);
mGrid.removeViewAt(index);
TextView tv = null;
StringBuilder sb = new StringBuilder();
for(int i = 0;i < mGrid.getChildCount();i++){
tv = (TextView)mGrid.getChildAt(i);
tv.setText(sb.append(mGrid.indexOfChild(tv)));
sb.setLength(0);
}
mGrid.setVisibility(View.VISIBLE);
}
};
int row_count = 0;
Random rm = new Random();
int red = 0;int green = 0;int blue = 0;int color_rgb = 0;int limit_rgb = 256;
int childindex =-1;
mGrid.setVisibility(View.GONE);
mGrid.removeAllViews();
while(row_count < mGrid.getRowCount()){
rowSpec = GridLayout.spec(row_count);
for(int col_count = 0;col_count < mGrid.getColumnCount();col_count++){
colSpec = GridLayout.spec(col_count);
child = new TextView(getApplicationContext());
child_param = new GridLayout.LayoutParams(rowSpec,colSpec);
child_param.width = width_cell;
child_param.height = height_cell;
child.setOnClickListener(clicked);
red = rm.nextInt(limit_rgb);
green = rm.nextInt(limit_rgb);
blue = rm.nextInt(limit_rgb);
color_rgb = Color.rgb(red, green, blue);
child.setBackgroundColor(color_rgb);
mGrid.addView(child, child_param);
childindex = mGrid.indexOfChild(child);
child.setText(String.valueOf(childindex));
child.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12f);
child.setGravity(Gravity.CENTER);
}
row_count++;
}
mGrid.setVisibility(View.VISIBLE);
}
}
}
]]></script>
Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-39378687817702647422014-04-11T13:58:00.001+09:002014-04-11T13:58:23.764+09:00画面遷移についてfragmentのバックスタックやActivityの遷移などをいれるとどうしても画面がちらつく。<br />
目には負担でしかありません。見たくなくなります。<br />
UXの話になるけども、目が辛くなるような遷移はだめだと思う。<br />
<br />
ソフトにすることも可能だけど、本体設定の開発者向けのオプションからアニメーションをカットして通常使用している場合、アニメーションの効果は薄くなる。<br />
<br />
じゃあ、どうするかというと設計を見直す。これに尽きる。<br />
えーやだー。<br />
がんばります。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-35276386944970278092014-04-06T05:09:00.000+09:002014-04-06T05:21:30.865+09:00NoUIFragmentの使い所FragmentはUIを持つものとUIを持たないものがある<br />
ご存知の方も多いと思う。<br />
<br />
このUIを持たないFragmentは使い所でちょっと厄介なところがある。<br />
Activityの遷移が絡む場合だ。<br />
<br />
永続データをキーにするならまだしもBundleであれこれやろうとすると失敗する。<br />
Loaderの戻り値をBundleに入れて、NoUIFragmentからActivityの再起動を試みたところエラーが出た。Activityのライフサイクルにひっかかったようだ。<br />
ランチモードはデフォルト。使用したメソッドはActivityクラスのrecreate()。<br />
<br />
試しにNoUIFragmentではなくActivityのonActivityResultでrecreate()を使用したところ、Bundleの値を保持してonCreateが呼ばれた。<br />
<br />
Activityの遷移が絡むところではNoUIFragmentは避けようと思った。<br />
<br />
以下、おまけ。<br />
テストで使ったBundleを保持できるActivityの再起動のソース。<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
public class MainActivity extends Activity {
private static final int Num = 0;
private static final String TAG = "MainActivity";
private boolean mIsRefresh = false;
private String key = TAG;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
if(savedInstanceState != null){
mIsRefresh = (savedInstanceState.get(key)!= null?savedInstanceState.getBoolean(key):false);
}
Log.d(TAG, "IsRefresh?"+mIsRefresh);
if(mIsRefresh == false){
Intent intent = new Intent(this.getApplicationContext(),SecondActivity.class);
startActivityForResult(intent, Num);
return;
}
Log.d(TAG, "true_corce");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(key, mIsRefresh);
super.onSaveInstanceState(outState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case Num:
Log.d(TAG, "result?"+resultCode);
if(resultCode == Activity.RESULT_OK){
mIsRefresh = true;
recreate();
// finish();
// Intent intent = new Intent(this.getApplicationContext(), MainActivity.class);
// startActivity(intent);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
]]></script>Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-28600937165149216392014-04-02T19:58:00.000+09:002014-04-02T19:59:04.156+09:00備忘録:GridLayoutを動的に作る<script class="brush: java" type="syntaxhighlighter"><![CDATA[
View child = null;
int rownum = 0;
GridLayout.Spec rowSpec = null;
GridLayout.Spec colSpec = null;
GridLayout.LayoutParams child_param = null;
float density = getResources().getDisplayMetrics().density;// density (比率)を取得する
float dp_f = 56f;
int px = (int) (dp_f * density + 0.5f);// 56 dp を pixel に変換する ( dp × density + 0.5f(四捨五入) )
Random rm = new Random();
int red = 0;int green = 0;int blue = 0;int color_rgb = 0;int limit_rgb = 256;
while(rownum < mGridLayout.getRowCount()){
rowSpec = GridLayout.spec(rownum);
for(int i =0;i < mGridLayout.getColumnCount();i++){
colSpec = GridLayout.spec(i);
child = new View(getActivity());
child_param = new GridLayout.LayoutParams(rowSpec, colSpec);
child_param.width = px;
child_param.height = px;
child.setLayoutParams(child_param);
red = rm.nextInt(limit_rgb);
green = rm.nextInt(limit_rgb);
blue = rm.nextInt(limit_rgb);
color_rgb = Color.rgb(red, green, blue);
child.setBackgroundColor(color_rgb);
mGridLayout.addView(child, child_param);
}
rownum++;
}
mBody.setVisibility(View.VISIBLE);
]]></script>
Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-33506710272054173762014-03-25T03:55:00.001+09:002014-03-25T03:55:54.629+09:00特許権の帰属先はどうなるのか寝るか。と思ってニコニコを開いてちらちら見てたら、<br />
『社員の発明、企業のものに』<br />
(時事通信社 http://www.jiji.com/jc/c?g=eco_30&k=2014032400837)<br />
という記事があった。<br />
そういえばダイオードの特許で一悶着あったね。<br />
<br />
内容を見てみる。<br />
議論を始める段階だけども、特許は企業に帰属する方向でやるらしい。<br />
<br />
研究設備とかそれに伴う費用、人材とかは確かに個人では捻出するのが難しいから、企業にもそれなりに言い分はあると思う。<br />
一方、実際にあれこれ研究したりする人としては、個人のアイディアや費やした時間というのがあるので、これもまた一理あると思う。<br />
<br />
実績作ってヘッドハンティングか途中でヘッドハンティングか旧ソ連みたいな結末になりかねないような気がいたしますが大丈夫でしょうか。<br />
<br />
双方、出せるものを出してできた結果なのだから、会社+実行グループで分割できたほうがいいと思うけどなぁ。<br />
そうすると総合職とかの事務職ってインセンティブとかないね。会社に入った利益分をボーナスに一部転嫁するようにすれば丸くなるかな。<br />
金のかかる話は簡単だけど、金のかからない話は難しいね。<br />
<br />
「A rolling stone gathers no moss.」<br />
さて、どっちだろうね。<br />
<br />Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-22219178757975465272014-03-24T00:48:00.000+09:002014-03-24T00:48:28.374+09:00そんなこんなでホームアプリを作ってます。<br />
空いた時間でこつこつがんばっとります。<br />
<br />
ぽへーっとしながらレイアウトをテストしてます。<br />
で、たまたま本体の方の文字の大きさを変えられることを知りました。<br />
使用している端末のバージョンは4.0.4です。<br />
<br />
文字を大きくしたらアイコンのラベルの文字が見切れとる。。。<br />
これは不細工だな。。。<br />
ほかのはどうなんだろうとほかのホームアプリも開いたところやはり見切れていた。<br />
ふーん。<br />
<br />
んで、ぱっと思いついたのが3つ。<br />
1.TextViewクラスをOverrideして独自クラスを作る<br />
2.フォントサイズでは「sp」を使わずに「dp」を使う<br />
3.TextViewクラスを真似て独自Viewを作る<br />
<br />
1はそれなりに心当たりがあるし、できそうだけど"全部"動的に作ることになる。<br />
2はAndroidのガイドラインから逸れるが大きさには左右されない。<br />
3はやだめんどくさい。<br />
<br />
上品にやるなら、<br />
端末の大きさ(縦横の実サイズ)に応じてscaleを変更させるように組めばいいのかな。<br />
スマホレベル(5inch<=本体)を1として、<br />
ファブレットレベル(5inch<本体>=7inch)で1.5倍。<br />
タブレットレベル(本体>7inch)で2倍とか。<br />
<br />
アイコンの大きさ(ラベルがある時は36dp)は48dpにしてるのだけど、<br />
思い切って72dpくらいとってみようかなぁ。。。<br />
<br />
んーでも、トータル48dpを覆すほどの理由はないのよねぇ。<br />
かといって、アプリを起動する"顔"はできる限りいじりたくない。<br />
画像48dpとフォントサイズを10dpくらいにしてみようかな。<br />
<br />
思い切ってユーザーに丸投げするのもありか。<br />
どうせ設定はロードするし、セーブするし、キャッシュするし。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-39328885816229663792014-03-14T19:03:00.002+09:002014-03-14T20:13:21.322+09:00ホームアプリのサンプルを探して三千里・・・では足りないかwそんなこんなでサンプルを探しました。<br />
<br />
行き着いた先が<br />
https://android.googlesource.com/?format=HTML<br />
上記のページにずらーっと置いてある。<br />
<br />
その中でAndroidOS標準のホームはバージョン毎にある。<br />
Lancher(android-1.6_r1~android-2.1_r2.1p2)<br />
https://android.googlesource.com/platform/packages/apps/Launcher/<br />
Lancher2(eclair-release~kitkat-release)<br />
https://android.googlesource.com/platform/packages/apps/Launcher2/<br />
Lancher3(android-4.4_r0.9~android-4.4.2_r2)<br />
<br />
4.0、実機は4.0.4から使えるランチャーを取り出したいのでLancher2を取り込む。<br />
環境はwindows7です。<br />
以下、手順。<br />
インポートでGitからプロジェクトを選択。<br />
cloneURIを選択。<br />
ロケーションのURIを<br />
https://android.googlesource.com/platform/packages/apps/Launcher2<br />
に設定。<br />
そうするとブランチがずらーっとある。<br />
とりあえずmasterのみ選択してみる。<br />
ロードが終わり、新規プロジェクトウィザードを使用を選択。<br />
完了を押して、既存コードからのAndroidプロジェクトを選択。<br />
ルートディレクトリは「gitフォルダ」にある「Lancher2」を選択。<br />
テストとアプリケーションのプロジェクトがあるのでアプリケーションのみチェック。<br />
好みでワークスペースにコピー。<br />
<br />
さて、終わったのでどんなもんかとwktkしたが、<br />
使用するソースを4.0にしていたのでエラーが520個も出た。<br />
じゃあ、最新の4.4でビルドしてやんよ。<br />
エラーが2個出た。<br />
Description<span class="Apple-tab-span" style="white-space: pre;"> </span>Resource<span class="Apple-tab-span" style="white-space: pre;"> </span>Path<span class="Apple-tab-span" style="white-space: pre;"> </span>Location<span class="Apple-tab-span" style="white-space: pre;"> </span>Type<br />
インポートされた com.android.common は見つかりません<span class="Apple-tab-span" style="white-space: pre;"> </span>Launcher.java<span class="Apple-tab-span" style="white-space: pre;"> </span>/Launcher/src/com/android/launcher2<span class="Apple-tab-span" style="white-space: pre;"> </span>行 98<span class="Apple-tab-span" style="white-space: pre;"> </span>Java 問題<br />
<div>
たぶんこいつがあればいいんだろう。</div>
<div>
<br /></div>
<div>
が、こちらは4.0から使えるのが欲しいので、ほかのブランチを試してみる。<br />
ics-factoryrom-2-releaseエラーあり<br />
ics-mr0エラーあり<br />
ics-mr0-releaseエラーあり<br />
ics-mr1エラーあり<br />
ics-mr1-releaseエラーあり<br />
ics-plus-aospエラーあり<br />
<br />
・・・。<br />
くまった。<br />
<br />
でも、manifest読んで、ソースコードを見れば大概わかるからよしとするか。<br />
<br />
内部APIとかごりごり使っているからAndroid丸ごとビルドする必要がある模様。<br />
ぐぐると実際にやってる人もいた。<br />
今の環境ではどうあがいても無理ということがわかったので、やっぱりソース追うか。</div>
<div>
<br /></div>
<br />
<br />Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-86505808873560659252014-03-14T02:27:00.000+09:002014-03-14T02:40:00.124+09:00備忘録:TableLayoutへの動的なRowの追加とRowへのItmeの追加ホームアプリのアプリのランチャーを作っていてつまづいた所をメモ。<br />
なぜかレイアウトが崩れる。<br />
Gravityは均等真ん中でレイアウトファイルで規定しているのだが。。。<br />
TableLayoutに動的にアイテムを入れるところ。<br />
アイテムを追加したら空いてるマスにレイアウトで作成したアイテム、LinearLayoutで囲ったImageViewとTextViewを入れるといった感じ。<br />
<br />
TableLayoutクラスのLayoutParamsでparamを作り、それをアイテム内のLinearLayoutに.setLayoutParams(param)。<br />
で、適用したLinearLayoutのwidthをLinearLayout ll.width = 0。<br />
その上で、float ll_weight = 1.0f。<br />
そしてll.width = ll_weight。<br />
こうするとレイアウトがきれいに揃った。<br />
Gravityはレイアウトファイルのほうでやっておいてね。<br />
<br />
レイアウトファイルでテーブルレイアウトをweightを持たせたLinearLayoutを入れておいたほうがいいと思った。idとか内部で動的に作るよりは静的に用意しておいたほうがいいよね。レイアウトファイルを切り替えるだけで事足りるし。永続データとしてどこに何が入っていたかを保存しておくだけでいいし。<br />
<br />
以下、コード。変数名は適宜解釈してください。<br />
LinearLayoutをIdから見つけてきてますが、childAtとかでinstanceof LinearLayout とかするのがめんどうだからやってるだけです。なので、できれば静的なIdを予め持たせたレイアウトファイルを作ると何かと楽だと思います。<br />
<br />
<script class="brush: java" type="syntaxhighlighter"><![CDATA[
@Override
public void onClick(View v) {
View lancheritem = getActivity().getLayoutInflater().inflate(R.layout.lancher_view, null);
LinearLayout ll = (LinearLayout) lancheritem.findViewById(R.id.area_lancher_view);
TableRow.LayoutParams param = new TableRow.LayoutParams(
TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT);
int width_size = 0;
param.width = width_size;
param.weight = 1.0f;
ll.setLayoutParams(param);
TableRow tr = (TableRow) mTableLayout.findViewById(mUseRowId);
int tr_chidcount = tr.getChildCount();
int tr_weightsum = (int)tr.getWeightSum()-1;
if(tr_chidcount < (tr_weightsum-1)){
tr.addView(lancheritem);
}else{
TableRow newrow = (TableRow)getActivity().getLayoutInflater().inflate(R.layout.row_page3_tablerow,null);
newrow.setId(++mRowId);
mUseRowId = mRowId;
mTableLayout.addView(newrow);
tr.addView(lancheritem);
}
}
]]></script>Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-82313368880037633252014-03-13T04:04:00.000+09:002014-03-13T04:04:02.356+09:00既存のホームアプリを参考にいじってみたそんなわけでばりばりホームアプリを作っています。<br />
<br />
機能としては、<br />
壁紙を一枚どーんと貼るのか、スクリーンごとに貼るのか、ドックは別にするのかとかそんな感じのが一つ。<br />
それとドラッグイベントの汎用化。<br />
<br />
で、スクリーンにアイコンとかいれるところを作ってます。<br />
ここまでできればとりあえず形になるので公開できそうなのでがんばってます。<br />
<br />
スクリーンのレイアウトは十人十色。<br />
縦画面ならX行でY列なんてところです。ウィジェットにも関係してきます。<br />
いろいろいじるよね。タッチしやすいとかしにくいとかあるし。<br />
4×4とか4×3とか4×5とか。はたまた5×4とか。<br />
人によって千差万別なので動的に変更できるように作ります。<br />
<br />
アプリのランチャーアイコンはガイドラインだと48dpいっぱいに作ることになっている。<br />
アイコンのスタイルとしてラベルがあってもなくても48dpが個人的にはちょうどいい。<br />
ラベルをいれると全体の大きさが48dpをどうしても超えてしまう。<br />
そんなわけでラベル込みならランチャーアイコンは36dpくらいにすることにした。<br />
<br />
ランチャーアイコン同士の余白はできるなら8dpとりたい。<br />
<br />
既存のアプリはどうなってんだろうねと思ったので、適当にダウンロード数が多いものをダウンロードしてみた。<br />
<br />
無理難題のレイアウト構成にできるようなのでやってみた。<br />
列を10とかやってみた。<br />
ランチャーアイコンがアルミ缶のスクラップみたいな状態になって表示された。<br />
ですよねー。<br />
列を2とかやってみた。<br />
アイコンをドラッグしてグループ化しようと思っても互いに交差するだけでできなかった。<br />
なるほどねー。<br />
<br />
んー勉強になる。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-13283652843753726662014-03-08T04:53:00.001+09:002014-03-08T04:53:56.577+09:00消毒だーモチベーションを上げようということでスマホを初期化した。<br />
不便だわー。まじ不便だわー。<br />
アプリ作る気になりました。<br />
<br />
初期化する前にやったことはひとつだけ。<br />
電話帳のバックアップ。<br />
SDカードに電話帳を一旦エクスポートして、初期化が完了したらインポートする形式をとった。<br />
おそらく機種依存のやり方だと思います。<br />
スマホはSHARP製のisw16sh。やり方はSHARPのページにあったよ。<br />
さくさくと初期化と電話帳の読み込みが終わった。<br />
アカウントの関連付けも済ませた。ウィルスソフトも入れた。<br />
<br />
それではデバッグ機になっていただこう。<br />
まずはパソコン側にスマホをデータストレージとして読み込ませる製品用のドライバをあてる。<br />
んで、デバック機として使うためのadbドライバをあてる。<br />
これでパソコン側でやることは終了。<br />
次にスマホ。<br />
『設定』から『開発者向けオプション』に進み、『USBデバッグ』にチェック。<br />
同設定から『ロックとセキュリティ』で『提供元不明のアプリ』にチェック。<br />
これで立派なデバッグ機です。<br />
<br />
さて、何から作ろうかとぺたぺたといじること小一時間。<br />
ホームアプリつくろう。<br />
<br />
webで調べ始める。<br />
SDKのサンプルにホームアプリがあるとのこと。<br />
では早速eclipseにインポート。<br />
で、実機にいれてみる。<br />
機種依存のデフォルトの壁紙が表示されて右下にアプリのランチャーがあるような画面だ。<br />
へーとか思いながらソースを見てみる。<br />
なんか4クラスもある。めんどくさ。<br />
webで簡単なサンプルがないか探し始める。<br />
・・・なかった。というかSDKのサンプルがおすすめされている。<br />
んー読むしかないか。<br />
<br />
で読んでみたのだが、よくわからない点がひとつあった。<br />
home.javaにあるfavariteというフィールドをつかったメソッドの役割だ。<br />
favariteというxmlを生成している。なぜに?<br />
<br />
勝手な予想で、ホームアプリは起動モードがHOMEならいいんだろー楽勝とか思ってました。<br />
明日から本気出す。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-57480159088666186792014-03-06T23:12:00.000+09:002014-03-06T23:33:10.836+09:00IT業界に就職しようとしてる人に捧げるAndroidStudioについて検索していたらとある人のブログに行き着いた。<br />
<br />
その中で気になるエントリーがあった。<br />
とある業界サイトで掲載された記事についての個人的な見解について述べられていた。<br />
要旨としては「『昔は一攫千金するためにプログラマーになりたかった』という記事があったが、私はそうは思わない。ただ興味をもっておもしろいという快感があったからこの業界に入った」というものだ。<br />
<br />
以下、個人的な見解です。<br />
私もそう思う。ただ興味があってこいつはおもしろいねという考えでこの業界に入った。<br />
一攫千金とか頭にないですはい。<br />
一攫千金を狙って入ったという人は果たしてどれくらいいるのだろうか。<br />
仮に一攫千金を狙った人が入ったとしてそのプロジェクトはスタートできるのだろうか。<br />
もちろん会社の運営に関しての費用とか見積もりとかできてるんだよね。<br />
なければそのプロジェクトはできない。<br />
<br />
まず、会社とは運営するものである。<br />
運営にかかる費用、つまり人件費や電気代、月ごとの利益、借りているオフィスであれば賃料もつく、平たく言えばその会社が存続可能な金額が必要である。<br />
ここが出せないとそのプロジェクトはスタートできない。<br />
おもしろいかおもしろくないかその前に、会社としてやっていけるかどうかがまず第一です。<br />
企業の大中小に関わらず、これは絶対条件です。<br />
揚げられるならば、人数、期間、その後の展望など揚げられると具体性が増します。<br />
が、実績のない人の言葉には信頼を寄せることができません。<br />
聞かれたら答えるくらいのスタンスでいいでしょう。<br />
自分から切り出すのは時間の無駄です。与えられた時間内で何を出すのかよく考えましょう。<br />
実績もなく信頼も寄せることができない人が時間を与えられたのです。<br />
大事に使いましょう。<br />
<br />
次に、利益は作るものではなく、入ってくるものです。<br />
より良い運営というのは自動的にお金が入ってくるルートを開拓することです。<br />
これを実行する手段はいろいろあります。<br />
例えばBtoBでプロジェクトを3ヶ月のものを受け取り、作る。<br />
規模は自社から2人で、売り上げ予想は1人月100万として2人だから200万*3。<br />
これで会社にかかる固定費+若干の利益(貯蓄含む)が得られます。<br />
でも、プロジェクト自体は3ヶ月で終わりです。<br />
では自動で入ってくるルートを作るにはどうしたらいいか。<br />
メンテを請け負う。これもありですが、この厳しいご時勢ではなかなかありません。<br />
困ったね。<br />
これではやっていけない。<br />
どうするかというと、プロジェクトが終わった人にまたプロジェクトをやってもらう。<br />
自転車操業のような形になりますが、これは人の成長によりお金が入ることを意味しています。<br />
とある分野についてやったことがあるというのは大変喜ばれます。<br />
なぜでしょうか。知っていれば予め課題としてあげることでスムーズな進行が期待されているからです。<br />
利益もあがるし、やった人は成長するし、経験した分野の知識も会社に持って帰れる。<br />
こうして少しずつ知識やノウハウを学び、実績という形で会社へ貢献を続けます。<br />
<br />
では1年後はどうしましょうか。実績も積んだし、会社にも少しお金が貯まってきた。<br />
じゃあ、プロジェクトを提案しようと考えた人は甘い。<br />
ボーナスとかもあるよね。他の人ももらえたらうれしいよね。<br />
こうして貯金はボーナスという形で消化されます。<br />
もしくは給料の上昇、あるいは一時手当て。<br />
<br />
じゃあ、いつ提案できるの?というのは経営者が聞いてきたときだけです。<br />
会社は経営者のものです。利益も全て経営者のものです。<br />
きれいごとを並べる会社や企業も多いけど、社員に還元することで会社としての方針は経営者が常に握っています。<br />
そして経営者は労働者にアドバイスを求めません。<br />
経営者は常に時代からアドバイスを求めます。<br />
経営者がアドバイスを求めてきたら、提案の前に今こういうジャンルがいいんですよーと前置きをおいた上でこんなのどうですかとごり押しましょう。提案は棄却されますけどね。<br />
<br />
いつまでたってもできないじゃん。と考えた人は正解。<br />
やりたいことなんていつまでたってもできません。<br />
できることは会社の方針に沿うことができるプロジェクトのみです。<br />
だから、たとえ経営者から聞かれたとしても自分のやりたいことではなく、会社の方針に沿った、利益をより長く見込めるものを揚げるのがベターでしょう。他の分野でも使えるような部分があれば尚良しです。<br />
だから、過去にあったプロジェクトをモデルケースとした提案を用意しておくのがベターです。<br />
会社の成果物を手に取ることができたら、まずはやってみましょう。<br />
受け取りたいのは着眼点です。プロジェクトをこうしようとかあーしようとかいうものではありません。<br />
再利用可能な着眼点が欲しいのです。<br />
<br />
そんな日本だからどんどんガラパゴス化するんだけどね。<br />
労働者になる教育しかしないから経営が育たない。<br />
自分でやるより、事を成すのにはどうしたらいいのかなんてものを人生を通して教育しない。<br />
振り返ってみれば日本が時代を作ったものなんてあっただろうか。<br />
一つとしてない。<br />
TwitterもMicroSoftもFacebookも会社として成る前に、アマチュアでも何でも経営経験があった。<br />
こうした動きは日本でもある。もちろん知っている。だが、ほんとにごく少数だ。学校を巻き込んでのムーブメントを起こす、起こさせるものではない。あくまで「遊び」の延長でしかないのが現状だ。<br />
アイディアはとてもいいのにそれを運営できない。より多くの地域を巻き込めない。難しさがそこにはあるからだろう。有料、無料というのもあると思う。便利であるという実績を作れていないのが致命的だ。<br />
<br />
UNIQLOとかTOYOTAとかはお金ありきだから、社会に広がるようなイノベーションは起こせていない。安くて機能的な服や、ecoな車というのは時代にキーワードとして存在するから利益が上がった。しかし、人々を熱中させる革命的なものではない。そして時代に沿うものだから時代が必要としなくなったら廃れる。現に車という業界は前ほどの革新性は出せない。物の寿命というサイクルの中で利益を出すことはできるが、イノベーションという点ではさっぱりといっても良い。<br />
<br />
一方、TwitterやMicorsoftやFacebookはどうだろうか。<br />
陰りは見えるものの、常に何かを出している。記憶に新しいのはツールとして出てきたLineだが、セキュリティや若年層での刑事事件の誘発が危なすぎる。Facebookもこれと同じ落とし穴に入っている。インターネットでの閉鎖的な社会が築かれてしまったのが問題だろう。手軽さが売りのTwitterには及ぶべくもない。Microsoftもいろいろ出してるけど、ヒットしない。普及にともない需要が減った、求められている機能が煮詰まってきたからだろう。情報を提示しそれを享受するというのが共通のモデルだが、その情報の入り方出方、使い方に違いが見受けられる。<br />
<br />
閉塞的な時代だけど、次は何がヒットするんだろうか。<br />
私は技術的な革新よりも、その前段階として『時間の使い方』を変える、変えさせるツールがヒットするんじゃないだろうかと考えている。Twitterはそういった要素も持っているからしばらくは伸び続けるだろう。できるだけ短い時間で、かつ自分が何かアクションを起こさなくてもやってくれているもの。<br />
<br />
これが現代が求めているものです。ある行動にかける時間が減れば、その分時間は空くよね。<br />
その時に、人は何をするのか。これがネクストムーブメントになるんだろうな。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-27006885004729872082014-03-06T21:27:00.003+09:002014-03-06T21:40:01.589+09:00AndroidStudioの導入までやってみようてきな何か<div>
というわけで新規のマシーンにAndroidStudioいれてみよう。</div>
<div>
21:00</div>
AndroidStudioをhttp://developer.android.com/sdk/installing/studio.html#Updatingからダウンロード。終わったら展開。<br />
<div>
21:06</div>
<div>
展開完了。起動。JDKがないよと怒られた。</div>
<div>
じゃあいれよう。http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html</div>
<div>
64bitマシーンだけど32bit版のJDKを入れる。64bitで競合とかあるといやだしね。</div>
<div>
x84とかついてるのをいれる。これが32bit版。</div>
<div>
システムの環境変数にjavaのbinのある場所を追加する。</div>
<div>
AndroidStudioを32bit版で起動。</div>
<div>
起動すると『豆芝』が言いそうなTIPSが表示された。さらっと見て閉じる。</div>
<div>
<br /></div>
<div>
21:27</div>
<div>
とりあえず開発自体はできるようだ。</div>
<div>
しかしこのUI見慣れないなー。</div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-77110559477516362192014-03-06T20:44:00.002+09:002014-03-06T20:55:49.087+09:00新規のマシーンにandroid開発環境いれてみたマシーンが新しくなったのでandroidの開発環境を新規に構築しました。<br />
<br />
今回作った環境はwindows7 64bit homepremiumでeclipse4.3です。<br />
<br />
以下手順です。<br />
eclipseはpleiadesからeclipse4.3FullEditionをダウンロード。<br />
適当なフォルダに展開。<br />
<br />
完了までの時間が長いのでSDKをダウンロードしにいきます。<br />
SDKを公式Android Developerサイト(http://developer.android.com/sdk/index.html)内の項目『USE AN EXISTING IDE』から『Download the SDK Tools for Windows』をクリックしてダウンロード。<br />
適当なフォルダに展開。<br />
SDKが展開できたらウィンドウが開かれます。<br />
ここでこれから使っていくであろうAPIをダウンロードします。<br />
『Tools』と『Extras』、そして『Android4.0』から最新のもの(現時点では『Android4.4.2』)にチェックをいれてインストール。<br />
<br />
これも完了までが長いのでeclipseのプラグインとして使うADTのアドレスを調べにいきます。<br />
公式Android Developerサイト内http://developer.android.com/sdk/installing/installing-adt.htmlにアドレスが書いてあります。<br />
アドレスは『https://dl-ssl.google.com/android/eclipse/』。さらにページを読むと、だめだったら「https」じゃなくて「http」にしてみてねと書かれてあります。他にもzipで配布してるようです。<br />
<br />
eclipseの展開は終わったでしょうか。<br />
eclipseの展開が終わったらさっそく起動。<br />
今回はeclipseの紫のアイコンから起動します。<br />
<br />
eclipseが立ち上がったら上部にある項目の『ヘルプ』から『新規ソフトウェアのインストール』をクリック。<br />
表示されたウィンドウの右上部にある『追加』をクリック。<br />
先ほど調べたADTのアドレスをいれましょう。名前はADTとか見てわかるものにしましょう。<br />
<br />
『OK』をクリックするとeclipseが使えるプラグインを探しにいきます。<br />
『開発ツール』ともう1件表示されます。<br />
『開発ツール』だけにチェックをいれてダウンロードしましょう。<br />
途中でwindowsがこいつらいれていいのかい?と聞いてくるので容赦なくOKを押します。<br />
プラグインのインストールが終わったら再起動しますか?とeclipseが聞いてくるので今はキャンセル。<br />
<br />
SDKのインストールなどは終わったでしょうか。<br />
入らないものもあるのでそれはそれでいいです。たとえばIntelのイメージファイルとかは使用しているCPUに応じてインストールできたりできなかったりします。私はAMDなのでこいつらは入りません。<br />
<br />
SDKのAPIのインストールが終わったらeclipseもSDKも閉じましょう。<br />
そしてeclipseをクリーンコマンドで起動します。<br />
『eclipse.exe -clean.cmd』というのが先ほどeclipseを起動したフォルダ内にあるのでそちらから起動します。新しいプラグインなどを入れた場合はこのクリーンコマンドで起動したほうがいいでしょう。<br />
<br />
もしもSDKマネージャーなどがメニューに表示されていない場合は表示しておきましょう。<br />
メニューの『ウィンドウ』から『パースペクティブのカスタマイズ』をクリック。<br />
表示されたウィンドウ内のタブの『ショートカット』の『サブメニュー』で『新規』が選択されている状態で、『ショートカット・カテゴリー』から『Android』の項目をチェックしてOKをクリック。<br />
表示されなかったら、eclipseをクリーンコマンドで起動してください。<br />
<br />
これでとりあえず開発はできます。<br />
だいたい完了までの所要時間は30分くらいかな。<br />
日々、使用しているプラグインやSDK内のAPIのアップデートを確認しましょう。<br />
プラグインの更新はメニューバーのヘルプ内にあります。<br />
SDK内のAPIのアップデートはSDKマネージャからできます。<br />
<br />
さぁ、次はわけわかめのAndroidStudioだ。。。<br />
<br />
蛇足です。<br />
今時のMainAcitivityはFragmentからスタートなのね。<br />
同一クラスってのは個人的にもにょるなー。<br />
ActivityとFragmentは別物っていう意識付けとかそういう作り方しましょうねみたいなガイドライン作ったほうがいいんじゃないだろうか。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-64708976987865596032014-02-09T00:58:00.001+09:002014-02-09T00:58:53.525+09:00おれはやりたいことをやるぞジョジョー!時間がとれるようになりました。<br />
あけましておめでとうございます(遅<br />
<br />
textureviewのほうはだいぶ間が空いてしまった。<br />
すっかり忘れてしまったよ。。。<br />
<br />
とりあえず直近でやりたことを箇条書き。<br />
・eclipseのプロジェクトの整理<br />
・contentproviderを使用したプロジェクトのアップ<br />
・contentporviderを外部アプリから読み取るプロジェクトのアップ<br />
・twitterを使ったTODOリストの検討<br />
・twitter4Jを使ったテストアプリの作成<br />
・第12回MMD杯予選の動画を見る(待て<br />
・Evernoteの内容をブログやtwitterに反映するかどうか検討<br />
・AndroidStudioの導入<br />
<br />
やりたいことが多いな(汗<br />
<br />
twitter4Jのアプリをgithubにあげちゃうとキーが丸分かりだからアップはしない方がいいかな。。。他の人はどうやって管理してるんだろ??stringsの内容だけignoreするのかな?キーがわかれば実質乗っ取りみたいなことできちゃうよね。<br />
<br />
textureviewのほうはopenGLES2.0以上の体系的な勉強をしたほうがいいかもしれない。参考になるサイトやらなんやら探しなおす。でもこれはやりたいことが終わってからかな。<br />
<br />
AndroidStudioだとライブラリの自動更新ができるようなので試してみたい。Maven?というものを使うそうだけど、よくわかってないので調べながらだな。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-2042996400248612402013-11-20T17:26:00.004+09:002013-11-20T18:20:04.509+09:00GE2ストーリー攻略記念かきこたまにはあらぬほうに走ってもいいじゃないですかー<br />
<br />
というわけで全部攻略した。<br />
<br />
【近接編】<br />
出てくるボスに対して武器種を選ぶ感じ。基本は獣剣でホールド。<br />
・ロングのクロガネ系(BA:ゼロスタンス/対象MOB:何でも)<br />
・バスターのクロガネ系(BA:C.C系/対象MOB:ウロヴォロス系、ヴィーナス)<br />
・ハンマー系(BA:ブーストラッシュ系/対象MOB:カムラン系、クアドリガ系、まれにグボ系)<br />
・獣剣 陽→ホールド付(BA:□ボタン4段系/対象MOB:上記ハンマー系以外の大概のMOB)<br />
・ショートのクロガネ系(BA:何でも/対象MOB:零号神機兵)<br />
<br />
寸評:攻撃するだけならクロガネ系だけで十二分。スピアだけはスタイルに合わなかった。<br />
<br />
【銃形態】<br />
長くなりそうなので一番下に書く<br />
<br />
【防具】<br />
状況に応じて盾のスキルを使い分ける。特に必要がないと感じたらオウガテイル盾。<br />
・オウガテイルの盾(スキル:アイテム効果↑)<br />
・イェン・ツィーのバックラー(スキル:隠密集団スキル)<br />
・ラーヴァナの盾(スキル:節約)<br />
<br />
寸評:タワーの出番がなかった。隠密集団スキルまじ便利。<br />
<br />
【制御ユニット】<br />
・ソルジャー(序盤攻略)<br />
・ディフェンダー(序盤・中盤攻略)<br />
・アノマロ(ホールド中と併せて)<br />
・スラッシャー(イケイケの時)<br />
<br />
寸評:ディフェンダーがとても優秀だった。アノマロはホールド武器と組み合わせると吉。<br />
<br />
【強化パーツ】<br />
・弾受け渡しバースト化(メリット:任意でバースト可能)<br />
・スタミナ強化(メリット:スタミナの減りが激しいから)<br />
・近接強化A(メリット:コンボマスター付与)<br />
・調合キットA(メリット:オウガテイル盾を持っていけない時)<br />
・体力強化A(メリット:体力増強剤を買えない時)<br />
<br />
寸評:弾受け渡しでの任意のバースト化が非常に便利。<br />
<br />
【リンクサポートデバイス】<br />
・被ダメ↓5~10<br />
<br />
寸評:NPCの被ダメ↓2~5と自分の被ダメ↓5~10の組み合わせはガチ。<br />
<br />
【連れてくNPC】<br />
・キグルミ・・・言葉がいらないほど優秀。リンクバースト多目。回復弾まで撃ってくれる。<br />
・ナナ・・・タフ。銃をあまり使わない。ハンマーを使う時に併せて連れて行く。回復が速い。<br />
・シエル・・・正確な射撃が魅力。MOBのHPの状態がわかる。リンクバースト多目。回復が遅い。<br />
・ギルバート・・・戦場では空気。攻撃力上昇スキルが魅力。回復が遅い。<br />
・コウタ・・・ウロヴォロスのときに連れて行く。MOBのヘイト稼ぎで有能。<br />
・エミール・・・ハンマーで騎士道が必要な時に連れて行く。<br />
・カノン・・・撃たれたい時に連れて行く。<br />
※他の人はそれほど実感が湧くほど連れて行ってない<br />
<br />
寸評:NPCの特性を掴んだ上でのメンバー選択が大事。キグルミが最強。<br />
<br />
ここから銃形態編。<br />
先に寸評を示す。<br />
攻略だけに限ればクロガネのブラストで十二分。<br />
2周目はスナイパーやアサルト、ショットガンを使ってみたい。<br />
レーザーの出番がない。というか必要性を感じなかった。<br />
<br />
アサルトだとドローバックで任意で後退できるのが魅力。<br />
スピアを選ぶと銃の如何に関わらず任意で後退が可能なのでおもしろそうだと思う。<br />
<br />
というわけで持ってく弾の内容。ブラストでしか作ってません。<br />
<br />
・モグラ<br />
用途:捕食しに行ったMOBを釣れる<br />
寸評:優秀。まれに当たらないことがあるので立ち位置を変えてみる。<br />
op:14<br />
【ボタンを押したら】S装飾弾丸:直進/極短【垂直-90】<br />
□【1が地形に衝突時】S装飾弾丸:直進/短【垂直+65】<br />
□□【2の自然消滅時】M制御:敵の方を向く/生存時間普通【】<br />
□□□【3の自然消滅時】S装飾レーザー:直進/長【】<br />
□□□□【4が何かに衝突時】S弾丸:直進/極短【】<br />
<br />
・集中<br />
用途:貫通属性の弾を撃ちたい時<br />
寸評:あれば安心。もっと短時間で高威力なものを作りたい。<br />
op:33<br />
【ボタンを押したら】S弾丸:直進/短【】<br />
□【1が敵に衝突時】M球:敵に貼りつく/生存時間短【BB充填】<br />
□□【2の発生から0.2秒】M弾丸:直進/極短【BB減衰緩和】<br />
□□【2の発生から0.5秒】M弾丸:直進/極短【BB減衰緩和】<br />
□□【2の発生から1秒】M弾丸:直進/極短【BB減衰緩和】<br />
□□【2の自然消滅時】M弾丸:直進/極短【BB減衰緩和】<br />
<br />
・落下傘<br />
用途:上空からの撃ち落し用<br />
寸評:あれば安心。もっと短時間で高威力なものを作りたい。<br />
op:57<br />
【ボタンを押したら】S装飾弾丸:直進/短【垂直+76】<br />
□【1の自然消滅時】M制御:敵の方を向く/生存時間短【垂直-100】<br />
□□【2の発生から0.2秒】L弾丸:強ホーミング/全方向【BB抗重力弾】<br />
□□□【3が敵に衝突時】M球:敵に貼りつく/生存時間短【BB充填】<br />
□□□□【4の発生から0.2秒】M弾丸:直進/極短【BB減衰緩和】<br />
□□□□□【5が敵に衝突時】M弾丸:直進/極短【BB減衰緩和】<br />
□□□□【4の発生から0.5秒】M弾丸:直進/極短【BB減衰緩和】<br />
□□□□【4の発生から1秒】M弾丸:直進/極短【BB減衰緩和】<br />
<br />
・くっつきBOMB<br />
用途:破砕が必要な時<br />
寸評:あれば安心。破砕ダメージの安定化。改良の余地あり。<br />
op:99<br />
【ボタンを押したら】S弾丸:直進/短【】<br />
□【1が敵に衝突時】M爆発:爆発/通常【BB減衰緩和】<br />
□【1が敵に衝突時】M制御:その場で停止/生存時間短【】<br />
□□【3の発生から0.2秒】M球:敵に貼りつく/生存時間短【】<br />
□□□【4が敵に衝突時】M爆発:爆発/通常【BB減衰緩和】<br />
□□□【4が敵に衝突時】M制御:その場で停止/生存時間短【】<br />
□□□□【6の発生から0.2秒】M球:敵に貼りつく/生存時間短【】<br />
□□□□□【7が敵に衝突時】M爆発/爆発/通常【BB減衰緩和】<br />
<br />
・384<br />
用途:MOBの体力をごっそり削りたい時<br />
寸評:装飾レーザーで爆発の「発生点」を少し前に出してるイメージだが合っているか不明。<br />
op:384<br />
【ボタンを押したら】S弾丸:直進/短【】<br />
□【1が敵に衝突時】M球:敵に貼りつく/生存時間極長【BB充填】<br />
□□【2の自然消滅時】S装飾レーザー:直進/極短【】<br />
□□□【3と同時に】LL爆発:爆発/通常【BB減衰緩和】<br />
□□□【3と同時に】LL爆発:爆発/通常【BB減衰緩和】Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-66764448218833879332013-11-07T14:36:00.003+09:002013-11-07T16:26:08.211+09:00javaで{}で括られたステートメントってなぁに?TextureViewで参考にしてるコードで{}で括られてるステートメントを見かけました。<br />
<br />
はて?これってなんだろうね。<br />
<br />
if文とかwhileとかclassとかmethodとかって{}で括られてるのはよく見ますね。<br />
でもコード中に単体で{}で括られてるのってあんまり見たことがなかった。<br />
<br />
で、調べました。<br />
これはブロックステートメントというものです。<br />
コンパイル単位で見た場合、このブロックステートメントを使うと一つの処理単位として見なすそうです。<br />
<br />
私見ですが、アトミックということなのかな?<br />
<br />
最初は慣れなかったけど、なるほどこれを使うとどこからどこまでが1単位なのかわかりますね。<br />
無名クラスならぬ無名メソッドみたいな感じかな。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-17602498505156679412013-11-06T17:22:00.001+09:002013-11-06T17:30:12.736+09:004.4のテーマが変わったづらーっと4.4の変更点を眺めました。<br />
<a href="http://developer.android.com/about/versions/kitkat.html">sdkにあるkitkatの紹介文</a><span id="goog_1215581333"></span><span id="goog_1215581334"></span><a href="http://www.blogger.com/"></a><br />
<br />
タイトルの内容に触れる前に個人的に注目した内容を簡単にご紹介。<br />
<br />
注目したのは、<br />
『Translucent system UI styling』<br />
『Audio monitoring』<br />
<br />
『Translucent system UI styling』は呼んで字の如し、<br />
statusbarが透明になったよ、とのこと。<br />
これはきれい。画像を見ると、statusbarにあるアイテムの色は白で表現されてますね。<br />
機械色な感じが払拭されましたね。<br />
<br />
『Audio monitoring』。これが個人的にはいいなーと感じました。<br />
画像を見ていただけるとよくわかると思いますが、<br />
イコイライザ(音の波形をグラフ化したもの)が表示されています。<br />
今までもイコイライザの機能はありました。<br />
が、見た目がちょっとアレだったので結局自作ということになっていました。<br />
しかし、今回のイコイライザはきれいですねー。このまま使えそうです。<br />
<br />
では、冒頭のタイトルに戻りましょう。<br />
そうなんです。テーマが変わりました。<br />
特にセレクターについては押さえておいたほうがいいでしょう。<br />
今までは青(ライトブルー)でした。<br />
今回からは黒白調になりました。<br />
青だと他のアプリの色と競合しやすいからやめますねということらしい。<br />
<strike>ソースはどっかで見かけたはずだけど、今手元にないのでとりあえずここまで。</strike><br />
<strike>探しておきますね。</strike><br />
ありました。<br />
google+のAndroid Development - Japan(日本の Android 開発者のための公式コミュニティです)の中で、<br />
<br />
"Android Design in Action: New in Android 4.4" の概要を 日本語でまとめました。<br />
というコメント?(記事?)があります。<br />
<a href="http://ryosuke-memo.blogspot.jp/2013/11/android-design-in-action-new-in-android.html">リンク</a><br />
この中で解説されています。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0tag:blogger.com,1999:blog-3034001357240674810.post-68587809404411212012013-11-03T14:10:00.001+09:002013-11-03T14:10:49.586+09:00勉強中なうTextureViewを扱うのに色々と勉強しています。<br />
<br />
以下、参考にしているサイト様<br />
<br />
・eaglesakuraの技術ブログ<br />
<a href="http://eaglesakura.hatenablog.com/entry/2013/03/06/102720">-SurfaceTextureでMediaPlayerやカメラ映像をOpenGLテクスチャとして使う場合の注意点</a><br />
<a href="http://eaglesakura.hatenablog.com/entry/2013/02/24/230128">-GLTextureViewを公開しました</a><br />
<br />
・dalinaum / TextureViewDemo<br />
<a href="https://play.google.com/store/apps/details?id=kr.gdg.android.textureview&hl=ja">-googleplay</a><br />
<a href="https://github.com/dalinaum/TextureViewDemo/blob/master/src/kr/gdg/android/textureview/GLTriangleActivity.java">-github</a><br />
<br />
・SDKにある4.0のTextureViewと4.4にあるTextureView<br />
・SDKにある4.0のGLSurfaceView<br />
<br />
目指してる仕様<br />
イベントがあった時にrunnableをぽんぽん投げ込んで処理する。<br />
<br />
課題<br />
回転などでViewが破棄されるときの処理。<br />
onPause時の処理。たぶんwait,notifyでなんとかなりそう。<br />
AcivityなりFragmentが終了するときの処理。Anonymoushttp://www.blogger.com/profile/09342073960663849700noreply@blogger.com0