はてなキーワード: 初期化とは
第1章 プログラミング概念入門 1.1 計算器 1.2 変数 1.3 関数 1.4 リスト 1.5 リストについての関数 1.6 プログラムの正しさ 1.7 計算量 1.8 遅延計算 1.9 高階プログラミング 1.10 並列性 1.11 データフロー 1.12 明示的状態 1.13 オブジェクト 1.14 クラス 1.15 非決定性と時間 1.16 原子性 1.17 ここからどこへ行くのか? 1.18 練習問題 第1部 一般的計算モデル 第2章 宣言的計算モデル 2.1 実用的プログラミング言語の定義 2.1.1 言語の構文 2.1.2 言語の意味 2.2 単一代入格納域 2.2.1 宣言的変数 2.2.2 値格納域 2.2.3 値生成 2.2.4 変数識別子 2.2.5 識別子を使う値生成 2.2.6 部分値 2.2.7 変数の,変数への束縛 2.2.8 データフロー変数 2.3 核言語 2.3.1 構文 2.3.2 値と型 2.3.3 基本型 2.3.4 レコードと手続き 2.3.5 基本操作 2.4 核言語の意味 2.4.1 基本概念 2.4.2 抽象マシン 2.4.3 待機不能な文 2.4.4 待機可能な文 2.4.5 基本概念再訪 2.5 メモリ管理 2.5.1 末尾呼び出し最適化 2.5.2 メモリライフサイクル 2.5.3 ガーベッジコレクション 2.5.4 ガーベッジコレクションは魔術ではない 2.5.5 Mozartのガーベッジコレクタ 2.6 核言語から実用的言語へ 2.6.1 構文上の便宜 2.6.2 関数(fun文) 2.6.3 対話的インターフェース(declare文) 2.7 例外 2.7.1 動機と基本概念 2.7.2 例外を持つ宣言的モデル 2.7.3 親言語の構文 2.7.4 システム例外 2.8 進んだ話題 2.8.1 関数型プログラミング言語 2.8.2 単一化と内含(entailment) 2.8.3 動的型付けと静的型付け 2.9 練習問題 第3章 宣言的プログラミング技法 3.1 宣言的とはどういうことか? 3.1.1 宣言的プログラムの分類 3.1.2 仕様記述言語 3.1.3 宣言的モデルにおいてコンポーネントを実装すること 3.2 反復計算 3.2.1 一般的図式 3.2.2 数についての反復 3.2.3 局所的手続きを使うこと 3.2.4 一般的図式から制御抽象へ 3.3 再帰計算 3.3.1 スタックの大きさの増加 3.3.2 代入ベースの抽象マシン 3.3.3 再帰計算を反復計算に変換すること 3.4 再帰を用いるプログラミング 3.4.1 型の記法 3.4.2 リストについてのプログラミング 3.4.3 アキュムレータ 3.4.4 差分リスト 3.4.5 キュー 3.4.6 木 3.4.7 木を描画すること 3.4.8 構文解析 3.5 時間効率と空間効率 3.5.1 実行時間 3.5.2 メモリ使用量 3.5.3 償却的計算量 3.5.4 性能についての考察 3.6 高階プログラミング 3.6.1 基本操作 3.6.2 ループ抽象 3.6.3 ループの言語的支援 3.6.4 データ駆動技法 3.6.5 明示的遅延計算 3.6.6 カリー化 3.7 抽象データ型 3.7.1 宣言的スタック 3.7.2 宣言的辞書 3.7.3 単語出現頻度アプリケーション 3.7.4 安全な抽象データ型 3.7.5 安全な型を備えた宣言的モデル 3.7.6 安全な宣言的辞書 3.7.7 資格とセキュリティ 3.8 宣言的でない必要物 3.8.1 ファイルを伴うテキスト入出力 3.8.2 グラフィカルユーザインタフェースを伴うテキスト入出力 3.8.3 ファイルとの状態なしデータI/O 3.9 小規模プログラム設計 3.9.1 設計方法 3.9.2 プログラム設計の例 3.9.3 ソフトウェアコンポーネント 3.9.4 スタンドアロンプログラムの例 3.10 練習問題 第4章 宣言的並列性 4.1 データ駆動並列モデル 4.1.1 基本概念 4.1.2 スレッドの意味 4.1.3 実行列 4.1.4 宣言的並列性とは何か? 4.2 スレッドプログラミングの基本的技法 4.2.1 スレッドを生成すること 4.2.2 スレッドとブラウザ 4.2.3 スレッドを使うデータフロー計算 4.2.4 スレッドのスケジューリング 4.2.5 協調的並列性と競合的並列性 4.2.6 スレッド操作 4.3 ストリーム 4.3.1 基本的生産者/消費者 4.3.2 変換器とパイプライン 4.3.3 資源を管理し,処理能力を改善すること 4.3.4 ストリームオブジェクト 4.3.5 ディジタル論理のシミュレーション 4.4 宣言的並列モデルを直接使うこと 4.4.1 順序決定並列性 4.4.2 コルーチン 4.4.3 並列的合成 4.5 遅延実行 4.5.1 要求駆動並列モデル 4.5.2 宣言的計算モデル 4.5.3 遅延ストリーム 4.5.4 有界バッファ 4.5.5 ファイルを遅延的に読み込むこと 4.5.6 ハミング問題 4.5.7 遅延リスト操作 4.5.8 永続的キューとアルゴリズム設計 4.5.9 リスト内包表記 4.6 甘いリアルタイムプログラミング 4.6.1 基本操作 4.6.2 ティッキング(ticking) 4.7 Haskell言語 4.7.1 計算モデル 4.7.2 遅延計算 4.7.3 カリー化 4.7.4 多態型 4.7.5 型クラス 4.8 宣言的プログラムの限界と拡張 4.8.1 効率性 4.8.2 モジュラ性 4.8.3 非決定性 4.8.4 現実世界 4.8.5 正しいモデルを選ぶこと 4.8.6 拡張されたモデル 4.8.7 異なるモデルを一緒に使うこと 4.9 進んだ話題 4.9.1 例外を持つ宣言的並列モデル 4.9.2 さらに遅延実行について 4.9.3 通信チャンネルとしてのデータフロー変数 4.9.4 さらに同期について 4.9.5 データフロー変数の有用性 4.10 歴史に関する注記 4.11 練習問題 第5章 メッセージ伝達並列性 5.1 メッセージ伝達並列モデル 5.1.1 ポート 5.1.2 ポートの意味 5.2 ポートオブジェクト 5.2.1 NewPortObject抽象 5.2.2 例 5.2.3 ポートオブジェクトに関する議論 5.3 簡単なメッセージプロトコル 5.3.1 RMI(遠隔メソッド起動) 5.3.2 非同期RMI 5.3.3 コールバックのあるRMI(スレッド使用) 5.3.4 コールバックのあるRMI(継続のためのレコード使用) 5.3.5 コールバックのあるRMI(継続のための手続き使用) 5.3.6 エラー報告 5.3.7 コールバックのある非同期RMI 5.3.8 二重コールバック 5.4 並列性のためのプログラム設計 5.4.1 並列コンポーネントを使うプログラミング 5.4.2 設計方法 5.4.3 並列性パターンとしての機能的構成要素 5.5 リフト制御システム 5.5.1 状態遷移図 5.5.2 実装 5.5.3 リフト制御システムの改良 5.6 メソッド伝達モデルを直接使用すること 5.6.1 1つのスレッドを共有する複数のポートオブジェクト 5.6.2 ポートを使う並列キュー 5.6.3 終点検出を行うスレッド抽象 5.6.4 直列依存関係の除去 5.7 Erlang言語 5.7.1 計算モデル 5.7.2 Erlangプログラミング入門 5.7.3 receive操作 5.8 進んだ話題 5.8.1 非決定性並列モデル 5.9 練習問題 第6章 明示的状態 6.1 状態とは何か? 6.1.1 暗黙的(宣言的)状態 6.1.2 明示的状態 6.2 状態とシステム構築 6.2.1 システムの性質 6.2.2 コンポーネントベースプログラミング 6.2.3 オブジェクト指向プログラミング 6.3 明示的状態を持つ宣言的モデル 6.3.1 セル 6.3.2 セルの意味 6.3.3 宣言的プログラミングとの関係 6.3.4 共有と同等 6.4 データ抽象 6.4.1 データ抽象を組織する8つの方法 6.4.2 スタックの変種 6.4.3 多態性 6.4.4 引数受け渡し 6.4.5 取り消し可能資格 6.5 状態ありコレクション 6.5.1 インデックス付きコレクション 6.5.2 インデックス付きコレクションを選ぶこと 6.5.3 その他のコレクション 6.6 状態に関する推論 6.6.1 不変表明 6.6.2 例 6.6.3 表明 6.6.4 証明規則 6.6.5 正常終了 6.7 大規模プログラムの設計 6.7.1 設計方法 6.7.2 階層的システム構造 6.7.3 保守性 6.7.4 将来の発展 6.7.5 さらに深く知るために 6.8 ケーススタディ 6.8.1 遷移的閉包 6.8.2 単語出現頻度(状態あり辞書を使用する) 6.8.3 乱数を生成すること 6.8.4 口コミシミュレーション 6.9 進んだ話題 6.9.1 状態ありプログラミングの限界 6.9.2 メモリ管理と外部参照 6.10 練習問題 第7章 オブジェクト指向プログラミング 7.1 継承 7.2 完全なデータ抽象としてのクラス 7.2.1 例 7.2.2 この例の意味 7.2.3 クラスとオブジェクトを定義すること 7.2.4 クラスメンバ 7.2.5 属性を初期化すること 7.2.6 第1級メッセージ 7.2.7 第1級の属性 7.2.8 プログラミング技法 7.3 漸増的データ抽象としてのクラス 7.3.1 継承グラフ 7.3.2 メソッドアクセス制御(静的束縛と動的束縛) 7.3.3 カプセル化制御 7.3.4 転嫁と委任 7.3.5 内省 7.4 継承を使うプログラミング 7.4.1 継承の正しい使い方 7.4.2 型に従って階層を構成すること 7.4.3 汎用クラス 7.4.4 多重継承 7.4.5 多重継承に関するおおざっぱな指針 7.4.6 クラス図の目的 7.4.7 デザインパターン 7.5 他の計算モデルとの関係 7.5.1 オブジェクトベースプログラミングとコンポーネントベースプログラミング 7.5.2 高階プログラミング 7.5.3 関数分解と型分解 7.5.4 すべてをオブジェクトにすべきか? 7.6 オブジェクトシステムを実装すること 7.6.1 抽象図 7.6.2 クラスを実装すること 7.6.3 オブジェクトの実装 7.6.4 継承の実装 7.7 Java言語(直列部分) 7.7.1 計算モデル 7.7.2 Javaプログラミング入門 7.8 能動的オブジェクト 7.8.1 例 7.8.2 NewActive抽象 7.8.3 フラウィウス・ヨセフスの問題 7.8.4 その他の能動的オブジェクト抽象 7.8.5 能動的オブジェクトを使うイベントマネージャ 7.9 練習問題 第8章 状態共有並列性 8.1 状態共有並列モデル 8.2 並列性を持つプログラミング 8.2.1 さまざまな手法の概観 8.2.2 状態共有並列モデルを直接使うこと 8.2.3 原子的アクションを使うプログラミング 8.2.4 さらに読むべき本 8.3 ロック 8.3.1 状態あり並列データ抽象を構築すること 8.3.2 タプル空間(Linda) 8.3.3 ロックを実装すること 8.4 モニタ 8.4.1 定義 8.4.2 有界バッファ 8.4.3 モニタを使うプログラミング 8.4.4 モニタを実装すること 8.4.5 モニタの別の意味 8.5 トランザクション 8.5.1 並列性制御 8.5.2 簡易トランザクションマネージャ 8.5.3 セルについてのトランザクション 8.5.4 セルについてのトランザクションを実装すること 8.5.5 トランザクションについてさらに 8.6 Java言語(並列部分) 8.6.1 ロック 8.6.2 モニタ 8.7 練習問題 第9章 関係プログラミング 9.1 関係計算モデル 9.1.1 choice文とfail文 9.1.2 探索木 9.1.3 カプセル化された 9.1.4 Solve関数 9.2 別の例 9.2.1 数値例 9.2.2 パズルとnクイーン問題 9.3 論理型プログラミングとの関係 9.3.1 論理と論理型プログラミング 9.3.2 操作的意味と論理的意味 9.3.3 非決定性論理型プログラミング 9.3.4 純粋Prologとの関係 9.3.5 他のモデルにおける論理型プログラミング 9.4 自然言語構文解析 9.4.1 簡単な文法 9.4.2 この文法に従う構文解析 9.4.3 構文木を生成すること 9.4.4 限定記号を生成すること 9.4.5 パーサを走らせること 9.4.6 パーサを「逆向きに(backward)」走らせること 9.4.7 単一化文法 9.5 文法インタプリタ 9.5.1 簡単な文法 9.5.2 文法のコード化 9.5.3 文法インタプリタを走らせること 9.5.4 文法インタプリタを実装すること 9.6 データベース 9.6.1 関係を定義すること 9.6.2 関係を使って計算すること 9.6.3 関係を実装すること 9.7 Prolog言語 9.7.1 計算モデル 9.7.2 Prologプログラミング入門 9.7.3 Prologプログラムを関係プログラムに翻訳すること 9.8 練習問題 第2部 特殊化された計算モデル 第10章 グラフィカルユーザインタフェースプログラミング 10.1 宣言的/手続き的方法 10.2 宣言的/手続き的方法を使うこと 10.2.1 基本的ユーザインタフェースの要素 10.2.2 GUIを構築すること 10.2.3 宣言的座標 10.2.4 リサイズ時の宣言的振る舞い 10.2.5 ウィジェットの動的振る舞い 10.3 対話的学習ツールPrototyper 10.4 ケーススタディ 10.4.1 簡単なプログレスモニタ 10.4.2 簡単なカレンダウィジェット 10.4.3 ユーザインタフェースの動的生成 10.4.4 状況順応時計 10.5 GUIツールを実装すること 10.6 練習問題 第11章 分散プログラミング 11.1 分散システムの分類 11.2 分散モデル 11.3 宣言的データの分散 11.3.1 オープン分散と大域的ネーミング 11.3.2 宣言的データを共有すること 11.3.3 チケット配布 11.3.4 ストリーム通信 11.4 状態の分散 11.4.1 単純状態共有 11.4.2 分散字句的スコープ 11.5 ネットワークアウェアネス 11.6 共通分散プログラミングパターン 11.6.1 静的オブジェクトとモバイルオブジェクト 11.6.2 非同期的オブジェクトとデータフロー 11.6.3 サーバ 11.6.4 クローズド分散 11.7 分散プロトコル 11.7.1 言語実体 11.7.2 モバイル状態プロトコル 11.7.3 分散束縛プロトコル 11.7.4 メモリ管理 11.8 部分的失敗 11.8.1 失敗モデル 11.8.2 失敗処理の簡単な場合 11.8.3 回復可能サーバ 11.8.4 アクティブフォールトトレランス 11.9 セキュリティ 11.10 アプリケーションを構築すること 11.10.1 まずは集中,後に分散 11.10.2 部分的失敗に対処すること 11.10.3 分散コンポーネント 11.11 練習問題 第12章 制約プログラミング 12.1 伝播・探索法 12.1.1 基本的考え方 12.1.2 部分情報を使って計算すること 12.1.3 例 12.1.4 この例を実行すること 12.1.5 まとめ 12.2 プログラミング技法 12.2.1 覆面算 12.2.2 回文積再訪 12.3 制約ベース計算モデル 12.3.1 基本的制約と伝播子 12.3.2 計算空間の探索をプログラムすること 12.4 計算空間を定義し,使うこと 12.4.1 深さ優先探索エンジン 12.4.2 検索エンジンの実行例 12.4.3 計算空間の生成 12.4.4 空間の実行 12.4.5 制約の登録 12.4.6 並列的伝播 12.4.7 分配(探索準備) 12.4.8 空間の状態 12.4.9 空間のクローン 12.4.10 選択肢を先に任せること 12.4.11 空間をマージすること 12.4.12 空間失敗 12.4.13 空間に計算を注入すること 12.5 関係計算モデルを実装すること 12.5.1 choice文 12.5.2 Solve関数 12.6 練習問題 第3部 意味 第13章 言語意味 13.1 一般的計算モデル 13.1.1 格納域 13.1.2 単一代入(制約)格納域 13.1.3 抽象構文 13.1.4 構造的規則 13.1.5 直列実行と並列実行 13.1.6 抽象マシンの意味との比較 13.1.7 変数導入 13.1.8 同等性の強制(tell) 13.1.9 条件文(ask) 13.1.10 名前 13.1.11 手続き抽象 13.1.12 明示的状態 13.1.13 by-need同期 13.1.14 読み出し専用変数 13.1.15 例外処理 13.1.16 失敗値 13.1.17 変数置き換え 13.2 宣言的並列性 13.2.1 部分停止と全体停止 13.2.2 論理的同値 13.2.3 宣言的並列性の形式的定義 13.2.4 合流性 13.3 8つの計算モデル 13.4 よくある抽象の意味 13.5 歴史に関する注記 13.6 練習問題
■異性の好みを探る簡単な方法
これは私の長年の統計学的経験論なのだが(つまりいい加減てことですね)
異性の好みや接し方を簡単に推測する方法がある。
それは、
「どんなゲーム機が好き?」
って聞いてみることだ。
好きなゲーム機は?と聞いて「任天堂機」(但し64DDとバーチャルボーイを除く)を挙げる人は、かなり保守派だ。
堅実派、浮気しない人、安定した職業についた人、配水管の技術者を好む傾向がある。
また平均的な異性を好む。必ずしも美人(イケメン)である必要はない。逆に派手な異性は苦手。
「セガ機」あるいは「ソニー機」「ピピンなんとかかんとか」「パナソニックのやつ」等をメーカー名や国名で挙げる人は、
基本的にブランド志向なので、他人から見て自分の恋人がどのように見えるかをとても気にする。
男性なら高収入、医師弁護士などの職業が優先事項。ルックスは良いに越したことはないがそれよりも財力と権力(役職とか)
女性なら体育会系のがっしりした男性を好む。自分より背の低い男性は基本NG。マッチョOK
男性ならバストの大きさをとても気にする。基本的に巨乳好きというか貧乳は許せないタイプである。
「セガサターンの黒」とか「四角ボタンの頃のファミコン」みたいな一般人はあまり知らないような特定の固有の機種名を挙げる人。こういう人はあまり特定の傾向がなく、好きな異性タイプもピンポイントである。たとえば女優のAは大好きだが(顔の似ている)Bは生理的にダメ、とか言うことがよくあるのでその微妙な違いが他人にはよくわからない場合もある。ただし好きなものはとことん好き、という人である。
また、特に男性の場合、ゲーム機の扱い方と女性の扱い方はとても良く似ている。
新品にこだわる人、これは処女にこだわる。中古ばかり乗っている人はその点はおおらかである。
ひとつのゲーム機を長く長く使う人。これはパートナーの異性をとても大事にする。基本浮気はしない。女性の場合は重すぎることも。
頻繁にあれこれとゲーム機を買い換える人。こういう人は異性も簡単に乗り換えるし浮気が多いので要注意である。
メモリーカードを初期化ばかりしてる人や、ファームウェアに改造をたくさんする人は、ある意味独占欲が強いのだろう。暴力傾向があるのでこれも要注意。パートナーをとても大事に(誰にもちょっかいを出させない、縛る)するが、ひとたび浮気でも疑われると暴力沙汰になりたいへんな思いをする。
補足2
ゲーム機に興味がない、ゲーム機なんて遊べれば何でもいい。という人は、恋愛においても受け身。基本的に自分からは告白しない。逆に押し続ければ落ちるタイプである。異性にこだわりがない代わりに、自分を愛してくれる人、が好き。基本的に自分が一番大事なわりに自分に自信がないのだと思う。
補足3
変にハデでなくて、オタク臭くなくて、コントローラーが持ちやすくて、空冷がそれなりにちゃんと効いて、音楽や動画もそこそこ楽しめるゲーム機がいい。
という人は、基本的に相手を道具としてしか見ていない。ちゃんと稼いで浮気もせず家に帰ってきてくれればそれでいい、亭主元気で留守がいい、というタイプである。こういう人はスペックで相手を見るので、決して高スペックは望まないが堅実でしっかりした職業の人、それもできれば家柄がいいほうがいい、というタイプ。自身も庶民であるか、逆に超お嬢様で世間知らずな人かのどちらかである。
パソコンの前でPSS(いわゆるゴッド)をやる時間を確保しにくくなった自分のやり方メモ。
の一日分のテストで瞬間的に意味がでてこなかったものをtxtに書き出し、ある程度量がたまったら
に覚えられない単語を突っ込んで問題ファイル(.csv)を生成。
単語の羅列だけいれても、和訳までちゃんとついてcsvファイルになる。
・i暗記(iPoneアプリ)
ここは問題の共有ができるけれど、apsseで作成した問題を再配布するのは禁止されてるから注意。
復習時は最初に作ったi暗記用の「初期の自分がわからなかった単語カード」が結構役に立つ。
Super英単語のいいところは、クリアした章でもすぐに初期化して最初からテストできること。
■ずるっこ!を中心にしたもの■
・ずるっこ!http://zurukko.jp/
・apsse
の無視リストにずるっこ!から引っ張ってきた暗記済み単語リストをいれる。
http://www.vector.co.jp/soft/win95/util/se270425.html
あとは適当に覚えたい単語リストをapsseにつっこめば、ずるっこ!に登録された単語は除外された問題ファイルができる。
ずるっこ!にあまり簡単な単語が登録されていなくて、レベルの低い単語でも問題が生成されて煩わしい場合
http://d.hatena.ne.jp/softether/20110129
http://d.hatena.ne.jp/softether/20110204
開発者が公開してくれたこのリストが非常に役立つ。クリックしまくる。
読書猿さんがまとめてくれた記事が役立つ。
http://readingmonkey.blog45.fc2.com/blog-entry-413.html
他、多少古いけど
http://icarus.imc.hokudai.ac.jp/jugyo/huvl/
なんかは大学教授からの「願い」を感じるリストで眺めていて非常に感じ入るものがある。
覚える単語リストが「覚えた単語リスト」になったら、もちろんapsseの無視単語リストに追加。
数回繰り返すと、ずるっこ!との連携がしんどくなってくるかも?
i暗記じゃ音声がでないって?この方法じゃ発音記号もでないって?
そうなんだよ。
リスニング教材には好きなpodcastや市販の教材をあてるべきだと思う。
でも、隙間時間にボキャビルやってみたいって人にはちょっとおすすめしてみたい。いろいろ応用効きます。
俺が知らないだけなのかもしれないが
.Net Framework 3.5や4をインストールしようとすると
必ずネットから最新版をダウンロードor最新版の確認をしようとする。
もしくはとても不安定。経験上、たまたまではなくていつもそう。
まるでマイクロソフトは.NET Frameworkを使ってほしくないみたい。
こいつ1つセットアップするために、もう30分待っている。
ちなみに
仕事も進まんし、段どりがくずれて萎えさせられるし、個人的にも腹立たしいわ。
わりとすぐにインストール完了できた。
今だに2MB/73MB。
「転送速度は0kB/秒です」「500kB/秒です」「接続を初期化しています」を繰り返す。
なので、2.0のFull版に切り替えることにする。
ペロペロ
1. htmlのはき出しがあるやつは?>を書いたほうがいいよ。それ以外は最近はかないのがはやりだねさらに昔はevalとかで書いてた
2. configこれはwwwやpublic_html以下にしかconfigを配置できないクソサーバーがあるので、phpにしておいたほうが安全。なぜなら丸見えにしてあれこれパスをさらけ出すバカがいるかもしれないからだ。オープンソースなら特に。
3. コメントは挨拶だ。必要以上に挨拶を繰り返す必要もないし、それ以上でも以下でもない。
4. eclipseのせいと、phpとかが出始めたころのコーディング規約がスペースにするように求めた。{を改行してから書くか、続けて書くかのこれは宗教戦争だ。だが正直スペースは気に食わない。LLのくせに何バイトつかってるのだとおもう。あとスペース2文字インデントのやつは旅立て!
5. phpの0と""の違いは緩すぎる。そういう意味でナンバーの取り扱いにだけは気を配るべきだ。あとはtmpでもbufでもretでもなんでもいい。
6. nullはつっこむな、nullで初期化はすんな。初期化されてないからnullなんだ。issetは有効につかえ。とくに$_系の変数
7. 本当はerrorprocをかけといいたいがLLにそこまで望んでもしゃーない。エラーを投げると鯖ログにまで場合によっては落ちたりしてやっかいだからfalseを返せばいいというものでもないが、trueで初期化するやつは滅びていいと思う。あとarrayを返すようなfunctionの場合、phpのなんだっけisarray?だっけ?がクソすぎて萎える
8. つかダブルクオートのなかに$を書くコードは滅びていい。コンストはすべて大文字でという昔ながらのルールだけ守ってくれればいい
9. 出力系のラップ関数ぐらいつくっておこうぜ。あと、var_dumpとかのほうが見やすい。あと、get_defined_varsとかをラップしておくと便利
10. 三項演算子はつかうな。ifの{}を略すな。可読性がおちるのとしんたっくすで原因の特定がめんどくさい。
12. ++iなんていうコードを書くな。あと、roopの条件文で計算すんな
13. むしろこういうのは文字列の連結以外で使うようなスチュエーションをつくっちゃだめ
14. あら上で言っちゃったよ。ここまでやるんだったらlogファイルに吐き出すところまで拡張しとけば?
15. んー。エラーメッセージを定数化するときは外国版をつくるあてまである時だけだな
16. これも上でいってしまったな。あとリロードされてもいいように初期化でクリアしておくといいぞ。
17. ああそうだな、関数が1スクロールに収まらないときは大抵正規化に失敗してる。つくりをみなおせ
18. えー、こんな風に書くのはどうかしている。public二つチェインで呼び出すぐらいなら、内部でprivateを呼び出すか、継承させてparentにしておくべきか、それともシステムとして共通のstaticで呼び出せるかにしてくほうがいいのでは?$this->setThis()でいいじゃないか。なぜpublic functionをそういくつも定義する必要がある? 外部からの入り口出口は絞れ
19. グローバルなラッピング関数は最低限にとどめるべきで他は機能ごとにクラスつくってメソッド化しとけ。p(var)じゃねぇよDEBUG::p(var)とかにしとけってことだ
20. 眠くなったからねる。つまりはそんなもんだってことだ。気に病むな。満足してもらえるもんをしっかりつくればいいだけだ
http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/
良いPHPerだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。
つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。
それじゃ、始めよう。
?>なんて使っちゃいけない。そう俺たちはBAD PHPer。
無駄なホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めてゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。
require_once("config.php");
未だにこんなことやってるやつがいるのかいベイベー。絶対にダメだ。この一行を見たら俺は悶絶する。
ダメだ、早く何とかしないと。
大抵このconfig.phpの中身はこうなっている。見て絶望だ。
$hoge_path = ''; if (!LOCAL) { define('FOO_FLAG', 1); if (HONBAN) { define('HOGE_FLAG', 1); } else if (TEST) { define('HOGE_FLAG', 2); } } else { $hoge_path = '/local'; define('FOO_FLAG', 2); define('HOGE_FLAG', 3); } define('HOGE_URL', $hoge_path.'/hoge/');
こういうのが延々と続くわけだ。もういやだ。もう見たくない。
本番環境とテスト環境でどういう値の違いがあるのか、ローカル環境だとどうなるのか、まったく把握できる気がしない。
なまじPHPな設定ファイルのせいで、処理をついつい書いてしまう。そしてどんどん複雑になってしまう。
やはり設定データは基本的にYAML等のデータしか定義できない形式のもので用意すべきだ。そして環境ごとに設定ファイルを分けるべきである。
そうすることで何にどういう違いがあるのかすぐにわかるし、diffすれば一度にすべて把握することができる。
# 本番環境設定ファイル foo_flag: 1 hoge_flag: 1 hoge_url: '/hoge/'
# テスト環境設定ファイル foo_flag: 1 hoge_flag: 2 hoge_url: '/hoge/'
# ローカル環境設定ファイル foo_flag: 2 hoge_flag: 3 hoge_url: '/local/hoge/'
// ここで後の処理のためにhogeメソッドを呼び出しておく $q->foo(); // $a['foo']はここに来る時点で真のはず // 2010-03-10 判定がおかしいので修正 // 2010-06-21 やっぱり値が入ってる方が正しい if ( !isset($hoge[0]) ) { }
コメントは保守されない。そう、それは真実。こんなコメントを発見したら即効削除しよう。コメントは基本信じるな。
俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。
わかる。いいたい事はとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。
タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)
そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。
この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。
私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。
われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。
御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。
そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。
$iNumber = 'aaa';
になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。
変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。
$foo = null; $foo = $q->foo();
こんな初期化に意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう
$foo = null; if ( $hoge ) { $foo = 1; } else if ( $bar ) { $foo = 2; }
このときの初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; return $bReturn; }(中略)
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
trueとfalseの条件がいまいち明確ではないが、本当に動かないコードを書けというのであれば以下のようにすべきだ
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; else if ($i == 1) $bReturn = false; else throw new Exception("bad status! $i"); return $bReturn; }
中途半端にfalseを返して生存させる必要性はまったくない。今すぐ死ね!
連想配列のキーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。
更に後世のプログラマが処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にしたい場合はconstantを使うと良い。
// 定数のFOOを使うよということが明確になる print $a[constant('FOO')];
もし、文字列を変数の値と一緒に出力するとき、PHPではコンマの代わりにprintfを使うことが使える。
printf( “Hello, my name is %s“, $sName);
以下の代わりに上記のコードを使う。
echo “Hello, my name is “, $sName;
出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。
三項演算子はとても有効だ。しかし優先順位に難があるせいで、三項演算子をネストしようとすると以下のようなコードになってしまう
$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));
括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めてゴミ箱にでも捨てちまえ。
if ( $flag ) { }
仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。
もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。
インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい。
わけがわからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。
文句なしだ。これは文句がない。
他にも色々あるので覚えておこう
$a %= 1; $a &= 1; $a |= 1; $a ^= 1; $a <<= 1; $a >>= 1;
てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。
なのでdivを使って以下のようにしとくと便利だろう。
function p($var) {
echo "<div align='left' style='background-color:white;color:black;'><pre>";
print_r($var);
echo "</pre></div>";
}
君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!
大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがわからなくなってるパターンが多い。
貴様みたいなもんに、定数は制御できん。いいか設定ファイルはYAML等のデータで持つようにし、その連想配列のデータ構造を一つ持ってるだけで定数の変わりになる。
このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めてゴミ箱へ捨ててしまうといい。
認識を改めろ。俺たちはより良いPHPerにならないために努力している。
class Request { private $parameters; private $method; function __construct () { $this->method = $_SERVER['REQUEST_METHOD']; if ( strtoupper($this->method) === 'POST' ) { $this->parameters = $_POST; } else { $this->parameters = $_GET; } } function param ($key) { return isset($this->parameters[$key]) ? $this->parameters[$key] : null; } }
これだけでもいい。たったこれだけでもとても便利だ。ここから拡張してGETやPOSTを明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!
例が良くない。こんなのは引数が20個ある関数から、setを20回呼ぶオブジェクトに変わっただけではないか。
そもそもこの20個の引数とはなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし、20個も引数取る時点で設計が間違えている。
何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。
そんなことで悩んでる暇があったら設計を見直せ。
スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。
ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。
どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
・・・と、いうのはやめなさい。
一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。
まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。
確かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!
あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。
気を抜いて。そう気を抜いて。所詮あなたのコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。
結合度を減らすというのは非常に難しい。何度も何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。
まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。
そしてその後に、一部分使いまわしたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。
何事も経験が必要である!経験を積まないプログラマは丸めてゴミ箱に捨ててしまえ。
さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だって、addとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか。
function add_result_output ($iVar, $iVar2) { $r = add($iVar, $iVar2); echo result($r); }
もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!
このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。
あくまでも「より良いPHPerにならないための20Tips」なのだ。
君はこの記事を鵜呑みにしてはならない。PHPをPHPと見抜けないPHPerはPHPを使うのは難しい。
もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのケツの穴を拭くための紙になるだろう。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。
この記事があなたの役に立たない事を。
ふざけんな!
この記事に書かれている内容は、丸めてゴミ箱に捨てた方が良いレベルです。
StationTVとはpixela謹製のTV番組レコーダーです。普段はなかなかいい奴なのですが、何かの調子に、例えばOSのアップデートやドライバの更新、録画HDDのボリュームラベルの変更などがあると急に不機嫌になります。
ここでは今まで録画した番組が再生できなくなった場合の対策を書こうと思います。
注)
ドライバのアップデート直後や上の操作を間違えたりすると、たまに「今までの録画番組を削除し再初期化しますか? そうしなければ今後、録画機能を使うことができなくなりますがよろしいですか?」というおかしなメッセージが出てくることがあります。その場合、そのメッセージが表示された状態で、すべてのDTVAppディレクトリの名前を変更しましょう。その後、初期化するを選ぶと録画番組ファイルはそのままで、設定だけ初期化されます。ディレクトリ名を戻した後、RecordManageTool.exeを実行すると番組リストが復元されているはずです。
注)
この操作の実行後に、番組リストは復活しているが番組の再生に失敗する、という状態になることがあります。OSのサービスパックやデバイスが原因と言われていて、Windows Vistaのサービスパックを2から1に戻したら上手く再生できるようになったという話もありました。
[C:Program][D:Data]という名前を付けており、OSはC側に、データはD側に入っており、データ領域のD:Dataを新HDDに移動させたい場合。
【α-HDD増設】
α-2/ HDDをデータケーブル・電源ケーブルでマザーボードと繋ぐ。
→ケーブルはマザーボード購入時に付いている。なければ購入。
α-3/ 起動中にBIOS画面を出し、HDDを認識しているかチェック。
α-4/ OSを起動し、[マイコンピュータ]を右クリック→[管理]
で、[コンピュータの管理]画面を出す。 ([スタート]ボタンからも可能)
α-7/ よくわからないが、種類は[プライマリ]でいいようだ。
ドライブレター(CとかDとか)は自動でつけられる。ここでは仮にH:とつけられたとする。
【β-パーティション移動】
β-1/ Partition Wizard Home Edition (freeware)
参考: http://gigazine.net/index.php?/news/comments/20090815_partitionwizard/
β-2/ Partition Wizard起動。
・今取り付けたHDDの領域を[Delete]し、Unallocatedの状態にする。
→α-8でせっかく初期化したのに、とも思うが、それとは別かもしれない。
論理フォーマット(ローレベルフォーマット)とディスクフォーマットは違う・・・筈。
でも、もしかしたら、α4~α8までの作業は必要ないのかもしれない。
・前のHDDのD:Data領域を[コピー]し、今取り付けたHDDにペーストする設定にする。
・左上の[Apply]ボタンで開始。その前に常駐ソフトは終了させたほうがいいらしいが、
消さなくても問題はなかった。
【γ-ドライブレター変更】
γ-1/ 念のため、現状できちんと起動するかチェック。この時点では単に新しいHDDに、旧HDD内のDパーティションを新HDDにコピーしたにすぎず、旧HDDのDパーティションは残っているので、
何の問題もなく起動する筈。 ついでに新HDDにきちんとコピーできたかチェック。
γ-2/ [コンピュータの管理]画面を出し、[ディスクの管理]で、現在旧HDDにある、D:DataのドライブレターをD以外(Iなど)に変更する。
→この時、同時に新HDDのパーティションをDにしたいところだが、残念ながら一度に1つのドライブレターしか変更できない。
γ-3/ 再起動する。この時、旧HDDにexeファイルのあるアプリケーションプログラムは起動しない。
よって、この方法はOSの入っているCドライブには使えないことになる。
→しかし、CD起動などの方法があるのかもしれない。
γ-4/ [コンピュータの管理]画面を出し、[ディスクの管理]で、新HDDにある、H:DataのドライブレターをDに変更する。
γ-5/ 再起動する。D:Data内のexeファイルがきちんと実行されたか、Dドライブにデータを置いていた場合、Cドライブのアプリからきちんと読めたかどうかチェックする。
σ-1/ Partition Wizard起動。旧HDDのかつてDパーティションだった領域は、現在I:Dataとなっている。
σ-2/ Deleteした領域がUnallocatedになっているので、Cパーティションの領域の端を引っ張り拡張、旧HDDいっぱいに拡張する。
σ-3/ Applyを押してパーティション変更を確定。
だったらそれを明らかにすればよい。
自分でなにもかもやるんじゃなくて、第三者の手を借りればよい。
知人友人ではなく、まったくの赤の他人。できれば全国展開しているような規模の大きいところ。
(コンプライアンスの関係でそういうところは縛りが多い)
パソコン関係だけ言ってみると、
パソコンだけ、ネットワークだけ、と五月雨式にやっても意味がない。
弱いところから入り込まれる。一度に一気に全部やるのが鉄則。
ルータは正しく設定すれば外と隔離できる。(原理的に外から入り込めない)
ルータには強固なパスワードかけて他からアクセスできないように。
無線LANなんて危ないものはやめて、すべて有線でつなげ。
パソコンにはバックドアを仕掛けられないように、すべて初期化。できればデータもすべて捨て。
なんで監視カメラを取り除かないの?
以前に発見機は買ったんだけど、ひっかからない。
業者を呼ぶ金の余裕がない。
とっくの昔にさんざんやった。
なんでセキュリティの穴をふさがないの?
対策しても突破してくる。
ネットに繋いだ時点で入ってくる。俺個人を狙って本気で侵入してくるから防げない。
なんで新規契約にして片時も手放さずに持ち歩かないの?
とっくに新規契約はした。
24時間いつでも?そんな金誰が出すの?
糸井。こんな事に使わずに、人助けにでも使えばいいのにな。
金が余ってるんだろう。
なんで新車に乗り換えないの?
その内、乗り換えたい。
住所も知られていて、家の中に監視カメラがつけられているし、
なんで引越しないの?
なんで監視カメラを取り除かないの?
なんで外泊しないの?
なんでセキュリティの穴をふさがないの?
なんでノートPCやネットブックにして片時も手放さずに持ち歩かないの?
携帯電話も全てが盗聴されて筒抜けになっているし、
なんで新規契約にして片時も手放さずに持ち歩かないの?
外に出かければ雇われた業者につけまわされる。
24時間いつでも?そんな金誰が出すの?
車の中にも盗聴器があるだろうし、
なんで新車に乗り換えないの?
はっきり言うとね、迷惑なんですよ。しばらく前からログが元増田のわけわかんない日記でどんどん埋まっていく。
掲示板のアドレスなんて、知らない人には教えようがないし、知っている人は教えようとしていない。
ネットの向こうの誰かに呼びかけるにしても、「ハッキングされたパソコン」で呼びかけたら相手に筒抜けだし、
万が一、誰かが教えてあげてもいいかなと思っても、この執拗な書込み見たら「かかわらないほうがいいかも」と引くよ。
Tomcat上のJRubyから呼んだJavaプログラムから呼び出し元のJRubyの環境(Runtime)を使いたいときにどうすればいいのか?
方法が1つわかったのでメモ。
(追記2:こんなめんどいことしなくてもJRuby.runtimeで取れたみたい)
イメージ的には以下の感じ
↑↓
↑
JRubyは1.4.0、jruby-rack.jarは0.9.7、warblerは1.0.1
まずは必要なクラスをimport
import org.jruby.Ruby; import org.jruby.rack.PoolingRackApplicationFactory; import org.jruby.rack.RackApplication; import org.jruby.rack.RackServletContextListener;
ServletContextをどっかから取ってくる(Listener作ってfieldに埋めるとかして)(追記:$servlet_contextで取れる[JRuby-Rack使うから])
ServletContext context;//=~~~
warblerでwar化するとweb.xmlにRailsServletContextListener(extends RackServletContextListener)が登録される。
そのListener起動時にFactoryがServletContextに登録されるので、それを取得する
PoolingRackApplicationFactory factory = (PoolingRackApplicationFactory)context.getAttribute(RackServletContextListener.FACTORY_KEY);
PoolingRackApplicationFactoryのapplicationPoolを取ってくる
(protected fieldなのでリフレクションを使用)
Field poolField = factory.getClass().getDeclaredField("applicationPool"); poolField.setAccessible(true); Queue<RackApplication> pool = (Queue<RackApplication>)poolField.get(factory);
RackApplication ap = pool.peek(); Ruby ruby = ap.getRuntime();
呼び出しもとのJRuby環境を使ってRubyコードを実行できる
ruby.evalScriptlet("p 'test'");
ほんと、そのへんが、プログラマの領域だと思う。
俺はそうは思わない
コンパイラの賢さを考えると、人間が注力すべきは、プログラム全体のアルゴリズムであって、姑息な最適化じゃない
コンパイラが出力するコードは、人間が書くコードよりも、圧倒的に賢い
まず、基本ブロックの入れ替えが起るような、大域的な最適化は、手じゃ絶対に無理
例えば Lazy Code Motion (PLDI '92) を手でできる人はいないだろうし
partial redundancy elimination が扱っている冗長性を理解している人すら、あまりいないだろう
それに、局所的な最適化でもコンパイラ(を書いた人)のほうが賢い(ハードウェアに詳しい)
ターゲットマシンが x86 で、レジスタを0で初期化するときに、gcc で最適化オプション付けると
xorl %eax, %eax
ってなるけど
subl %eax, %eax
でも
movl $0, %eax
でも無く、xor が一番速い理由を知ってるやつとか、なかなかいないだろう
なんかスゲー話題になってるみたいなので、一応サポートで飯を食ってる人間として(上の例で言えば、オペレーターが相談してる上司か社員にあたる立場になる)一枚噛んでみる。
未熟なサポートと困ったユーザーはどうしたって無くならない訳で。サポート屋としては、実は元記事のような客はそんなに困らない。
対応の巧拙はあっても結局は同じ結果になったはずだし、後日素直にリセット処理にも応じてる。「気が動転してました」と自分の非についてもある程度反省しているようだし。(ただ、散々ごねた上に「法務を出せ」とまで言い、ブログでdisった挙句に勘違いでした…・・・って逆に訴えられても仕方ないレベルじゃないか?)
一番厄介なのが、ブコメに見られる中途半端に知識をかじったワナビーども。
コイツラは何かと言うとゴチャゴチャ話をややこしくする。初期化すれば済むだけの話を「そもそもIMAPとは(キリッ)」なんて言い出すから始末に終えない。いいから初期化しろよ!そうすりゃ直るんだから!
さて、まずは元記事の症状からざっくりと問題を判別してみよう。
8/31 22:00過ぎから、i.softbank.jpへの接続ができなくなりました。エラーメッセージは「ユーザ名またはパスワードが正しくありません」なのですが、IMAPアクセスしているiPhone側もPC側もユーザ名もパスワードも変更していないので、急にこの挙動になってしまったのが理解できませんでした。
アカウント情報を削除して登録しなおしてみたり、MySoftbankでメールアドレスやパスワードを変更してみても症状は全く変わりませんでした。その後、自分のi.softbank.jpにメールを送ってみると、
550 Invalid recipient:
でメールが戻ってきていることが判明しました。受取先が無効ですエラーってことは、アドレスが存在していない扱いになってしまっています。しかし、MySoftbankにはログインできていることから、
iPhoneの端末側の問題ではなく、IMAPサーバ側の問題である
という見解に至りました。
じぶんの経験で言えば、ユーザー側でここまで切り分けてくれた時点で御の字であるw有償サポートでも、いや、だからこそか、ここまでやってくれる人はいない。
"MySoftbank"のアカウントとメールのアカウントが同一であるかは分からないが、IMAPサーバ「側」の問題(iPhone本体ではない、という意味)であることは確かだ。
ところで、"550 Invalid recipient:"のエラーはIMAPではなくSMTPのエラーである。
これが、例えばSMTPは問題ない、つまり「送信できるけど受信できない」状態であればIMAPサーバーが悪いと言える。
しかし「送信できない」となると、IMAPは全く関係がない。
理由については「IMAP」でぐぐると最初のページに出てくる記事だがこのページ辺りを参考にして欲しい。
あと、設定方法をぐぐってみると、
IMAPサーバーとSMTPサーバーは別になってるようなので、「IMAPサーバー」の問題ではないことも容易に分かる。
つまりどういうことかというと、メールアカウント自体が消えてしまっているか、ロックされているか、見えなくなっているかということ。
加えて言えばSMTPサーバーも被害者の可能性があり、アカウントを管理しているLDAPサーバーのようなものが原因だった可能性のほうが高い。
したがって
iPhoneの設定確認やリセット処理など一通り試てもらった後、iPhoneを復元してみますとのこと。復元後メール設定をしてみると、なぜかメール受信ができるようになってました。
とアカウントをリセットするのはマニュアルどおりのテキトーな処置ではなく、むしろ論理的な問題判別に基づいたアクションといえる。「なぜか」じゃねーよw
関連記事を見ると、同じ症状の方もいるようだ。
あと「IMAPならPCでもiPhoneでもできるはず」っていう意見に対する反論はこの辺の記事が参考になる。
ここまで分かれば、ブコメのIMAP厨(笑)がいかに見当違いなことを言ってるかが分かると思う。
「IMAP」という言葉に過剰反応して問題が見えなくなってる。
覚えたての言葉を使いたがる子供ですか?IMAP言いたいだけちゃうんかと。
最後にブクマのバカなコメントに突っ込んでおこう。こういう輩を放っておくと、第二第三の被害者が出かねないからな!サポート的な意味で!
http://b.hatena.ne.jp/entry/d.hatena.ne.jp/iwa/20090904/1252016930
「良く分からん」のに「鯖側ちょいと直せば済む」と言い切るエスパーぶり!具体的にどこをどう「直せば」いいんですか?
「メールプロトコルの話」ではないでしょ、プロトコル以前のサーバー側の問題なんだからw知ったか乙www
b:id:mnemo プロトコルの問題なのに PC という語に過剰反応する、このサポートレベルのぶこめが多くてびっくり。
プロトコル以前の問題なのに IMAP という語に過剰反応する、このサポートレベル以下のぶこめにびっくりwww
b:id:noraora サポート外もなにも、IMAPなんだから今まで正常だった機能が使えないってことはPC、iPhone関係なしにIMAPサーバ側の問題だろ
IMAP(キリッ)だっておwww
b:id:sy0ta PCでアクセスするのはおかしいとかコメントしてる人は頭おかしいの?PCからIMAPでアクセスしておかしくなるってことは、それはIMAPじゃないってことだろ。できて当たり前のことをサポート外と言い切る姿勢がおかしい。
日本語でおk。どこにIMAPをフルスペックでサポートする、なんて書いてあるんですかwwwそもそもIMAPが悪いなんて誰も言ってねーしwww
b:id:hirok73 わかんないので詳しい人教えてください:iPhoneでしか読めない(特定のMUAでしか読めない)状態でIMAP対応と名乗るのはありなの?
どこの公式情報に「IMAP対応」なんて書いてある?あとRFCをフルスペックでサポートしてないMUA、MTAなんていくらでもあるよw代表的なのがoutlook様だw
もちろんブコメもバカな意見ばっかりじゃなくて、まともな意見もある。
b:id:maakunh iPhoneのアカウント設定が壊れていたのかな?壊れた状態で何度もアクセスすることで、サーバ側で不正アクセスと判断され、アカウントロックされたとか・・・
b:id:z0rac ん?それIMAPの問題じゃなくメールボックスがアクセス不能になってる。/つうかアカウント消えてね?
サポートの立場としては、「こういうことが起こってる可能性が高い」と説明し、コンセンサスを取った後初期化処理を行うべきだった。その点では、お互い不幸な事件ではあったのだ。
C++ の std::list にデフォルトコンストラクタが無いclassを使おうと思って気づいたのだけれど、コピーコンストラクタとか代入演算子を定義してやらないと駄目なのかな。
いやまぁ、それで動くんだからいいじゃんという話とか、ポインタにして自分で new すればいいじゃんというのもあるのだけれど、
class hoge { public: hoge(int dummy); hoge(const hoge &other); private: char buffer[1000]; }; std::list<hoge> hogeList; </pre>とか定義してる時に、
hogeList.push_back(hoge(0));って書いた時、auto変数の領域かなにかに領域が確保されて、hoge(int dummy) が呼び出されて何かの初期化が一回入って、その後、hogeListが確保した領域に、コピーコンストラクタでその値が上書きされるということになって、ぶっちゃけ最初のhoge(int dummy)呼び出しは無駄なんじゃないかなーというか、なにやらでかいバッファを持ってる奴とかだったら、それが全部copyされると考えるとなんか無駄だなーとか細かいことが気になった。
で、これでコピーコンストラクタを呼び出されないようにする方法っていって自分が考え付いたのは、
std::list<hoge *> hogePointerList; </pre>として、自前で new するってのなのだけれど、まぁアレですよ。できれば自前で new とかしないですむ「俺楽チン」なステキ手法はないものか、と愚痴ってみただけです。ハイ。
つか、それくらいやりかたありそうなもんだけど、無いのかなほんとに。そういうもん?
一応試してみたcodeはこんなん。
#include <stdio.h> #include <list> class hoge { public: hoge(int dummy); hoge(const hoge &other); private: char buffer[1000]; }; hoge::hoge(int dummy){ printf("hoge initialized. this: %p\n", this); } hoge::hoge(const hoge &other){ printf("hoge copyed. this: %p\n", this); } int main(int argc, char *argv[]){ std::list<hoge> hogeList; hogeList.push_back(hoge(0)); return 0; } </pre>結果はこんなん。
hoge initialized. this: 0x22c8c0 hoge copyed. this: 0x6c0210で、蛇足的に、
hogeList.push_back(0);みたいな書き方をしてみたら、
hoge initialized. this: 0x22c8c0 hoge copyed. this: 0x6c0210となった。あぁ、これは
hogeList.push_back(hoge(0));に読み替えてくれたんだね。賢いなぁC++は。
ということで、hoge(int dummy) の方に explicit をつけてみたら、muchするfunctionが無いよとcompile errorした。まぁそうだよねぇ。
なんかPerlのblessっぽい。
JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)
というよりperlのnewっぽい。なぜか。
classでクラスを定義してnewでインスタンスを生成する言語を「一般的オブジェクト指向言語」とすると、
つまり、javascriptでnewを(直接)使わず、class(のようなもの)を作ればperlっぽくなる。
オブジェクトを作る。オブジェクトを作るには3つの動作が必要である。
通常は言語仕様でこれらを行う"new"という命令が用意されている。しかし、必ずしも必要な物ではない。perlでは言語仕様としてはnewが用意されていない。new関数が存在するのはコーディング規約に従っているからに過ぎない。代わりにblessが用意されている。なぜこのようになっているのか。理由はいたって簡単だ。perlのオブジェクトの実態はリファレンスだ。初期化を行うコンストラクタはどの道定義せねばならない。だから必要なのはリファレンスとパッケージを結びつけるおまじないblessだけだ。コンストラクタで好きなリファレンスを用意し、好きなように初期化してblessすればよい。コンストラクタの名前はコーディング規約でnewと決めた。一方javascriptはnewを用意した。{}でオブジェクトは作れるし、どの道コンストラクタは作る必要があるのに。
オブジェクトとクラスを結びつける。しかし、javascriptはクラスを持たないので必要はない。代わりに必要なのは、継承元との結びつき、プロトタイプチェーンの構築だ。
既存のクラスの性質や振る舞いを流用する。default状態を与える。一般的オブジェクト指向言語ではクラス定義時に継承元となるクラスを指定する。javascriptではクラスの代わりにオブジェクトを指定する。
クラスとはオブジェクトの性質・振る舞いの定義だ。しかし、ダック・タイピングではオブジェクトの性質や振る舞いはオブジェクトの持つメンバにより決まるため、そのような環境ではオブジェクトに初期値と継承関係を与えるのが主な仕事となる。
コンストラクタはオブジェクトの初期化を行う。javascriptではクラスがないため継承とコンストラクタによりオブジェクトが初期化される。
var object = function(o) { var F = function() {}; F.prototype = o.prototype; return new F; };JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)
個人的には
var object = function(o) { var F = function() {}; F.prototype = o; return new F; };
で良いんじゃね?って思う。
更に、コレでは初期化しないから
var object = function(o, n) { var F = function() {}; F.prototype = o; f = new F; if (n) for (var i in n) f[i] = n[i]; return f; };
みたいな。
さらにせっかくだからメソッドにして
var object = function(o, n) { var F = function() {}; F.prototype = o; f = new F; if (not f.inherit) f.inherit = function(n) {object(this, n)}; if (n) for (var i in n) f[i] = n[i]; return f; };
とか。
爆発の基準点はわからないが、男は一度爆発したら初期化されて全部忘れる、女は爆発しても多少圧縮されるだけで初期化されずスタックは積み上がり続ける、といった感じかと。
諸氏は、下記のような事をどうしているのだろうか。
・ただし、時刻の登録にマウスを操作するような煩雑さは、断じて許容できない
・常駐すんなボケ
とりあえず、if文なんて高尚なものを使ったことなかったけど、バッチファイルでやってみた。
@echo off REM 1-31の日付でしか登録できない低能アラーム REM 時刻は必ず入力されるものとみなす REM よって、組み合わせはDAY×MESGのみで考える。 REM 変数の初期化 SET yotei_day = 0 SET yotei_mesg = "" SET /P yotei_time="アラームを表示する時刻 :" SET /P yotei_day="アラームを表示する日付(1-31で指定、省略した場合は今日) :" SET /P yotei_mesg="表示するメッセージ(省略時は、予定チェック) :" REM 条件分岐。バッチのelseはしょぼすぎる。複数条件指定できない?? if "%yotei_day%" == "0" goto :NO_DAY if "%yotei_mesg%" == "" goto :NO_MESG REM 指定したもの -> DAY,MESG echo %yotei_day%日の%yotei_time%に通知します' at %yotei_time% /NEXT:%yotei_day% net send pc_Name "%yotei_mesg%" goto :SLEEP :NO_DAY REM 分岐: + NO_MESG if "%yotei_mesg%" == "" goto :NO_MESG_NO_MESG REM 指定したもの -> MESG echo 次の%yotei_time%'に通知します' at %yotei_time% net send pc_Name "%yotei_mesg%" goto :SLEEP :NO_MESG REM 分岐: + NO_DAY if "%yotei_day%" == "0" goto :NO_DAY_NO_MESG REM 指定したもの -> DAY echo %yotei_day%日の%yotei_time%に通知します' at %yotei_time% /NEXT:%yotei_day% net send pc_Name "予定チェック" goto :SLEEP :NO_DAY_NO_MESG REM 指定したもの -> なし(時刻のみ) echo %yotei_day%日の%yotei_time%に通知します' at %yotei_time% net send pc_Name "予定チェック" goto :SLEEP REM 終了 :SLEEP ping 127.0.0.1 -n 2 > nul:
これに適当な名前をつけて、ランチャのfenrirで起動させる。
キーボードのみの操作で済むので、とても快適ではあるものの、見ての通りnet sendを使うため、
Windows messenger serviceを起動させるという、常駐ソフトの方がマシな本末転倒なウンコーな一品である。
ActiveDirectoryとかグループポリシーでmessenger制限されてたら使えないし。
VBやWSHなら色々できそうだけど、これ以上機能はいらんのよね。いっそ、メッセージはtxtに書き込んで、それを開くだけにするか・・・・。
### しかし「>」を表示させるのに、数値参照文字じゃないとダメとか・・・。
### &#62;を半角にしたら>になりますよっと。。。