はてなキーワード: constとは
例えば以下の文章がメッセージで出力されてた時にエラーの根本原因が即わかる奴っているのかよ…
[ts]
型 '{ inputs: SymbolicTensor; outputs: (SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)[]; }' の引数を型 'ContainerArgs' のパラメーターに割り当てることはできません。
型 '(SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)' を型 'SymbolicTensor | SymbolicTensor' に割り当てることはできません。
型 '(SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)' を型 'SymbolicTensor' に割り当てることはできません。
型 'SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor' を型 'SymbolicTensor' に割り当てることはできません。
型 'Tensor<Rank>' を型 'SymbolicTensor' に割り当てることはできません。
大きなシステム開発プロジェクトにアサインされて、プログラミングしている。
言語はC++なんだけど、構造体同士を比較するのに、memcmp() 使ってて、みんなもそれを使えっていう。
中身を一個一個比較するより早いけど、構造体には内部にギャップができてるかもしれなくて、なので、
そのギャップの部分だけが違う二つの構造体は、「中身が異なる」と判断されてしまうのよね。
だから、構造体を作って各要素に中身を代入する前に構造体の領域全体を memset() でゼロで塗りつぶしましょう
ってことになってて、毎回それをやるんだけど、塗りつぶし忘れがないかどうか心配だったりする。
構造体メンバとして bool operator==(const T &other) を作るか、あるいは関数として
bool operator==(const T &obj1, const T &obj2) を作って、どちらにしても中身を一個一個比較するべきだとおもうんだよね。
class mystring { public: char *buffer; mystring() { buffer = (char*)""; } void operator = (const char*t) { int len = strlen(t); buffer = new char[len + 47]; strcpy(buffer, t); } void operator = (const mystring&src) { int len = strlen(src.buffer); buffer = new char[len + 47]; strcpy(buffer, src.buffer); } mystring& operator + (const char*t) { int len = strlen(buffer); int len2 = strlen(t); char *buffer2 = new char[len + len2 + 47]; strcpy(buffer2, buffer); strcpy(buffer2+len, t); buffer = buffer2; return *this; } mystring& operator + (const mystring&src) { return ((*this) + src.buffer); } };
class mystringV { public: std::vector<char> buffer; mystringV() { buffer.resize(2); buffer[0] = ' '; buffer[1] = NULL; } void operator = (const char*t) { int len = strlen(t); buffer.resize(len+1); strcpy(&buffer.at(0), t); } void operator = (const mystringV&src) { buffer = src.buffer; } mystringV& operator + (const char*t) { int len = strlen(&buffer.at(0)); int len2 = strlen(t); buffer.resize(len + len2 + 47); strcpy(&buffer.at(0) + len, t); return *this; } mystringV& operator + (const mystringV&src) { return ((*this) + &src.buffer.at(0)); } };
いろんな事をプログラマにかわってライブラリがやってしまうということ
どうなんだろうね。
この辺は あまりしっかり おしえてもらえないところではある。
でも プロならみんな 知っている
class mystring { public: char *buffer; mystring() { buffer = (char*)""; } void operator = (const char*t) { int len = strlen(t); buffer = new char[len + 47]; strcpy(buffer, t); } void operator = (const mystring&src) { int len = strlen(src.buffer); buffer = new char[len + 47]; strcpy(buffer, src.buffer); } mystring& operator + (const char*t) { int len = strlen(buffer); int len2 = strlen(t); char *buffer2 = new char[len + len2 + 47]; strcpy(buffer2, buffer); strcpy(buffer2+len, t); buffer = buffer2; return *this; } mystring& operator + (const mystring&src) { return ((*this) + src.buffer); } };
mystring my_space_org; for (int i = 0; i < 8; i++) { mystring space; space = my_space_org + " "; printf("%sHello world\n", space.buffer); my_space_org = space; }
もっと良い書き方があったらご指摘ください
const ngWords = [ /安倍/, /低能|低脳/, /麻生太郎はすごいあほだ/ ] ;
if(document.location.href.startsWith("https://anond.hatelabo.jp")) {
sections = document.getElementsByClassName('section');
Array.prototype.slice.call(sections).forEach(function(section, i, all) {
contain = Array.prototype.slice.call(section.children).filter(function(child, j, all) {
return ngWords.filter((ngWord) => {
if(ngWord.test(child.innerText)) {
return true;
}
if(contain){ section.style.display = 'none'; }
});
}
PlayStation JapanのYouTube動画「『 ゴッド・オブ・ウォー』 究極のアクションアドベンチャーの創造3 アトレウスができあがるまで」
https://youtu.be/vxUbSuKRs5c?t=1m4s
の1:04あたりでは
const char* stance const dc::tAIStance if (!pStance || return luaL_error(L, "Stance %s RequestQueue* pActiveRequest = L AISwitchStanceRequest* request = pAc request->SetStance(pAI, pStance); return 0;
というコードの断片が映る.(ただ,上から分かる通り,ほとんどの行は途中までしか映っていない.)
コードにあるluaL_errorはLuaのC APIにある関数である.pStanceがnullptrだった場合などに,この関数を呼ぶのだろう.
数日前に puppeteer で自動で PDF にする試みを書いたブログがホッテントリに入ってるのを見た
bg.js
const username = "" const api_key = "" chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if(message.bookmark){ bookmark(message.bookmark) } }) async function bookmark(url){ fetch("http://b.hatena.ne.jp/atom/post", { method: "POST", referrer: "no-referrer", headers: { Accept: "application/x.atom+xml, application/xml, text/xml, */*", "X-WSSE": await createCredential(), }, body: ` <entry xmlns="http://purl.org/atom/ns#"> <link rel="related" type="text/html" href="${url}" /> </entry> `.replace(/\t/g, ""), }).then(e => {console.log(e)}) } async function createCredential(){ const non = Math.random().toString(36).substr(2) const now = new Date().toISOString() const buf = new TextEncoder().encode(non + now + api_key) const u8a = new Uint8Array(await crypto.subtle.digest("SHA-1", buf)) const str = Array.from(u8a, e => String.fromCharCode(e)).join("") const b64 = btoa(str) return `UsernameToken Username="${username}", PasswordDigest="${b64}", Nonce="${btoa(non)}", Created="${now}"` }
username と api_key を埋めてバックグラウンドで動かす
page.js
chrome.runtime.sendMessage({ bookmark: location.href })
ページ内で動かすコード
JavaScript で var から const と let を使うようにってなったので Java は逆走している?
まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ。
一日8時間勉強時間があるなら、だいたい一ヶ月で終わる内容。
月額1000円だけどしっかり勉強すれば一ヶ月の無料期間中に終わると思う。
もともとN高等学校のノンプログラマーの生徒をWebエンジニアとして就職させるために作られたカリキュラムで講師曰く去年はこれで二人エンジニア就職を決めたらしい。
内容も相当親切に説明していて、プログラミングで何か作るだけじゃなくて、就職に必要な環境構築やセキュリティまでみっちりやる。
で講師が書いてる入門コースで習うことがまとめ。テキスト教材もあるけど授業も1項目を2時間で説明している。授業は週2の生放送とそのアーカイブがある。
↓みたいなことが学べる
----
Web ブラウザとは (Chrome, デベロッパーコンソール, alert)
はじめてのHTML (VSCode, HTML, Emmet)
さまざまなHTMLタグ (h, p, a, img, ul, tableタグ)
HTMLで作る自己紹介ページ (HTMLタグ組み合わせ, コンテンツ埋め込み)
はじめてのJavaScript (JS, ES6, エラー)
JavaScriptでの計算 (値, 算術演算子, 変数, 代入)
JavaScriptで論理を扱う (論理値, 論理積, 論理和, 否定, 比較演算子, if)
JavaScriptのループ (ループ, for)
JavaScriptのコレクション (コレクション, 配列, 添字, undefined)
JavaScriptの関数 (関数, 関数宣言, 引数, 戻り値, 関数呼び出し, 再帰)
JavaScriptのオブジェクト (オブジェクト, モデリング, プロパティ, 要件定義)
はじめてのCSS (CSS, セレクタ, background-color, border)
CSSを使ったプログラミング (transform, id, class)
Webページの企画とデザイン (企画, 要件定義, モックアップ, 16進数カラーコード)
診断機能の開発 (const, let, JSDoc, インタフェース, 正規表現, テストコード)
診断機能の組込み (div, 無名関数, アロー関数, ガード句, truthy, falsy)
ツイート機能の開発 (リバースエンジニアリング, URI, URL, URIエンコード)
LinuxというOS (VirtualBox, Vagrant, Ubuntuのインストール, OS, CUIの大切さ)
コンピューターの構成要素 (ノイマン型コンピューター, プロセス, lshw, man, ps, dfの使い方)
ファイル操作 (pwd, ls, cd, mkdir, rm, cp, mv, find, ホストマシンとの共有ディレクトリ)
標準出力 (標準入力、標準出力、標準エラー出力、パイプ、grep)
vi (vimtutor)
シェルプログラミング (シバン, echo, read, 変数, if)
通信とネットワーク (パケット, tcpdump, IPアドレス, TCP, ルーター, ping)
サーバーとクライアント (tmux, nc, telnet)
HTTP通信 (http, https, DNS, hostsファイル, ポートフォワーディング)
GitHubでウェブサイトの公開 (GitHub, リポジトリ, fork, commit, 情報モラル)
イシュー管理とWikiによるドキュメント作成 (Issues, Wiki)
GitとGitHubと連携 (git, ssh, clone, pull)
GitHubへのpush (init, add, status, インデックス, commit, push, tag)
Gitのブランチ (branch, checkout, merge, gh-pages)
Node.js (Node.js, nodebrew, Linux, REPL, コマンドライン引数, プルリク課題)
集計処理を行うプログラム (集計, 人口動態CSV, Stream, for-of, 連想配列Map, map関数)
アルゴリズムの改善 (アルゴリズム, フィボナッチ数列, 再帰, time, プロファイル, nodegrind, O記法, メモ化)
ライブラリ (ライブラリ, パッケージマネージャー, npm)
Slackのボット開発 (slack, mention, bot)
HubotとSlackアダプタ (hubot, yo)
モジュール化された処理 CRUD, オブジェクトライフサイクル, filter)
ボットインタフェースとの連携 (モジュールのつなぎ込み, trim, join)
同期I/Oと非同期I/O (同期I/O, 非同期I/O, ブロッキング)
例外処理 (try, catch, finally, throw)
HTTPサーバー (Web, TCPとUDP, Webサーバーの仕組み, Node.jsのイベントループ, リスナー)
HTTPのメソッド (メソッド, GET, POST, PUT, DELETE, CRUDとの対応)
HTMLのフォーム (フォームの仕組み, form, input)
HerokuでWebサービスを公開 (Webサービスの公開, heroku, dyno, toolbelt, login, create, logs)
認証で利用者を制限する (認証, Basic認証, Authorizationヘッダ, ステータスコード)
Cookie を使った秘密の匿名掲示板 (Cookie, Set-Cookie, expire)
UI、URI、モジュールの設計 (モジュール設計, フォームのメソッド制限, リダイレクト, 302)
フォームによる投稿機能の実装 (モジュール性, textarea, 303)
認証された投稿の一覧表示機能 (パスワードの平文管理の問題, 404, テンプレートのeach-in)
データベースへの保存機能の実装 (データベース, PostgreSQL, 主キー)
トラッキングCookieの実装 (トラッキング Cookie, IDの偽装, Cookie の削除)
削除機能の実装 (データベースを利用した削除処理, 認可, サーバーサイドでの認可)
管理者機能の実装 (Web サービスの管理責任, 管理者機能の重要性)
デザインの改善 (Bootstrap, レスポンシブデザイン, セキュリティの問題があるサイトを公開しない)
脆弱性 (脆弱性, 脆弱性で生まれる損失, 個人情報保護法, OS コマンド・インジェクション)
XSS脆弱性の対策 (XSS, 適切なエスケープ処理, リグレッション)
パスワードの脆弱性の対策(ハッシュ関数, メッセージダイジェスト, 不正アクセス禁止法, パスワードジェネレーター, 辞書攻撃)
セッション固定化攻撃脆弱性の対策 (セッション, セッション固定化攻撃, ハッシュ値による正当性チェック)
より強固なセッション管理 (推測しづらいセッション識別子, 秘密鍵)
安全なHerokuへの公開 (脆弱性に対する考え方, HTTPの廃止)
Webフレームワーク (Express.js, フレームワーク導入, 簡単なAPI, セキュリティアップデート, Cookie パーサー, ミドルウェア, 外部認証, ロガー)
ExpressのAPI (app, Properties, Request, Response, Router)
GitHubを使った外部認証 (Passport, OAuth)
テスティングフレームワーク (Mocha, レッド, グリーン, リファクタリング)
継続的インテグレーション (CircleCI)
クライアントのフレームワーク (Webpack, Chrome 以外のブラウザでもES6)
DOM操作のフレームワーク (jQuery, jQueryアニメーション, this)
AJAX (jQuery.ajax, クロスドメイン, 同一生成元ポリシー, x-requested-by, CORS)
WebSocket (WebSocket, WebSocketの状態遷移, Socket.io)
RDBとSQL (DDL, DCL, CREATE, DROP, INSERT, DELETE, UPDATE, WHERE)
テーブルの結合 (外部結合, 内部結合, 片側外部結合, JOIN ON)
インデックス (インデックス, 複合インデックス, Bツリー)
集計とソート (SUM, COUNT, ORDER BY, GROUP BY)
「予定調整くん」の設計 (要件定義、用語集、データモデル、URL設計、モジュール設計、MVC)
認証とRouterモジュールの実装 (Mocha, supertest, passport-stub, モックテスト)
予定とユーザーの保存 (セキュリティ要件, UUID, 複合主キー)
予定とユーザーの一覧の表示 (非同期処理, Promise, then)
出欠とコメントの表示 (入れ子の連想配列, Promise.all, 子どもからデータを消す)
remoteでもlocalでも同じように動くという一点だけだと思うのよね。PGの単価が安いとかも有るけど。言語的には7.1からprivate const使えたり、まあ頑張ってる。
(※にも関わらず大本営が色々と改良しても、未だに新規案件で5.6とか持ち出す腐れ会社は滅びるべき)
なので、とにかくremoteでしか動かないコードってのやめてもらいたいんだよなあ。
Debuggerさえ使えるなら、magentoみたいなとんでもない糞コードの山(*1)であっても、コアコードを弄りまくったec-cube(特に2.x)であろうとも、縄文時代か?これ?みたいなオレオレフレームワーク(201x年でもオレオレ使ってるバカ会社が有るんですよ!)であっても追いかけて修正するなり殺すなり出来る。
ところがコード読み書きしないできないインフラ屋なんかが出張ってきて、やれvarnishだーSphinxだー云々やられるとDebugger使えないから死ねる。や、それを採用した人間が人類滅亡の時まで保守改修するならどうでもいいことなんだが。localにそれらを構築する?や、出来なくねえけどめんどくせえし。
JavaScriptで、配列を各要素がユニークな新規オブジェクトになるよう初期化したい。
Rubyの
ary = Array.new(8) { Hash.new }
単純な実装としては
const ary = []; for(let i; i < 8; i++){ ary[i] = {}; }
みたいな感じだけれどもこれはなんとも微妙である。ワンライナーで書きたい。
ちょっとかっこつけると
const ary = Array.call(null, ...Array(8)).map(() => { return {}; } );
とか
const ary = [...Array(8)].map(() => new Object() );
とかできなくもないけど、これらもどうにも不格好である。
何かもっとシンプルでクレバーでスマートなやり方はないものであろうか。
const ary = Array(3).map(()=> new Object());
とかできたらよかったのだけれども、残念ながら空要素はスキップされるらしく、これでは空配列が返ってくるから
一旦展開させてundefinedで埋めた配列を生成してからmapしなければいけないらしい。最終的に得たい配列が1つなのに、その前に別の配列を2つも生成するのが気持ち悪い。
私はコミットログの書き方に悩む英語の苦手な人間である。実際、似たような人は世の中に結構いるようで、頻出単語を集計したりまとめたものは既にあって役に立つのだけれど、これらはあくまで単語の話であり、具体的な文を構成する過程でやっぱり困る部分がかなりあった。
要するに、どういう時にどういう文が使われているのか、ということを示した例文集が欲しいのである。ググると他にも「例文集があればいいのに」みたいな声はあるくせして、しかし誰も作ろうとしない。何なんだお前ら。それじゃ私が楽できないじゃないか。
ここで挙げているコミットログは全て実際のコミットログからの転載である。当然ながら各コミットログの著作権はそれぞれの書き手にある。いずれも各英文でググれば出てくるし、フェアユースの範囲なら許してくれるだろうと考え名前とプロジェクト名は割愛したが、ここにお詫びと感謝を述べておきたい。
抽出条件だが、参考にできそうなコミットログを多く含んでいそうなリポジトリをGitHubのSTARの多い方からざっと目で見て適当に選び、それぞれ最新コミットから5000件抽出した(あわせて前処理として、コミットログ冒頭のタグ情報は消去した)。
atomのみ5400件抽出していたため、計25400件のコミットログがベースである。このうち、以下の条件に合致するものは参考例にすべきでないとして一律排除した。
こうして残った8540件を眺めながら、適当に切り出したのがこの用例集である。個人的に「うーんこの」と思った表現も、散見される場合は載せた。
ということで、以下用例を羅列していく。
以上の用例をふまえ、今回の参考ログ8540件から先頭の単語を出現回数で並べると次のようになった。
Add | 1149 |
Fix | 1014 |
Update | 584 |
Remove | 566 |
Use | 382 |
Don't | 260 |
Make | 228 |
Move | 178 |
Change | 103 |
Rename | 85 |
Improve | 76 |
Avoid | 68 |
Allow | 65 |
Implement | 60 |
Handle | 58 |
コミットログの基本形はもちろん動詞 + 名詞である。名詞は固有名詞、複数形、不可算名詞が多いが、単数形の場合の冠詞は a が使われるか、あるいは省略される。the はまず使われない。
何かを追加した、という表現では非常に広く Add が使われる。メソッドからテスト、ドキュメントに至るまで大概これでまかなえる。
一方、何かを修正した、という表現では広く Fix が使われる。「何か」は typo や crash といった単語からメソッド名まで幅広い名詞を取るが、動名詞はあまり取らないのと、that節は取らないのでその点は注意が必要である。
Fix は「何かが正しく動くようにした」ことを示し、正しい動作内容が何かを説明しない。そこで正しい動作内容に言及したい場合は Make sure が使われる(こちらはthat節が取れる)。ただし Fix よりもニュアンス的に重い表現と思われ、Fix を使わず Make sure ばかり使うのはちょっとキモいのではないかと思う(Ensure はさらに重い表現っぽい)。
また、Fix は typo 以外でのドキュメント修正に対して使われることは稀である。対して Update はドキュメント、コメント、テストに使われ、本体のコードの修正に対しては使われない。本体コードの修正にあわせてテストも更新したなら Update が使われる。ただ、テスト機構それ自体のバグを修正したなら Fix である。
無駄な何かを単純に除去したなら Remove を使う。これまでのもの(A)から別のもの(B)に切り替えたのであれば Use B instead of A か Change A to B が使われる。新たに何かを利用するようにしたのであれば Use を、利用を取りやめた場合は Don't use を使うことが多い。
何かをしないようにしたなら Don't を、内部実装の効率化なら Make A + 比較級/形容詞 か Improve が使われる。
中身の変更を伴わない単なる名前の変更なら Rename A to B、コードや機能の論理上の場所を移動させたなら Move A to B である。
この辺はリファクタリングと呼ばれる行為と思うが、Refactor というぼんやりした動詞はあまり使われず、このように変更内容の種類に応じて動詞が使い分けられている。
コミットログにはWhyを書くべきだ、というのを何かで見かけたので because とか since を使ったログがどの程度あるかを調べたが、8540件のうち22件だった。基本的に短く、シンプルに、一目で意味が取れるログが好まれる傾向がある。例えば get rid of とか2件しか使われておらず、圧倒的に remove である。
一方で、シンプルな単語だけど開始単語としては使われないものもある。例えば次のような単語である。Expand(9)、Extend(8)、Print(5)、Optimize(5)、Publish(4)、Append(4)、Modify(3)、Manage(2)、Revise(2)、Dump(2)、Insert(2)、Migrate(2)、Enhance(1)、Edit(1) 。いずれもカッコ内は8540件に対する冒頭での登場回数である。結局、より一般的で平易な単語で表せたり、Refactor同様に抽象度が高すぎると使われないのだろう。
8000件もログを見たおかげで、迷いなくコミットメッセージが思いつくようになったのが個人的には今回書いてて最大の収穫だった。たぶんカンニングペーパーを作る行為それ自体が効率のいい学習になるという話と同じだと思う。
このまとめも100以上用例を転載してあるので、それを読むだけでも多少は効果があるんじゃないかと思う。同じようにコミットログ書きたくねぇなぁ英語わっかんねぇなぁと思っている人にとって、何か役に立つところがあれば幸いである。
FRPライブラリのサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?
拡張なら「関数型的じゃない」っていわれたら「関数型を拡張してるから」って答えればいいだけの話
「これが正しい関数型でお前らの状態渡しは間違ってる」みたいに言うから荒れる
間違っている電波だ
個人的に電波だと思うのはこういう匿名の書き込みを住井だ駱駝だ言い出すところ
ストリームだから定数とか、過去の値保存してるから定数とか言ってみたところで、プログラム内の色んな関数から読み書きされる可能性があって誰が書き換えたか中身読まないとわからないんじゃ、グローバル変数使ってるプログラムの欠点をそのまま持ってるじゃん
FRPライブラリのサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?
https://www.npmjs.com/package/timeengine
IOモナドをDisってるのかどうかまでは知らない。しかし、すでに出たサンプルからはFRPの効力がまざまざと見せつけられている。
荒れるのは自由だけど、両方正しいとかそういうのじゃなくて、間違っている電波だみたいな叩きしかなくて、要するに感情論で反対派は反発しているだけでOK?
あるよ。
関数がどのパラメータに依存して、何を結果として返すのか明確になる。
グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。
短いプログラムならそれでもいいけどね。
別の誰かが書いてたように、上位スコープ内に定義されてるDOMでも、数学ライブラリでもなんでも、引数で関数に渡すのか?
グローバルな値を参照したり書き換えたりして
いやだから、定数なんだから書き換わらないんだよ、FRPのストリームはconst 定数なんだから。
オブジェクト指向と対比して考え方をまず学ぶって、岡部路線、住井グループはそれを目の敵にしていて集団的に攻撃している様をみたプログラミングコミュニティは逃げ、その後、不毛な大地のみが残った。