has("tab_size") や get("tab_size") のように引数を指定すると値が取得できました。
プラグイン作成の練習に作った、現在カーソルがある行の文字数を表示するスクリプト(ダウンロード)で使ってみました(タブを tab_size 分の文字数としてカウントする場合の計算のため)。スクリプト作るのなかなか面白いです。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>name</key> <string>CommentCommandToQuoteInText</string> <key>scope</key> <string>text</string> <key>settings</key> <dict> <key>shellVariables</key> <array> <dict> <key>name</key> <string>TM_COMMENT_START</string> <key>value</key> <string>> </string> </dict> </array> </dict> </dict> </plist>
window = self.view.window() output_panel = window.create_output_panel("WindowName") window.run_command("show_panel", {"panel":"output.WindowName"}) output_panel.insert(edit, output_view.size(), "Hello, Output")
window.run_command("show_panel", {"panel":"console"}) print("Hello, Console")
C:\Program Files\Sublime Text 3\Packages
{ "shell_cmd": "python -u \"$file\"", "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "windows": { "encoding": "cp932", // Windowsコンソールの文字コード指定 "path": "C:/Python27" // 自分のPythonへのパスを追記 } }
mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { Log.i(LOGTAG, "onConnected"); } @Override public void onConnectionSuspended(int i) { Log.i(LOGTAG, "onConnectionSuspended:" + i); } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.i(LOGTAG, "onConnectionFailed:" + connectionResult.toString()); if(connectionResult.hasResolution()) { try { // 初回起動時などで未認証の場合などはこちらにきます connectionResult.startResolutionForResult(MainActivity.this, GOOGLE_API_CLIENT_RESOLUTION); } catch (Exception e) { Log.e(LOGTAG, e.toString()); } } else{ Log.e(LOGTAG, "hasNoResolution()"); int errorCode = connectionResult.getErrorCode(); Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode, MainActivity.this, GOOGLE_API_CLIENT_ERROR); if( dialog != null){ dialog.show(); } else { Log.e(LOGTAG, "no dialog"); } } } }) .addApi(Drive.API).addScope(Drive.SCOPE_FILE) .build(); mGoogleApiClient.connect();startResolutionForResult で OK が返ってきた時に再接続を試みるために onActivityResult に以下のようなコードを書き加えておきます。
if(requestCode == GOOGLE_API_CLIENT_RESOLUTION){ switch (resultCode) { case Activity.RESULT_OK: mGoogleApiClient.connect(); break; default: Log.e(LOGTAG, "" + resultCode); } }
ResultCallback<DriveApi.DriveContentsResult> newDriveContentsCallback = new ResultCallback<DriveApi.DriveContentsResult>() { @Override public void onResult(DriveApi.DriveContentsResult result) { // MimeType は適宜変更する。他にも必要な項目があれば set 関数で set する。 // setTitle で初期タイトルくらいは決めてあげると良さそう MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() .setMimeType("text/plain").build(); DriveContents contents = result.getDriveContents(); // OutputStream を取得して初期データを書き込む。例として、適当な文字列を書き込む。 try { OutputStream os = contents.getOutputStream(); String hello = "Hello World!"; os.write(hello.getBytes()); os.close(); } catch (Exception e){ Log.e(LOGTAG, e.toString()); } // デフォルトで用意された UI を表示 IntentSender intentSender = Drive.DriveApi .newCreateFileActivityBuilder() .setInitialMetadata(metadataChangeSet) .setInitialDriveContents(contents) .build(mGoogleApiClient); try { startIntentSenderForResult( intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0); } catch (IntentSender.SendIntentException e) { Log.w(LOGTAG, "Unable to send intent", e); } } }; Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(newDriveContentsCallback);
if(requestCode == REQUEST_CODE_CREATOR){ Log.i(LOGTAG,"REQUEST_CODE_CREATOR:" + resultCode); if(resultCode == RESULT_OK) { DriveId driveId = data.getParcelableExtra(CreateFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); Log.i(LOGTAG, "Drive Id:" + driveId.toString()); } }
// MimeType でフィルタリングされる IntentSender intentSender = Drive.DriveApi .newOpenFileActivityBuilder() .setMimeType(new String[] { "text/plain" }) .build(mGoogleApiClient); try { startIntentSenderForResult( intentSender, REQUEST_CODE_OPENER, null, 0, 0, 0); } catch (IntentSender.SendIntentException e) { Log.w(LOGTAG, "Unable to send intent", e); }
if(requestCode == REQUEST_CODE_OPENER){ if(resultCode == RESULT_OK){ DriveId driveId = data.getParcelableExtra( OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); // 取得した driveId からファイルの内容を取得。 // プログレスを取得して何か行う場合は file.open の第三引数にリスナーを設定する。 DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, driveId); file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() { @Override public void onResult(DriveApi.DriveContentsResult driveContentsResult) { if(driveContentsResult.getStatus().isSuccess()){ DriveContents driveContents = driveContentsResult.getDriveContents(); // DriveContents の getInputStream で内容を取得する。 // 以下はファイルの内容がテキストであることを想定した例。 BufferedReader reader = new BufferedReader( new InputStreamReader(driveContents.getInputStream())); StringBuilder builder = new StringBuilder(); String contents = null; String line; try { while ((line = reader.readLine()) != null) { builder.append(line); } contents = builder.toString(); } catch (IOException e) { Log.e(LOGTAG, "IOException while reading from the stream", e); } // 読み込むだけで内容に変更はなし。discard を呼んで閉じておく(意味は無いかも?) driveContents.discard(mGoogleApiClient); Toast.makeText(MainActivity.this, contents, Toast.LENGTH_LONG).show(); } } }); } }
"Old age is continuous series of losses."この一文の引用だけで若干憂鬱になりますが、いつかは死ぬ、immortal(不死)ではない人間として、どうやって最後の時を生きて、どうやって死を迎えようか、というちょっと重い本です。
"It just isn't home"
At home, you decide how you spend your time, how you share your space, and how you manage your possessions. Away from home, you don't.
What are your fears and what are your hopes? What are the trade-offs you are willing to make and not willing to make?
mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { Log.i(LOGTAG, "onConnected"); } @Override public void onConnectionSuspended(int i) { Log.w(LOGTAG, "onConnectionSuspended:" + i); } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.e(LOGTAG, "onConnectionFailed:" + connectionResult.toString()); if(connectionResult.hasResolution()) { try { connectionResult.startResolutionForResult(MainActivity.this, REQUEST_CODE_GOOGLE_API_CLIENT_RESOLUTION); } catch (Exception e) { Log.e(LOGTAG, e.toString()); } } else{ Log.e(LOGTAG, "hasNoResolution()"); int errorCode = connectionResult.getErrorCode(); Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode, MainActivity.this, REQUEST_CODE_GOOGLE_API_CLIENT_ERROR); if( dialog != null){ dialog.show(); } else { Log.e(LOGTAG, "no dialog"); } } } }) .addApi(Games.API).addScope(Games.SCOPE_GAMES) .addApi(Drive.API).addScope(Drive.SCOPE_APPFOLDER) .build(); mGoogleApiClient.connect();
人はアウトプットするときだけ、個たる「人」であり、それ以外は、「人々」でしかないという言葉がとても印象的でした。
<string name="best_score"><![CDATA[Score : %1$d<br/><b>Best Score !</b>]]></string>
mScoreTextView.setText(Html.fromHtml(getString(R.string.best_score, score)));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog) .setIcon(R.drawable.ic) .setMessage(R.string.dialog_msg); //The tricky part Dialog d = builder.create(); d.show(); int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(dividerId); divider.setBackgroundColor(getResources().getColor(R.color.my_color));
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="hello" translatable="false">hello</string>
(...) Demoralization caused by vast unemployment is our greatest extravagance. Morally, it is the greatest menace to our social order.この辺りは、現在における、退職された方の生きがいについての問題が広がる感じですね。
myDataGrid.ScrollIntoView(itemInRow);
myDataGrid.ScrollIntoView(myDataGrid.Items.GetItemAt(myDataGrid.Items.Count - 1));
myDataGrid.ScrollIntoView(CollectionView.NewItemPlaceholder);
if (mainDataGrid.Items.Count > 0) { var border = VisualTreeHelper.GetChild(mainDataGrid, 0) as Decorator; if (border != null) { var scroll = border.Child as ScrollViewer; if (scroll != null) scroll.ScrollToEnd(); } }
僕の書く本にしては珍しく、泥棒や強盗、殺し屋や超能力、恐ろしい犯人、特徴的な人物や奇妙な設定、そういったものがほとんど出てこない本になりました。ですから、普段の僕の本に抵抗がある人にも楽しんでもらいやすくなったのでは、そうであってほしい、と期待しています。とあったのですが、僕はどちらかといえばそういう本(『陽気なギャング』とか『マリアビートル』とか)は大好きなので、今回の本はちょっと物足りない感じも。
Class<?> numberPickerClass = null; try{ numberPickerClass = Class.forName("android.widget.NumberPicker"); } catch (ClassNotFoundException e) { Log.e(LOGTAG, e.toString()); } if(numberPickerClass != null){ java.lang.reflect.Field selectionDivider; try { selectionDivider = numberPickerClass.getDeclaredField("mSelectionDivider"); selectionDivider.setAccessible(true); Drawable drawable = getResources().getDrawable(R.drawable.numberpicker_selection_divider); selectionDivider.set(number_picker, drawable); } catch (NoSuchFieldException e) { Log.e(LOGTAG, e.toString()); } catch (IllegalAccessException e) { Log.e(LOGTAG, e.toString()); } }
tasks.withType(Compile) {
options.encoding = 'UTF-8'
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
__attribute__((naked)) void Wait10Cycles(void){ asm ( /* bl to here: [4] */ "nop \n\t" /* [1] */ "nop \n\t" /* [1] */ "nop \n\t" /* [1] */ "bx lr \n\t" /* [3] */ ); }
This attribute is available on the ARM, AVR, MCORE, MSP430, NDS32, RL78, RX and SPU ports. It allows the compiler to construct the requisite function declaration, while allowing the body of the function to be assembly code. The specified function will not have prologue/epilogue sequences generated by the compiler. Only Basic asm statements can safely be included in naked functions (see Basic Asm). While using Extended asm or a mixture of Basic asm and “C” code may appear to work, they cannot be depended upon to work reliably and are not supported.まとめると
#include "AQM0802A.h" #include "I2CMasterHelper.h" #include "PE_Types.h" #include "PE_Error.h" #include <stdio.h> #include <string.h> // co = 0 : Last Control byte to be sent. Only a stream of data bytes is allowed to follow. // co = 1 : Another Control byte will follow the data byte (unless a STOP condition is received) // rs = 0 : Send Command // rs = 1 : Send Data static byte ControlByte(bool co, bool rs){ return (co << 7) | (rs << 6); } static void SendCommand(byte cmd){ byte data[2]; data[0] = ControlByte(FALSE, FALSE); data[1] = cmd; I2CMasterHelper_SendBlock(data, 2, LDD_I2C_SEND_STOP); I2CMasterHelper_WaitSendComplete(); BusyWaitMS(1); } void AQM0802A_Init(){ // 0x0011_1000 : DL = 1 : 8bit-bus mode, N = 1 : 2-line display mode, DH = 0 : font size is 5 x 8, IS = 0 : normal instruction SendCommand(0x38); // IS = 1 SendCommand(0x39); // Internal OSC frequency : 1/4 bias SendCommand(0x14); // Contrast Set : 000 SendCommand(0x7f); // Power/ICON/Contrast control : ICON display off, Booster circuit on, contrast 10 SendCommand(0x56); // Follower control : follower circuit on, follower amplified ratio = 100 SendCommand(0x6C); // wait 200ms for power stable BusyWaitMS(200); SendCommand(0x38); // Display on, cursor off, cursor blink off SendCommand(0x0C); // Clear display SendCommand(0x01); // TODO: wait 1.08ms BusyWaitMS(2); } // first line address is 0x00 ~ 0x07 // second line address is 0x40 ~ 0x47 void AQM0802A_DisplayChr(byte addr, char ch){ // Test for now; byte data[4]; // Set Address data[0] = ControlByte(TRUE, FALSE); data[1] = 0x80 | addr; // the first bit is always 1. // Set Character data[2] = ControlByte(FALSE, TRUE); data[3] = ch; I2CMasterHelper_SendBlock(data, 4, LDD_I2C_SEND_STOP); I2CMasterHelper_WaitSendComplete(); } void AQM0802A_DisplayStr(bool secondline, char* str){ byte data[11]; byte length = strlen(str); if(length > 8){ length = 8; } // Set Address data[0] = ControlByte(TRUE, FALSE); data[1] = 0x80 | ((secondline == TRUE)?0x40:0x00); // the first bit is always 1. // Set data data[2] = ControlByte(FALSE, TRUE); memcpy(data + 3, str, length); I2CMasterHelper_SendBlock(data, length + 3, LDD_I2C_SEND_STOP); I2CMasterHelper_WaitSendComplete(); } void AQM0802A_ClearDisplay(){ SendCommand(0x01); }
Device | UART0 |
Baud rate | 38400 |
RxD | TSI0_CH2/PTA1/UART0_RX/TPM2_CH0 |
TxD | TSI0_CH3/PTA2/UART0_TX/TPM2_CH1 |
ゲームに限らずほぼすべての創作物は、根本的には制作者のエゴイズム(自己本位、利己主義)で作られるものだとわたしは思います。(…)でも冷静に見渡してみると、エゴよりももっと優先すべきものがあることに気がつくのです。(…)お客さんに届くものであれば、まして代金をいただくものであれば、作品であるまえに商品であることは無視できません。メーカー名が冠としてつけばなおのこと。だからこそ、「自分の好みの仕事ができない」と狭い視野で嘆くより、みずからが選んだ職種に携われること自体を感謝するべきだろうと思います。ゲームが好きで今の会社を選んだこと、ゲームに関わる環境に居られることへの感謝を忘れないようにしたいものです。
ゲームの最後にスタッフロールを載せるワケ。わたしにとっては、それはお約束を守るわけでも名前を載せたいだけでもなく、手がけた作品に対しての責任表示だという意図があります。売りたいのはゲームそのものであって、自分の名前ではないのですから。この責任感が、『スマブラ』のような、恐ろしい量の調整・デバッグを必要としそうなタイトルの完成度の高さを可能にしているのかもしれません。私は外に名前が出るような仕事はしていませんが、名前を載せても恥ずかしくないような仕事ができるよう頑張りたいですね。
コンピュータゲームで、主に快楽のため、夢の実現のために追求してきた様々なテクニックや手法は、いま、情報技術の発展で社会構造の中に実装されつつあり、ゲーミフィケーションという名で呼ばれています。この本におけるゲーミフィケーションの定義。
人間のローカルなコミュニケーションをインターネットが可視化して、それをこれまでよりも深いレベルで、それも大規模にゲーム化することが可能になったとき、ほんとうに何でもない、ほとんど中身のないやりとりをダラダラ続けているだけでなんとなく承認欲求も満たされるし、ゲームも進行して面白い、という一種の麻薬的な「時間つぶし革命」を実現してしまった主にソーシャルゲームの話。ゲーミフィケーションは「なんでもないこと」、あるいは「悪いこと」にも人々を熱中させられる技術でもあるため、使い方を考えなくてはいけない、ということではないかと思います。
今は目の前にあるこの15分を消費したい、大きな有料の感動より、無料で手軽に遊びたい、という欲求やニーズの方が勝っちゃってるからこそ、ソーシャルゲーム人口も上がっているWiiU や PS4 といった据え置きの大型タイトルから、「アプリ」へ人が流れている傾向について。大型ゲームが好きな人間としては寂しい一方、社会人になってからは確かに大型タイトルを遊ぶ気力が中々起きず、こうした感覚がわかってしまうのも事実です。振り返った時により大きなものが残るのは、有料かどうかはさておき「大きな感動」の方だと思うので、なんとか気力をだして「暇つぶし」に溺れないようにしたいものです。
明らかにこの種のソーシャルゲームは「作品」よりも「社会」の側に重心が置かれている。だから「ゲームとしてつまらない」という批判はあまり意味がない。これらの企画の目的はコミュニティ形成であって、ゲームはそのための手段でしかないし、ユーザーが享受している快楽もコミュニティサイトを通じた友人間の交流のそれが占める割合が大きい。(中略)『ポケモン』や『モンハン』ではゲームという作品の快楽の追求が目的で、社会=コミュニケーションはその快楽を支える装置=手段えしかない。しかし、ソーシャルゲームではこの関係が逆転している。社会が目的で作品が手段になっている。ソーシャルゲームにおけるコミュニケーションと、『ポケモン』や『モンハン』といったゲームにおけるコミュニケーションの役割の違いについて。
コンピュータゲームの歴史とは、手段と目的のあいだを撹乱するシステムを洗練する歴史だったはず。どんなゲームも、少しバランスが狂うと「ゲームのためのゲーム」に、つまり「作業ゲー」になってしまう。RPG で言えば、最終目的は「ストーリーをクリアする」で、そのための手段である「敵を倒す」、「ダンジョンを攻略する」、「アイテムを集める」、「レベルを上げる」という要素それぞれに面白みを持たせようとしてきた、という感じでしょうか?
今まではクリエイティブの神様というのはクリエイターという人たちの中に生息していて、その神をファンが崇拝していた。それが今では「僕も育ててるんだ」というふうに主体がパッシブな三人称から、アクティブな一人称に変わり始めている。AKB や初音ミクの流行、参加するエンターテイメントへの移行について。『日本代表』のような本当に限られたトップレベルの個人・団体以外は見るエンターテイメントの対象としての価値を失いつつあるのかもしれません。
いわゆるエリート層の人って、自分が置かれた環境に勝手にゲーム的な構造を読み込んで、自分がプレイヤーとして同行動すべきか判断できる人の比率が多い印象を受けます。確かに「ゲーム的な構造」が与える「何をすればどういう結果が得られるか」という因果関係を自分で紐解く事ができる人はエリート層になりやすい気がします。
「誰もが情報発信できる社会」が定着したとき、その結果何が起こりつつあるかというと、様々な情報や言葉が、有象無象の匿名の言葉と、ひと握りの固有名の言葉に分かれ始めているということです。匿名の言葉は、一般人の書き込み、固有名の言葉は有名人の書き込み。一般人の書き込みはその内容に重きが置かれ、有名人の書き込みは内容よりもその人が言った、ということに重きが置かれていて、この中間にあったマスメディアは居場所を失っているという話。
If you are not running the latest firmware and need to use the board with Linux or Windows 8.1, you need to then update the firmware. You must do this on an OS supported by the current firmware version on your board (typically Windows XP/Vista/7).
あなたにできるのは「自分の信じる最善の道を選ぶこと」、それだけです。一方で、その選択について他者がどのような評価を下すのか。これは他者の課題であって、あなたにはどうにもできない話です。
他者から嫌われることを恐れず、承認されないかもしれないというコストを支払わないかぎり、自分の生き方を貫くことはできない。つまり自由になれないのです。
「他者からどう見られているか」ばかりを気にかける生き方こそ、「わたし」にしか関心を持たない自己中心的なライフスタイルなのです。
ケージモード(Cage Mode) - Edit Mode で編集中のケージにモディファイアを適用します説明文の意味がよくわからなかったので調べたところ、要するに、Edit Mode で編集中にも、Modifier によって Modify された結果の頂点などが表示されるようになるみたいです。
The effect works both in Object mode and Edit modeとあったのですが、参考先によるとこの本が書かれたバージョン 2.5 (beta) の頃にはあったものの、それ以降のバージョン 2.6 や 2.7 系ではなくなっているようです。
apply plugin: 'android'
の前に以下のように buildscript ブロックを追加してから Sync しました。(build.gradle は1つのプロジェクトに2つありますが、apply plugin: 'android' のある方、階層的に深い位置にある方です。)buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.11.+'
}
}
android plugin: 'android'
...
参考 : Android Studio: Plugin with id 'android-library' not foundcannot.find.zip.align=The zipalign tool was not found in the SDK. Please update to the latest SDK and re-export your application or run zipalign manually. Aligning applications allows Android to use application resources more efficiently.久々に Android Studio でパブリッシュ用の Singed APK をビルドしようと思ってら、 上記のようなエラーが出ました。
Be so good they can't ignore you冒頭で、コメディアン Steve Margin のこの言葉を引用しつつ、もしあなたが本当に良い作品を作ることに集中していれば、いずれ他の人があなたのところにくるでしょう、しかし、そのためにはあなた(とあなたの作品)は見つけられる状態にある必要があります、と続きます。兎にも角にも、良いものを作るということが前提になるということです。(最初から優れた作品を作れる必要はなく、上達のためのプロセスの一環として、Share your work しよう、という流れになります。)
Mediocrity is, however, still on the spectrum (of creative work); you can move from mediocre to good in increments. The real gap is between doing nothing and doing something.凡庸も創作であり、本当の境目は何かするか、何もしないか、ということです。
If you give away everything you have, you are left with nothing. This forces you to look, to be aware, to replenish.... Somehow the more you give away, the more comes back to you.Share すると次に Share するものを探すようになる、という好循環が発生するという感じでしょうか。
Work is never finished, only abandoned." - Paul Valery『終わりーなどーはないーさ、終わらーせるーことはでーきるけどー』みたいな。
IF 条件A IF 条件B ( 処理1 ) ELSE ( 処理2(注意!) )なぜ注意が必要かというと、この書き方は以下のように解釈されるため、
IF 条件A ( IF 条件B ( 処理1 ) ELSE ( 処理2(条件1が TRUE で条件2 が FALSE の場合にのみ実行される) ) )
set TRUE_FALSE=FALSE IF 条件A IF 条件B set TRUE_FALSE=TRUE IF %TRUE_FALSE%==TRUE ( 処理1 ) ELSE ( 処理2 )
IF 変数A-変数B==期待値A-期待値B ( 処理1 ) ELSE ( 処理2 )
set TRUE_FALSE=FALSE IF 条件A set TRUE_FALSE=TRUE IF 条件B set TRUE_FALSE=TRUE IF %TRUE_FALSE%==TRUE ( 処理1 ) ELSE ( 処理2 )条件A は 条件B の ELSE の中に入れたほうが無駄がないのですが、