blog.tnker.comhttp://blog.tnker.comWed, 04 Dec 2024 19:47:11 GMTPyRSS2Gen-1.1.0http://blogs.law.harvard.edu/tech/rssLinux系のChromeで大量のGETリクエストが保留中でスタックする問題http://blog.tnker.com/130<p>ものすごく久しぶりのエントリ</p> <p>とあるWebアプリの開発でdevモードで動かした場合にいろんなモジュールを引っ張ってる都合上、アプリケーション起動時に1000リクエスト以上のGETが走るようなアプリケーションを作っていたのだが</p> <h2>ある日を境にアプリケーションが起動しなくなる</h2> <p>とても困った。</p> <p>諸事情により開発マシンをMacからUbuntuに移行してしばらく開発していたのだが、とあるひ急にアプリケーションが立ち上がらなくなった</p> <p>立ち上がらない原因に関しては、表題にもあるとおりアプリケーション起動時のリソース取得リクエストが一部「保留中」のステータスのまま返ってこずスタックしているような状態になっている</p> <p>Webサーバー側のログを見ても該当リソースを200番で返してるし、実際のリソースに直接アクセスすればちゃんと表示される</p> <p>FFでは再現せず、Chrome(とEdge)で起きるのでWebkit絡みのなんかなのかなぁと思いとりあえずググる</p> <h2>同じ事象起きてる人おった</h2> <ul> <li><a href="https://www.querythreads.com/http-requests-stuck-in-pending-state-when-using-vite/">HTTP requests stuck in Pending state when using Vite</a></li> </ul> <p>viteのモジュール大量に読み込んだ場合にLinux環境のChromeで発生しているっぽく、思いっきり同じ事象</p> <h2>原因</h2> <p>ホスト環境の一度に開けるファイル数制限に引っかかりスタックしているとのこと<br /> Chromeとかに関しては特別なにかしてないと並行して一気に取得しにいくっぽいので、その際に制限に引っかかるとスタックするっぽい</p> <p>事象が再現する環境で試しにdevツール上のスロットリング設定で低速とかにしてファイル取得を極端に遅らせたりすると正常に開けたりした</p> <p>FFで再現しないのは単純に並行して取得しに行く本数が少ないとかな気がするので、ほっとけばそのうちFFでも発生しそうな気はした</p> <h2>修正方法</h2> <p>ホストOS(今回の場合はUbuntu)の同時に開けるファイル数の設定値を増やす</p> <p><strong>対象ファイル(元ファイル)</strong></p> <p><code>/etc/systemd/system.conf /etc/systemd/user.conf</code></p> <p>上記対象ファイルに以下設定値を追加<br /> ※コメントアウトされている場合はコメント外して値追記でも可<br /> ※設定値については元記事の値を一旦そのまま引用</p> <p><code>DefaultLimitNOFILE=65536</code></p> <p>元ファイルを直接編集したくない場合は、差分で適用することも可</p> <p><strong>対象ファイル(差分ファイル)</strong></p> <p><code>/etc/systemd/system.conf.d/custom.conf</code></p> <p>confファイルがなければ作成して以下追記<br /> ※ 既にあるなら <code>DefaultLimitNOFILE</code> を追記</p> <p><code>[Manager] DefaultLimitNOFILE=65536</code></p> <p>ファイル追記が完了したら、ログオフしてログインし直せば反映されてるはず<br /> ※されないケースもあるみたいなのでその場合は再起動</p> <h3>DefaultLimitNOFILE について</h3> <p>設定値の内容自体は最大ファイルオープン数<br /> コロンで区切って書けばソフトリミットとハードリミットで分けて定義できるっぽい</p> <p><code>DefaultLimitNOFILE=[ソフトリミット数]:[ハードリミット数]</code></p> <p>今回は開発環境なのでざっくり指定</p> <p>いじょーう</p>tnkerSencha Advent Calendar 2015 - 12月20日 Ext.Editorで編集可能な簡易帳票を最速で作るhttp://blog.tnker.com/129<script src="//cdn.sencha.com/ext/gpl/5.0.1/build/ext-all.js"></script> <p><link rel="stylesheet" href="//cdn.sencha.com/ext/gpl/5.0.1/packages/ext-theme-crisp/build/resources/ext-theme-crisp-all.css"></p> <p>超遅くなりました。ごめんなさい。<br /> 今回のお題は、あんまり表に出てこない <code>Ext.Editor</code> たんです。</p> <blockquote> <p>ExtJS6とか関係ないです。</p> </blockquote> <p>リファレンスはこちら</p> <p><a href="http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.Editor">http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.Editor</a></p> <p>なにやってくれるやつかというと、よくExtJSのサンプルとかをダブルクリックしたりして、入力部品に切り替わって編集出来たりしますが、そんな感じのことをやってくれる偉い子です。</p> <p>何をしてくれるのかすごくザックリと説明すると、Ext.Editorをあらかじめ用意しておいて、何かしらのアクションが発生した際にそのアクションが発生した要素をEditorに渡すと、その部分を指定した入力部品に置き換えてくれます。</p> <p>実際に動作するのが下記帳票(と言うなのただのテーブル)の各セルをダブルクリックしてみませう。</p> <table id="example-table"> <thead> <tr> <th>項目1</th> <th>項目2</th> <th>項目3</th> <th>項目4</th> </tr> </thead> <tbody> <tr> <td>データ1-1</td> <td>データ1-2</td> <td>データ1-3</td> <td>データ1-4</td> </tr> <tr> <td>データ2-1</td> <td>データ2-2</td> <td>データ2-3</td> <td>データ2-4</td> </tr> <tr> <td>データ3-1</td> <td>データ3-2</td> <td>データ3-3</td> <td>データ3-4</td> </tr> </tbody> </table> <p>編集できましたかね? </p> <p>ちなみにEnterで確定したりして、初期状態から内容が変更になった場合は赤くなるようにしています。</p> <p>こんなことが出来るのが <code>Ext.Editor</code> です :)</p> <p>で、実際のコードを見ていくと。<br /> まずは、帳票部分のHTMLは</p> <h3>HTMLコード</h3> <pre><code>&lt;table id="example-table"&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;項目1&lt;/th&gt; &lt;th&gt;項目2&lt;/th&gt; &lt;th&gt;項目3&lt;/th&gt; &lt;th&gt;項目4&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;データ1-1&lt;/td&gt; &lt;td&gt;データ1-2&lt;/td&gt; &lt;td&gt;データ1-3&lt;/td&gt; &lt;td&gt;データ1-4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;データ2-1&lt;/td&gt; &lt;td&gt;データ2-2&lt;/td&gt; &lt;td&gt;データ2-3&lt;/td&gt; &lt;td&gt;データ2-4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;データ3-1&lt;/td&gt; &lt;td&gt;データ3-2&lt;/td&gt; &lt;td&gt;データ3-3&lt;/td&gt; &lt;td&gt;データ3-4&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; </code></pre> <p>こんな感じで、何も特殊なことをしていないただのHTMLです。<br /> 続いてCSS</p> <h3>CSSコード</h3> <pre><code>&lt;style type="text/css"&gt; #example-table { width: 100%; color: #333; font-size: .95em; border-spacing: 1px; } #example-table th { font-size: 1.0em; background-color: #eee; padding: 5px; } #example-table td { font-size: 1.0em; padding: 8px; border-bottom: 1px solid #f1f1f1; } #example-table td:hover { background-color: #f5f5f5; cursor: pointer; color: #3169CB; } #example-table td.dirty { color: #CC1A1A; font-weight: bold; } &lt;/style&gt; </code></pre> <p>こちら特殊なことは一切なにもしていないCSSになります。</p> <p>最後にリソースとして読み込んでいるCSSとJSファイル、編集時の処理を実装してるコードが下記になります。</p> <h3>追加読み込みリソース(CDN)</h3> <pre><code>&lt;script src="//cdn.sencha.com/ext/gpl/5.0.1/build/ext-all.js"&gt;&lt;/script&gt; &lt;link rel="stylesheet" href="//cdn.sencha.com/ext/gpl/5.0.1/packages/ext-theme-crisp/build/resources/ext-theme-crisp-all.css"&gt; </code></pre> <h3>JSコード(とその解説)</h3> <pre><code>&lt;script type="text/javascript"&gt; // $(function() {})みたいなもの Ext.onReady(function() { var editor, table; editor = Ext.create('Ext.Editor', { // 入力部品確定後元の要素を更新するか updateEl: true, // 編集部品を表示した際にそろえる位置指定(API参照) alignment: 'l-l', // 入力部品の外枠に影を表示するか shadow: false, // 入力部品の自動サイズ設定 autoSize: { width: 'boundEl' }, // 編集部品指定(今回はテキストフィールド) field: { xtype: 'textfield' }, // Ext.Editorに対するイベントバインド listeners: { // 編集確定時処理 complete: function(e, nv, ov) { // 入力前と後で値が違う場合は、対象要素にCSSクラス付与 // これで赤文字に変更している if (nv !== ov) { e.boundEl.addCls('dirty'); } } } }); // 帳票テーブル要素取得(引数ID名) table = Ext.get('example-table'); // ダブルクリック時のイベントバインド table.on({ dblclick: { // ダブルクリック時実行処理 fn: function(e, t) { // Ext.Editorに対して操作された対象要素を引き渡しEditor起動 editor.startEdit(t); }, // イベント対象要素 element : 'el', // イベントを反応させる要素のセレクタ(CSSクラス可) delegate: 'td' } }) }); &lt;/script&gt; </code></pre> <p>コメント入ってますが、こんだけのコードで終わりです。<br /> 編集契機を変更したい場合は、<code>dblclick</code> を <code>click</code> とかに変更すれば良いです。</p> <blockquote> <p><code>Ext.onReady</code> とか久しぶりに使った<br /> あと実際にやるときは、各関数はちゃんと定義しましょう</p> </blockquote> <p>HTMLとCSSコードは完全に独立した状態で作れるので、名前とかだけが人によって違う帳票的なものを印刷する手前で、編集出来るようなやつを用意する際にかなりさっくり作れるかと思います。</p> <p>あとは今回テキストフィールドでやってますけど、同じ感じでコンボボックスとか日付ピッカーだったりも <code>field</code> の <code>xtype</code> 変えてあげれば、同じ用に使えるので結構良いような気がします。</p> <p>ということで、少し変わったExtJSの使い方のご紹介でした、まる</p> <style type="text/css"> #example-table { width: 100%; color: #333; font-size: .95em; border-spacing: 1px; } #example-table th { font-size: 1.0em; background-color: #eee; padding: 5px; } #example-table td { font-size: 1.0em; padding: 8px; border-bottom: 1px solid #f1f1f1; } #example-table td:hover { background-color: #f5f5f5; cursor: pointer; color: #3169CB; } #example-table td.dirty { color: #CC1A1A; font-weight: bold; } </style> <script type="text/javascript"> Ext.onReady(function() { var editor, table; Ext.getBody().removeCls('x-body'); editor = Ext.create('Ext.Editor', { updateEl: true, alignment: 'l-l', shadow: false, autoSize: { width: 'boundEl' }, field: { xtype: 'textfield' }, listeners: { complete: function(e, nv, ov) { if (nv !== ov) { e.boundEl.addCls('dirty'); } } } }); table = Ext.get('example-table'); table.on({ dblclick: { fn: function(e, t) { editor.startEdit(t); }, element : 'el', delegate: 'td' } }) }); </script>tnkerSencha Advent Calendar 2015 - 12月13日 vimなお話http://blog.tnker.com/128<p>今年もこの季節がやってきましたね。<br /> ということで、今回は <del>Sencha</del> vim のお話です。</p> <p>Advent Calendarの記事の中にいくつかIDEだったりプラグインの紹介だったりがチラホラありますが、そんな中 vim を使い続ける硬派な方向けのエントリーになります。</p> <h3>tnker/vim-sencha-util</h3> <blockquote> <p><a href="https://github.com/tnker/vim-sencha-util">https://github.com/tnker/vim-sencha-util</a></p> </blockquote> <p>少し前にSencha用のプラグイン作りました。<br /> GithubのREADMEはBingの翻訳頼りなので、英語おかしいかもですが気にしないように :(</p> <p>Senchaで一番面倒なコード追う作業を比較的楽にしてくれちゃいます :)</p> <h3>設定方法</h3> <p>プラグインの中身の実装がほぼPythonで実装しているので、Python2.7以上(多分)が必須です。</p> <p>インストールについては、みんな大好きNeoBundleでOKです</p> <pre><code>NeoBundle 'tnker/vim-sencha-util' </code></pre> <h3>使い方</h3> <p>このプラグインを使うに当たって、Sencha Commandで生成されたプロジェクトが前提になるので注意してください :(</p> <p>あとは、xtypeから該当ファイルへジャンプしたりする機能を利用する場合、Sencha Commandでビルドもしくは <code>sencha app refresh</code> などを行う必要があります。</p> <blockquote> <p>プロジェクト直下の bootstrap.json を参照していたりするので</p> </blockquote> <p>出来ることは下記の通り</p> <ul> <li>文字列定義で記述されているフルパスクラス名から該当クラスファイルへジャンプ</li> <li>リテラル定義内のxtype名から該当クラスへジャンプ</li> <li>リテラル定義内のhandler等に設定されている文字列関数名から該当関数までジャンプ</li> <li>MVVMの構成に合わせてファイルをトグル切り替え</li> </ul> <p>一番最後の機能については、ファイル名の命名規則しばったちょうザックリ機能なので、使えるかは微妙です(私は使ってますが</p> <p>プラグインの機能を利用する際に使うのは、基本的に下記のコマンドだけになります</p> <pre><code>:SenchaParserReadCurrentLine </code></pre> <p>微妙といったファイルのトグル切り替えについては下記</p> <pre><code>: SenchaMVVMToggle </code></pre> <h4>文字列定義で記述されているフルパスクラス名から該当クラスファイルへジャンプ</h4> <p><img alt="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_classpath.gif" src="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_classpath.gif" /></p> <h4>リテラル定義内のhandler等に設定されている文字列関数名から該当関数までジャンプ</h4> <p><img alt="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_handler.gif" src="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_handler.gif" /></p> <p>ExtJS6のclassicとmordenパッケージの名前解決も一応対応はしていますが、ちょっとまだバギーかもしれないです :(</p> <h4>リテラル定義内のxtype名から該当クラスへジャンプ</h4> <p><img alt="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_xtype.gif" src="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/jump_xtype.gif" /></p> <h4>MVVMの構成に合わせてファイルをトグル切り替え</h4> <p><img alt="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/mvvm_toggle_file.gif" src="https://raw.githubusercontent.com/tnker/vim-sencha-util/master/src/images/mvvm_toggle_file.gif" /></p> <p>これについては、該当ファイルに設定されているViewControllerとViewModelの解析を行っているわけではなく、単純に該当ファイルと同ディレクトにおいてあるファイルを下記のルールで検索し、マッチするファイルがあればトグルで切り替えているだけになります。</p> <blockquote> <p>対象ファイルが Hoge.js の場合<br /> Hoge.js<br /> HogeModel.js<br /> HogeController.js<br /> というような感じで、ModelとControllerが後ろについているか検索してるだけです</p> </blockquote> <p>vimrc には下記みたいな感じで、マッピング追加しておいてもらえれば簡単に使えるので比較的便利です :)</p> <pre><code>map &lt;silent&gt; &lt;C-@&gt; :SenchaMVVMToggle&lt;CR&gt; map &lt;silent&gt; &lt;C-f&gt; :SenchaParserReadCurrentLine&lt;CR&gt; </code></pre> <p>と、思いっきり <del>宣伝</del> 紹介記事になってしまいましたが今回はこの辺で :)</p> <blockquote> <p>今気づいたけど、12日分がまだ上がってなかった!<br /> Unoくんガンバ!:(</p> </blockquote>tnkerSenchaTouchで既存アプリのUIを真似てモックアプリ実装する遊びをしていたhttp://blog.tnker.com/125<p>こんばんわ。</p> <p>Sencha TouchがExtJS6で統合されたのにも関わらず、積極的にSencha Touchを書いている私です。</p> <p>サンプルがてら既存アプリのUIをTouchで書いてたりしたけど、若干飽きてきたのでとりあえず、アウトプットして他のことしようと思う。</p> <p><img alt="" src="/upload/2015/04/28/20150428022815.png" /></p> <h2>サンプルページ</h2> <p><a href="http://touch.tnker.com/">http://touch.tnker.com/</a></p> <blockquote> <p>作りたい部分だけ作ってるだけなので、完成度はお察しです<br /> あと、所々ボタン押下した際に表示されるサイドのメニュー一覧は気にしないでね:)</p> </blockquote> <p>ということで、python・scala・swiftあたりで遊ぶことにします。</p> <p>気が向いたらまたなんか作って追加すると思います。</p>tnkerそにアニOPが若干ノリノリになるかもしれない(マイク入力ONにしないと意味分からないエントリです)http://blog.tnker.com/123<style> iframe { box-shadow: 0 0 20px rgba(0, 0, 0, .3); transform-origin: center center; } </style> <h2>なんとなくAudio API触ってみたくてやってみた</h2> <p>あとでお復習いがてらまとめようと思う。<br /> とりあえず音声データを数値化するにはAnalyzerを通してあげれば、渡した音声データの波形データを取得できるみたい。</p> <p>んで、youtubeの動画をいい感じになんかしたかったけど、音データを抜くのは無理だし色々考えるのが面倒だったのでスピーカーから再生した音をマイクで拾うという暴挙に出てます。</p> <blockquote> <p>なのでマイク入力無いPCの人はそっとブラウザと閉じてください。</p> </blockquote> <h2>スピーカーからの音声をマイクで拾ってます</h2> <p>なので、ヘッドフォンとかで聞いててもあんまり面白くないと思います。<br /> 自分で合いの手入れてくれれば大丈夫です。</p> <h2>ブラウザ上部にマイク入力のアクセス許可出てくるので「許可」してから再生してみてね</h2> <div id="player"></div> <p>いかんせん、マイクから音拾ってるので周りうるさいと余計に動きます ;(</p> <h2>参考サイト</h2> <blockquote> <p>波形描画 | サウンドの視覚化 | WEB SOUNDER - Web Audio API 解説<br /> <a href="http://curtaincall.weblike.jp/portfolio-web-sounder/webaudioapi-visualization/draw-wave">http://curtaincall.weblike.jp/portfolio-web-sounder/webaudioapi-visualization/draw-wave</a></p> </blockquote> <script src="/upload/2015/03/09/audioManager.min.js"></script> <script src="/upload/2015/03/09/sonico.min.js"></script>tnker